3.K均值算法
1.扑克牌手动演练k均值聚类过程:>30张牌,3类
过程:
选择3个初始中心;
对牌进行分类,按照欧氏距离(即所分的该牌离不同中心的距离的绝对值大小)进行分类。
在第一轮分牌结束后,对每一组牌进行计算其平均值,以每组的平均值作为下一次的中心(即分牌的依据)
重复上述的步骤,直至聚类中心的值不再改变。即为成功。
2.*自主编写K-means算法 ,以鸢尾花花瓣长度数据做聚类,并用散点图显示
import numpy as np from sklearn.datasets import load_iris import matplotlib.pyplot as plt # 初始聚类中心数组 # 选取数据空间中的K个对象作为初始中心,每个对象代表一个聚类中心; def initcenter(x, k): # 选择后k个样本作为初始类中心(因为是只采用一组特征或数据进行聚类) return x[-k:] # 计算欧式距离 def nearest(kc, i): dist = abs(kc - i) #距离绝对值 m = np.where(dist == np.min(dist)) # 返回w=(array([0], dtype=int32)) # w[0][0] # 0 # w[0] # array([0], dtype=int32) return m[0][0] def xclassify(x, y, kc): for i in range(x.shape[0]): # 对数组的每个值分类(以一列数据作为测试的数据) y[i] = nearest(kc, x[i]) return y # 更新聚类中心:将每个类别中所有对象所对应的均值作为该类别的聚类中心,计算目标函数的值; def kcmean(x, y, kc, k): center = list(kc) flag = False for i in range(k): index=y==i new_center = np.mean(x[index]) if np.all(center[i] != new_center): center[i] = new_center flag=True # 聚类中心发生变化 return (np.array(center),flag) # 获取鸢尾花数据集 iris = load_iris() n = len(iris.data) # 鸢尾花花瓣数据的长度 x = iris.data[:, 2] # 获取花瓣长度 y = np.zeros(n) # 初始化数组 k = 3 kc = initcenter(x, k) flag = True while flag: y = xclassify(x, y, kc) kc, flag = kcmean(x, y, kc, k) print("聚类结果:", y) plt.scatter(x, x, c=y, s=50, cmap='rainbow') plt.show()
结果:
3.
from sklearn.datasets import load_iris from sklearn.cluster import KMeans import matplotlib.pyplot as plt # 获取鸢尾花数据集 iris = load_iris() x = iris.data[:, 2].reshape(-1, 1) # 鸢尾花花瓣长度数据
# 直接调用sklearn库实现对鸢尾花数据进行聚类分析 model = KMeans(n_clusters=3) # 构建模型 model.fit(x) # 训练 y = model.predict(x) # 预测每个样本的聚类索引 print("预测结果:", y) kc = model.cluster_centers_ # 聚类中心 print("聚类中心:", kc) 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库实现对鸢尾花数据进行聚类分析 model = KMeans(n_clusters=3) # 构建模型 model.fit(x) # 训练 y = model.predict(x) # 预测每个样本的聚类索引 print("预测结果:", y) kc = model.cluster_centers_ # 聚类中心 print("聚类中心:", kc) plt.scatter(x[:, 2], x[:, 3], c=y, s=50, cmap='rainbow') plt.show()
实验结果:
5).想想k均值算法中以用来做什么?
k均值算法主要是用于分类的一种算法,通过在一份杂乱的数据中,把相类似的数据放在一起,形成多个类别。可用于AI 机器人的基础学习,如通过汽车的外型可以对汽车的品种进行判断,以及各种汽车零件的价格判断;
也可以开发帮助盲人的日常出行的AI机器人,通过对所遇到的人,物品,路况,上下楼梯等情况的学习。等等,这些学习均需要应用到K均值算法。