如何使car evaluation数据集被kmeans聚类
car evaluation
数据集是hfh免费提供的一个数据集。
我现在通过学习《机器学习实战》这本书,想通过kmeans
对这个数据集进行聚类,发现,因为car数据集是分类数据集,而kmeans聚类算法只能对数值型数据进行聚类。
我的思路是,因为car里面的数据是分类但是有大小关系的所以用pandas
进行映射
size_mapping = {
'low': 1,
'med': 2,
'high': 3,
'vhigh':4,
'5more':5,
'small':1,
'big':3}
但是,该如何将原本的car数据集全部转化成数值类型并导入kmeans里,不清楚了。已经依照书上,敲出了kmeans的程序。
# encoding:utf-8
from numpy import *
import matplotlib.pyplot as plt
def loadDataSet(filename):
dataMat = [] # 创建元祖
fr = open(filename)
for line in fr.readlines():
curLine = line.strip().split(' ')
fltLine = map(float, curLine) # 使用map函数将curLine里的数全部转换为float型
dataMat.append(fltLine)
return dataMat
def distEclud(vecA, vecB): # 计算两个向量的欧式距离
return sqrt(sum(power(vecA - vecB, 2)))
def randCent(dataSet, k): # 位给定数据集构建一个包含k个随机质心的集合
n = shape(dataSet)[1] # shape函数此时返回的是dataSet元祖的列数
centroids = mat(zeros((k, n))) # mat函数创建k行n列的矩阵,centroids存放簇中心
for j in range(n):
minJ = min(dataSet[:, j]) # 第j列的最小值
rangeJ = float(max(dataSet[:, j]) - minJ)
centroids[:, j] = minJ + rangeJ * random.rand(k, 1) # random.rand(k,1)产生shape(k,1)的矩阵
return centroids
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
m = shape(dataSet)[0] # shape函数此时返回的是dataSet元祖的行数
clusterAssment = mat(zeros((m, 2))) # 创建一个m行2列的矩阵,第一列存放索引值,第二列存放误差,误差用来评价聚类效果
centroids = createCent(dataSet, k) # 创建k个质心,调用createCent()函数
clusterChanged = True # 标志变量,若为true则继续迭代
print "质心位置更新过程变化:"
while clusterChanged:
clusterChanged = False
for i in range(m):
minDist = inf # inf为正无穷大
minIndex = -1 # 创建索引
for j in range(k):
# 寻找最近的质心
distJI = distMeas(centroids[j, :], dataSet[i, :]) # 计算每个点到质心的欧氏距离
if distJI < minDist:
minDist = distJI; minIndex = j
if clusterAssment[i,0] != minIndex: clusterChanged = True
clusterAssment[i,:] = minIndex,minDist**2
print centroids
for cent in range(k):
ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]
centroids[cent, :] = mean(ptsInClust, axis=0) # 计算所有点的均值,选项axis=0表示沿矩阵的列方向进行均值计算
return centroids, clusterAssment # 返回所有的类质心与点分配结果
datMat = mat(loadDataSet('car.txt'))
myCentroids, clustAssing = kMeans(datMat, 4)
print "最终质心:\n", myCentroids
print "索引值和均值:\n", clustAssing
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
使用
sklearn
里面的OneHotEncoding,这是最简单的方案。