为了克服K-均值算法收敛于局部最小值的问题,还有一种方法是二分K-均值的算法。该算法首先将所有点作为一个簇,然后将该簇一分为二。之后选择其中一个簇继续进行划分,选择哪一个簇进行划分取决于对其划分是否可以最大程度降低SSE的值。上述基于SSE的划分过程不断重复,直到得到用户指定的簇数目为止。
二分K-均值算法的伪代码形式如下:
将所有点看成一个簇
当簇数目小于k时:
对于每一个簇:
计算总误差
在给定的簇上面进行K-均值聚类(k=2)
计算将该簇一分为二之后的总误差
选择使得误差最小的那个簇进行划分操作
另一种做法是选择SSE最大的簇进行划分,直到簇数目达到用户指定的数目为止:
def biKmeans(dataSet,k,distMeas=distEclud):
m=shape(dataSet)[0]
clusterAssment=mat(zeros((m,2)))
#创建一个初始簇
centroid0=mean(dataSet,axis=0).tolist()[0]
centList=[centroid0]
for j in range(m):
clusterAssment[j,1]=distMeas(mat(centroid0),dataSet[j,:])**2
while (len(centList)<k):
lowestSSE=inf
for i in range(len(centList)):
#尝试划分每一个簇
ptsInCurrCluster=da

最低0.47元/天 解锁文章
434

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



