3.K均值算法作业

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

第一次,随机选取三个聚类中心K,7,6,随后随机抽取30张进行分类

算平均值,三堆牌平均值分别约为12,7,4,然后重新将牌再次分类,按照距离最小分类

 

 再算平均值,三堆牌平均值分别约为12,7,3,然后重新将牌再次分类

 

 最后算得平均值不变,分类结束

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

  

import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# 选取数据空间中的K个对象作为初始中心,每个对象代表一个聚类中心
def initcenter(data):
    k = int(input("请输入k值"))
    center = np.random.choice(data, k)  # 随机从data里取三个数作为聚点中心
    return center, k
# 对于样本中的数据对象,根据它们与这些聚类中心的欧氏距离
def getnear(x, y):
    dist = np.linalg.norm(x - y)  # 计算欧式距离
    return dist
# 按距离最近的准则将它们分到距离它们最近的聚类中心(最相似)所对应的类, 更新聚类中心:将每个类别中所有对象所对应的均值作为该类别的聚类中心
def nearest(center, k):
    # 循环调用算各个点的欧式距离,并将其存入dist1数组里
    for i in range(n):  #0-149
        for j in range(k): #0-2
            dist1[i, j] = getnear(data[i], center[j]) #算欧式距离
        dist1[i, k] = np.argmin(dist1[i, :k])  # 取dist数组每i行的前k个中的最小值放进dist1[i,k]里
    for i in range(k):
        index = np.where(dist1[:, k] == i)  # 当i等于下标时取出到index
        center_new[i] = np.mean(data[index])  # 计算复制到False平均值复制到数组里做为新的聚合中心
    if (np.all(center == center_new)):  # 判断新聚合中心是否和旧聚合中心相同
        print("聚合分类完毕,最终的聚点为", center_new)
    else:
        center = center_new  # 更新聚合中心
        nearest(center, k)   #递归调用算法
    return dist1
#函数调用
if __name__ == '__main__':
    iris = load_iris() # 导入鸢尾花数据
    data = iris.data[:, 0]  # 取出鸢尾花的花瓣数据
    n = len(data)   # 计算数据的长度
    center, k = initcenter(data)  # 获得center和k
    dist1 = np.zeros([n, k + 1])  # 生成n*k+1的全零矩阵,用作储存距离以及最小距离的下标
    center_new = np.zeros(k)  # 生成一个长度为k的数组聚合中心center_new
    a = nearest(center, k)   #调用函数聚合
# 画散点图
plt.scatter(data, data, c=a[:, k], s=50, cmap="rainbow")
plt.show()

运行结果如图

 

 

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

from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
iris = load_iris() # 获取鸢尾花数据集
iris.keys()
x = iris.data[:,0]  #获取鸢尾花花瓣长度数据
x = x.reshape(-1,1)   #将数据转换为一列数据
# 直接调用sklearn库实现对鸢尾花数据进行聚类分析
km_model = KMeans(n_clusters=3)  # 构建模型 分成三个类
km_model.fit(x)                  # 训练模型
y = km_model.predict(x)          # 预测模型
print("聚类中心:", km_model.cluster_centers_ )
print("预测结果:", y)
# 画图
plt.scatter(x[:, 0], x[:, 0], c=y, s=50, cmap='rainbow')
plt.show()

结果如下图

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

from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
iris = load_iris() # 获取鸢尾花数据集
x = iris.data       # 鸢尾花完整数据
# 直接调用sklearn库的KMeans实现对鸢尾花数据进行聚类分析
km_model = KMeans(n_clusters=3)  # 构建模型
km_model.fit(x)  # 训练模型
y = km_model.predict(x)  # 预测模型中每个样本的聚类索引
print("聚类中心:", km_model.cluster_centers_ )
print("预测结果:", y)
# 画图
plt.scatter(x[:, 2], x[:, 3], c=y, s=50, cmap='rainbow')  #x,y,c
plt.show()

结果如图所示

 

 

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

k均值算法是款无监督学习的聚类算法,我们可以用它来做机器学习,分析和预测,让机器学习通过聚类学习之后,以后出现相类似的东西,它也可以聚类分辨出来,还可以通过聚类来压缩图片。

原文地址:https://www.cnblogs.com/chock/p/12701925.html