机器学习实验之K—Means均值聚类
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
机器学习实训实验报告(五)
专业班级学号姓名
实验项目名称:K—Means均值聚类
实验内容:
1、了解K均值聚类的支持函数,以及如何选取质心。
2、理解K均值聚类的定义,熟悉其算法过程。
3、根据书P202表4.4的数据,选取不同K值,对其进行聚类,下是部分数据:
实验过程:
算法分析:
K—Means的一般步骤:
1、在数据集中,随机地选择k
个对象,每个对象代表一个簇的
初始均值(中心);
2、对剩下的每个对象,分别计算
其与各个簇中心的欧式距离(事
实上就是计算相似性),将它分配
到最相似的簇;
3、更新簇中心。对于每个簇来说,
就是根据簇中的当前对象,来重
新计算每个簇的均值,然后把该
均值作为新的簇的中心。
4、然后重复第2,3步直至分配稳
定。
算法伪代码(简):
创建k个作为起始质心(通常是
随机选择)
当任意一个点的簇分配结果发生
改变时
对数据集中的每个数据点
对每个质心
计算质心与数据点
之间的距离
将数据点分配到距离其
源程序代码:
from numpy import *
#函数说明:数据加载处理
def loadDataSet(fileName):
dataMat = [] #存放数据的矩阵
fr = open(fileName)
for line in fr.readlines(): #按行遍历文档
curLine = line.strip().split('\t') #对数据进行分割处理
fltLine = list(map(float,curLine)) #数据全部转化为float类
型
dataMat.append(fltLine) #插入数据
return dataMat
#函数说明:计算欧式距离
def distEclud(vecA, vecB):
return sqrt(sum(power(vecA - vecB, 2)))
#函数说明:生成初始的质心
def randCent(dataSet, k):
n = shape(dataSet)[1] #计算数据的列数赋予n
centroids = mat(zeros((k, n))) #初始化质心矩阵为0
for j in range(n): #遍历每一列
minJ = min(dataSet[:, j]) #找到第j列最小值
rangeJ = float(max(dataSet[:, j]) - minJ) #求第j列最大值
与最小值的差
centroids[:, j] = minJ + rangeJ * random.rand(k, 1) #生成k
行1列的在(0, 1)之间的随机数矩阵
return centroids
运行结果:1、k=3时
2、k=4时
3、k=5时
实验总结:
本节实验加深了我对聚类的认识,让我更加熟悉了K均值聚类的算法思想,但是只是对单个的计算了解了,但是对于代码中的全部的数据转化为矩阵进行矩阵的运算而言,这方面它内在是如何计算的却是不太清楚,本实验对于结果仍有以下疑问:clustasing部分展现出来的结果,看上去像是计算的值超出范围(过小?、代码公式问题?),不太明白得出的结果是否正确,如果正确其意义是什么。而如果错误,又是什么地方错误。
实验成绩评定
评分小项分值得分总分:
1.实验报告格式排版10分
2.实验设计思路(科学性、可行性、创新性) 30分
3.实验代码编写(规范性、正确性、复杂性) 30分
4.实验结果分析(正确性、合理性) 20分
5.实验心得总结10分