k-means聚类算法对矩阵元素进行分类

实验目的

使用k-means聚类算法对矩阵元素进行分类

实验内容

编写程序,使用k-means聚类方法对已知数据进行聚类,然后对未知样本进行分类。数据自己进行模拟生成,要求为整数,样本个数至少为 100个,类别作为输入参数。
k-means 算法的基本思想:以空间k个点为中心进行聚类,对靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。最终的k各聚类具有以下特点:各聚类本身尽可能紧凑,而各聚类之间尽可能分开。
假设把样本集分为k个类别,算法描述如下:

  1. 适当选择k个类的初始中心。
  2. 在k次迭代中,对任意一个样本,求其到k个中心的聚类,将该样本归到距离最近的中心所在的类。
  3. 利用均值或其他算法更新该类的中心值。
  4. 对于所有的k个聚类中心,如果利用步骤2,3迭代更新后,值保持不变,则迭代结束,否则继续迭代。
    该算法的最大优势在于简洁和快速,算法的关键在于预期分类数量的确定以及初始中心和距离公式的选择。

实验源代码

# 引入数据集,sklearn包含众多数据集
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.cluster import KMeans

import matplotlib.pyplot as plt
import numpy as np

# 引入iris鸢尾花数据,iris数据包含4个特征变量
iris = datasets.load_iris()
iris_X = iris.data  # 特征变量
iris_y = iris.target  # 目标值
# 将数据集划分为20%测试集和80%训练集
X_train, X_test, Y_train, Y_test = train_test_split(iris_X, iris_y,
                                                    test_size=0.2)

num = int(input("请输入聚类的个数K:"))
kmeans = KMeans(n_clusters=num, random_state=None).fit(X_train)
print(kmeans.labels_)
print("样本的聚类中心")
print(kmeans.cluster_centers_)
print("测试集分类结果")
print(kmeans.predict(X_test))

# 通过PCA算法进行数据降维,可以2维显示
reduced_data = PCA(n_components=2).fit_transform(iris_X)
kmeans = KMeans(init="k-means++", n_clusters=num)
kmeans.fit(reduced_data)

# Step size of the mesh. Decrease to increase the quality of the VQ.
h = .02  # point in the mesh [x_min, x_max]x[y_min, y_max].

# Plot the decision boundary. For that, we will assign a color to each
x_min, x_max = reduced_data[:, 0].min() - 1, reduced_data[:, 0].max() + 1
y_min, y_max = reduced_data[:, 1].min() - 1, reduced_data[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

# Obtain labels for each point in mesh. Use last trained model.
Z = kmeans.predict(np.c_[xx.ravel(), yy.ravel()])

# Put the result into a color plot
Z = Z.reshape(xx.shape)
plt.figure(1)
plt.clf()
plt.imshow(Z, interpolation="nearest",
           extent=(xx.min(), xx.max(), yy.min(), yy.max()),
           cmap=plt.cm.Paired, aspect="auto", origin="lower")

plt.plot(reduced_data[:, 0], reduced_data[:, 1], 'k.', markersize=2)
# Plot the centroids as a white X
centroids = kmeans.cluster_centers_
plt.scatter(centroids[:, 0], centroids[:, 1], marker="x", s=169, linewidths=3,
            color="w", zorder=10)
plt.title("K-means clustering on the digits dataset (PCA-reduced data)\n"
          "Centroids are marked with white cross")
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())
plt.show()

结果截图

在这里插入图片描述
在这里插入图片描述

小结

通过调用python的sklearn库中的K均值函数,通过查看其官方文档,了解一些常用的函数和参数设置,通过文档中的参考用例,编写了用sklearn库中自带的数据集Iris,来聚类。但是奇怪的是,并没有发现函数参数中有距离公式的选择,后面查资料,好像是,k-means默认使用欧氏距离,这是算法设计之初的度量基础。原因是算法涉及平均值的计算。其中的n_cluster维聚类的个数,默认为8,init参数为可调用初始化方法,当init=’k-means++’时,模型以智能的方式选择初始化聚类中心加速收敛。后面通过主成分分析方法对数据进行降维,也参考了文档中的例子,将聚类结果图形化展示在2维坐标中。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
k-means聚类算法的公式如下: 1. 随机初始化k个初始聚类中心 2. 将每个数据点分配到最近的聚类中心 3. 更新每个聚类的中心点为该聚类所有数据点的平均值 4. 重复执行步骤2和3,直到聚类中心不再变化或达到预定的最大迭代次数 假设我们有n个数据点,每个数据点的特征为d维向量,我们用矩阵X表示所有数据点,其中每一行是一个d维向量,用k表示聚类的个数。 1. 随机初始化k个初始聚类中心 随机选择k个数据点作为聚类中心,用矩阵C表示,其中每一行是一个聚类中心。 2. 将每个数据点分配到最近的聚类中心 计算每个数据点与所有聚类中心的距离,选择距离最近的聚类中心,将该数据点分配到该聚类中心所在的簇。用矩阵A表示每个数据点所属的聚类簇,其中每个元素是一个整数,表示该数据点所属的聚类簇编号。 $$A_i = \arg\min_j ||X_i - C_j||^2$$ 其中,$X_i$表示第i个数据点,$C_j$表示第j个聚类中心,$||x||^2$表示向量x的平方范数。 3. 更新每个聚类的中心点为该聚类所有数据点的平均值 对每个聚类中心所在的聚类簇,计算该聚类簇所有数据点的平均值,将该平均值作为新的聚类中心。 $$C_j = \frac{1}{|S_j|} \sum_{i \in S_j} X_i$$ 其中,$|S_j|$表示聚类簇$S_j$中数据点的个数。 4. 重复执行步骤2和3,直到聚类中心不再变化或达到预定的最大迭代次数 重复执行步骤2和3,直到聚类中心不再变化或达到预定的最大迭代次数。可以通过设置一个阈值来判断聚类中心是否变化。 以上就是k-means聚类算法的公式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值