聚类属于无监督学习。周志华老师在《机器学习》一书中详细讲解了各种聚类算法,如k均值、学习向量量化、高斯混合聚类等。在这篇博客中,我根据周志华老师描述的算法步骤,用Python实现了 k均值算法。具体代码如下:
import pandas as pd
import numpy as np
import random
import matplotlib.pyplot as plt
#首先从数据集中读入数据
midu = []
hantanglv = []
df = pd.read_excel('西瓜数据集4.0.xlsx')
for i in df.index.values:
midu.append(df.ix[i].values[1])
hantanglv.append(df.ix[i].values[2])
m = len(midu)
def distance(x1, y1, x2, y2):
return ((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))**0.5
def kMeans(x):
m = 0
h = 0
for i in x:
m = m + i[0]
h = h + i[1]
return m/len(x), h/len(x)
#按照书上所讲,将聚类簇数定义为3
k = 3
#用flag表示均值向量有没有更新
flag = k
#选择k个样本作为均值向量
u = random.sample(range(0, m), k)
U = []
for i in u:
U.append((midu[i], hantanglv[i]))
#开始迭代
while flag==k:
C = []
flag=0
for i in range(k):
C.append([])
for i in range(m):
#使用欧式距离
everyDistance = [distance(midu[i], hantanglv[i], j[0], j[1]) for j in U]
C[everyDistance.index(min(everyDistance))].append((midu[i], hantanglv[i]))
for i in range(k):
mk, hk = kMeans(C[i])
if U[i][0] != mk or U[i][1] != hk:
U[i] = (mk, hk)
flag = flag + 1
#将聚类结果可视化出来
co = ['r', 'g', 'b', 'm']
for i in range(k):
mm = [a[0] for a in C[i]]
hh = [a[1] for a in C[i]]
plt.scatter(mm, hh, color=co[i%len(co)])
plt.scatter(U[i][0], U[i][1], marker='x')
plt.show()
采用的数据集是西瓜数据集4.0:

最终聚类结果如下图所示:

因为初始均值向量是随机生成的,所以每次的聚类结果都不太一样。
1581

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



