机器学习三 —— 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])
centerNew = np.zeros([k])
for i in range(k):   #避免开头时有一样的中心
    for j in range(n):
        if pl[j] in center:
            continue
        else:
            center[i] = pl[j]
            break

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
        centerNew[i] = np.mean(pl[index])

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

plt.scatter(pl,pl,c=dist[:,k],s=60, cmap='rainbow')
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算法可以用来区分鸢尾花的种类,在现实生活中,也可以对人的体重身高等数据来划分不同身体状况的人群,高矮胖瘦等,也可以通过文学作品的篇幅来分类短篇、长篇作品。

猜你喜欢

转载自www.cnblogs.com/xiaoAP/p/12704464.html