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均值算法。


posted @ 2020-04-15 10:11  皎月星辰  阅读(260)  评论(0编辑  收藏  举报