机器学习三 —— K均值算法

1). 扑克牌手动演练k均值聚类过程:>30张牌,3类

这里选了40张牌,随机抽取三张牌并以其各自点数作为类中心,第一次是 2   6    9

 

每次的分类依据就是点数离那个中心近,近就分类到该分类下。第一次分完类,在计算各分类的中心值(该类所有数字求均值),重新得出三个类中心,第二次分类如下

 再重复上面的计算步骤,直到类中心不再变动。具体结果如下表所示:

2). *自主编写K-means算法 ,以鸢尾花花瓣长度数据做聚类,并用散点图显示。(加分题)

import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

iris = load_iris()
pl = iris.data[:,2]
n = len(pl) #样本个数
k = 3 #中心个数
dist = np.zeros([n,k+1]) #初始化一个矩阵
center = np.zeros([k])
center = pl[:k]
centerNew = np.zeros([k])

while(True):
for i in range(n):
for j in range(k):
dist[i,j] = np.sqrt((pl[i]-center[j])**2) #计算距离
dist[i,k] = np.argmin(dist[i,:k])

#计算新的中心
for i in range(k):
index = dist[:, k] == i
if sum(pl[index]) == 0:
centerNew[i] = center[i]
else:
centerNew[i] = np.mean(pl[index])

#如果前后两次中心相等则跳出,否则继续
if np.all((center == centerNew)):
break
else:
for i in range(k):
center[i] = centerNew[i]

plt.rcParams['font.sans-serif']=['SimHei']
plt.scatter(pl,pl,c=dist[:,k],s=60, cmap='rainbow')
plt.xlabel("鸢尾花花瓣长度")
plt.ylabel("鸢尾花花瓣长度")
plt.show()

  结果出来后不是很理想,后续再去寻找问题改进,结果如下:

3). 用sklearn.cluster.KMeans,鸢尾花花瓣长度数据做聚类,并用散点图显示.

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris

iris = load_iris()
pl = iris.data[:,2]
x = pl.reshape(-1,1)
est = KMeans(n_clusters=3)
est.fit(x)

y_kmeans = est.predict(x)
plt.scatter(x[:,0],x[:,0],c=y_kmeans,s=50, cmap='rainbow');
plt.show()

  

4). 鸢尾花完整数据做聚类并用散点图显示.

irisData = iris.data
KMeans_model = KMeans(n_clusters=3)
KMeans_model.fit(irisData)
pre = KMeans_model.predict(irisData)
plt.scatter(irisData[:,2],irisData[:,3],c=pre, s=50, cmap='rainbow')
plt.show()

  

5).想想k均值算法中以用来做什么?

k均值算法是一种无监督的分类算法,主要通过大量的特征数据,来做类别的区分,如上面的题,KMeans算法可以用来区分鸢尾花的种类,在现实生活中,也可以对人的体重身高等数据来划分不同身体状况的人群,高矮胖瘦等,也可以通过文学作品的篇幅来分类短篇、长篇作品。

原文地址:https://www.cnblogs.com/xiaoAP/p/12704464.html