一、准备:k-Means算法是用Python来实现的,要显示出正态分布数据及其散点图,我们首先要先安装两个安装包,一个是numpy,另一个是matploylib,这两个安装包都在Python文件夹下可以找到。
1.numpy安装
之前我们已经下载安装好了Python并将它保存到了C盘,现在我们只需要找到Python27文件夹下的Scripts文件夹,将Scripts这个目录拷贝下来,然后“右击计算机--属性--高级系统设置--环境变量--系统变量--path--编辑”,将刚才的路径粘贴进去。
设置好环境变量之后,需要安装另外一个东西,叫做pip,pip就在python自己的目录下的一个叫做Scripts的文件夹里,点开这个文件夹并复制路径到cmd,并输入python -m pip install -U pip,然后等待安装,安装成功就会提示successfully installed.
2.matplotlib安装
和numpy一样,matplotlib也是用pip来安装,进入cmd窗口下,执行python -m pip install -U pip setuptools进行升级,接着键入python -m pip install matplotlib自动进行安装,系统会自动下载安装包,pip会下载其他的关联安装包,并完成最终的安装。
最后,如果安装成功就会提示successfully installed.
到这里,我们的准备工作就完成了,接下来就是实现算法。
二、要求:我们要求用正态分布生成数据并显示出数据,用kMeans算法进行聚类,并将聚类结果表现在散点图上,要求在200次以内算法要终止。
算法流程如下:
1.创建k个点作为起始质心(这里以k=2为例);
2.当任意一个点的簇分配结果发生改变时,对数据集中的每个数据点、对每个质心,计算质心与数据点之间的距离;
3.将数据点分配到距其最近的簇中;
4.对每一个簇,计算簇中所有点的均值并将均值作为质心;
5.判断新的质心与上一个质心的骗鬼量是否为0,如不为0,求出的质心取代原来的质心;若为0,迭代终止;
6.将结果显示出来。
该过程的代码如下:
import numpy
import pylab as pl
import matplotlib.pyplot as plt
plt.figure(1)
plt.figure(2)
x1 = numpy.round(numpy.random.normal(1,1,100),2)
y1 = numpy.round(numpy.random.normal(120,5,100),2)
x2 = numpy.round(numpy.random.normal(3,0.4,100),2)
y2 = numpy.round(numpy.random.normal(120,2,100),2)
a=[] #存入数据
b=[]
for i in x1:
a.append(i)
for i in x2:
a.append(i)
for i in y1:
b.append(i)
for i in y2:
b.append(i)
print '随机产生的正态分布的数据为:', list(zip(a,b)) #输出随机产生的正态分布的数据
def cal_distance(a, b): #计算两点的距离
return (a[0]- b[0]) ** 2 + (a[1] - b[1]) **2
k1=[1,120]
k2=[3,120]
clu_k1 = [] #划分两个聚类
clu_k2 = []
while True:
clu_k1 = []
clu_k2 = []
for i in range(200):
ab_distance1 = cal_distance(k1, [a[i], b[i]])
ab_distance2 = cal_distance(k2, [a[i], b[i]]) #计算每个样本到聚类中心的距离
if (ab_distance1 <= ab_distance2):
clu_k1.append(i)
else:
clu_k2.append(i) #每个样本归于更近的聚类中心
k1_x = sum([a[i] for i in clu_k1]) / len(clu_k1)