1 K-means算法
k-means: 是基于距离的聚类算法,通过选择质心并
计算样本与其之间的距离,然后不断更新质心位置和迭代来完成不同类别的相聚。该算法采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。
2 K-means的应用场景和优缺点
应用场景:
优点:1)解决聚类问题的经典算法,简单、快速;2)当处理大数据集时,该算法保持可伸缩性和高效率 ;3)当簇近似为高斯分布时,它的效果较好
缺点:1)在簇的平均值可被定义的情况下才能使用,可能不适用于某些应用 ;2)必须实现给出k(要生成簇的数目),而且对初值敏感,即对于不同的初值,可能会导致不同结果 ;3)不适合非凸形状的簇或者大小差别很大的簇 ;4)对噪声和孤立点敏感
3 计算流程
1)在一组数据中首先,随机确定k个初始点作为质心;2)然后计算数据待每个质心的距离,将距离质心较近的数组化为一组;3)将每个簇的质心更新为该簇所有点的平均值;4)重复2,3两步,如果质心不再变化或者说变化很小,退出循环。
4 具体历程
4.1 简单的数据分类
from numpy import *
'''
#载入数据函数
# fileName :载入数据的路径
'''
def loadDataSet(fileName):
dataMat = []
fr = open(fileName) #将一行数据按照空格切分
for line in fr.readlines():
curLine = line.strip().split('\t') #将一行数据按照空格切分
fltLine = map(float,curLine) #转换成浮点型数据
dataMat.append(fltLine) #将数组拼接到一起
return dataMat #返回读取的数据
'''
#计算两个向量的欧氏距离
# vecA :向量A
# vecB :向量B
'''
def distEclud(vecA, vecB):
return sqrt(sum(power(vecA - vecB, 2))) #欧氏距离的值
'''
#为给定数据集构建一个包含k个质心的集合
# dataSet :数据集
# k :k个质心
'''
def randCent(dataSet, k):
n = shape(dataSet)[1] #矩阵的列数
centroids = mat(zeros((k,n))) #创建k个质心矩阵
for j in range(n): #查找每列
minJ = min(dataSet[:,j]) #查询每列的最小值
rangeJ = float(max(dataSet[:,j]) - minJ) #每列最值差范围
centroids[:,j] = mat(minJ + rangeJ * random.rand(k,1)) #产生k个行的数
return centroids #返回k个质心
'''
#k-means算法
# dataSet :数据集
# k :k个质心
# distMeas :计算距离
# createCent :创建初始的质心
'''
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
m = shape(dataSet)[0] #读取数据的长度
#创建矩阵存储每个簇的分类结果,一列是簇的索引,一列是存储误差
clusterAssment = mat(zeros((m,2)))
#创建k个质心
centroids = createCent(dataSet, k)
#标志变量,判断循环是否继续进行
clusterChanged = True
while clusterChanged:
clusterChanged = False
for i in range(m):
minDist = 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)
return centroids, clusterAssment # 返回质心和分类结果
本例程实现简单的数据分类,不过数据k-means计算的距离等之前已经有所叙述,它的改进之处也很多在此就不加详述了。
1585

被折叠的 条评论
为什么被折叠?



