December 13, 2015 6:45 PM
聚类分析是一种静态数据分析方法,常被用于机器学习,模式识别,数据挖掘等领域。通常认为,聚类是一种无监督式的机器学习方法,它的过程是这样的:在未知样本类别的情况下,通过计算样本彼此间的距离(欧式距离,马式距离,汉明距离,余弦距离等)来估计样本所属类别。从结构性来划分,聚类方法分为自上而下和自下而上两种方法,前者的算法是先把所有样本视为一类,然后不断从这个大类中分离出小类,直到不能再分为止;后者则相反,首先所有样本自成一类,然后不断两两合并,直到最终形成几个大类。
Kmeans聚类是一种自下而上的聚类方法,它的优点是简单、速度快;缺点是聚类结果与初始中心的选择有关系,且必须提供聚类的数目。Kmeans的第二个缺点是致命的,因为在有些时候,我们不知道样本集将要聚成多少个类别,这种时候kmeans是不适合的,推荐使用hierarchical 或meanshift来聚类。第一个缺点可以通过多次聚类取最佳结果来解决。
Kmeans的计算过程大概表示如下随机选择k个聚类中心. 最终的类别个数<= k计算每个样本到各个中心的距离每个样本聚类到离它最近的中心重新计算每个新类的中心重复以上步骤直到满足收敛要求。(通常就是中心点不再改变或满足一定迭代次数)。
以下为分别用python和matlab实现的代码,供大家学习和讨论。
python版本:
#Kmeans.py
#2015.11.08
#Email:wyxidian@gmail.com
from pylab import *
#Display the Chinese
rcParams['font.sans-serif'] = ['SimHei']
rcParams['axes.unicode_minus'] = False
kRange = range(2, 7)#data set of the possible k value,k is the number of class
Length = 500#length of data
x = zeros(Length)
y = zeros(Length)
#Generate date
x[0:100] = randn(1,100)+1
y[0:100] = randn(1,100)+1
x[100:200] = randn(1,100)+6
y[100:200] = randn(1,100)-2
x[200:500] = randn(1,300)+5
y[200:500] = randn(1,300)+10
varResult = zeros(len(kRange))
figure()
plot(x,y,'o')
title('Orignal Data')
#try every possible value of k to classify the data
for k in kRange:
#Initial
Center_x = zeros(k)
Center_y = zeros(k)
Center_x[0] = randn()
Center_y[0] = randn()
Last_Center_x = zeros(k)
Last_Center_y = zeros(k)
Sum_x = zeros(k)
Sum_y = zeros(k)
Num = zeros(k)
index = zeros(Length)
distance = zeros(k)
distCenter = zeros(Length)
#Chose the initial Center_x and Center_y
for i in range(1,k):
for idxDate in range(Length):
distCenter[idxDate] = (Center_x[i-1] - x[idxDate])**2 + (Center_y[i-1] - y[idxDate])**2
sumDisCenter = sum(distCenter)
randDis = randint(0,sumDisCenter)
idx = 0
while randDis-distCenter[idx] > 0:
randDis = randDis-distCenter[idx]