K-Means算法即K均值算法, 它属于一种经典的聚类算法, 何为聚类算法呢, 就是将数据集中样本划分成若干组, 这里的组又被称作簇, 英文名是。聚类算法是一种无监督学习技术, 故而它无需给数据打标签, 完全依据数据自身的特征来进行分组的。
最早于1956年被给出的算法是K-Means算法, 在1967年首次有了"K-Means"这个名称的确定, 很容易造成初学者将KNN和K-Means弄混淆的情况, 这里针对两者的不同来做一下解释:
首先, KNN属于监督学习算法, 因而它要借助训练数据预先进行打标签这一操作, 然而, K-Means是依据数据自身所具备的特征去自动开展分类工作的, 它归属于无监督学习算法, 进而, 它是不需要提前进行打标签的。
首先, 第二点, KNN常常被运用在分类以及回归方面, 它属于聚类算法, 但是并且, 其所能够抵达的效果也全然不一样, 存在差异。
首先, 第三点, KNN里的K, 属于数据周边的K个数据, 其次, K - Means当中的K, 是用于将数据划分成K个簇, 然后, 尽管这两种算法都存在K, 然而, K的意义全然不一样。
然后介绍下K-Means算法的基本流程:
一开始, 随机去初始化K个中心点, 当然这K个中心点不会彼此距离太近, 不然可就很难开展聚类操作了。
第二步, 距离概念在此处涉及, 要将每一数据点分配至离其最近的中心点, 如此最初的簇便形成了, 此处所涉及的距离和KNN算法里的距离是同一回事, 例如可选择曼哈顿距离, 或者欧氏距离, 又或者切比雪夫距离等。
首先是第三步, 要对每个簇的中心点重新进行计算, 而这个中心点又被叫做质心, 在此处, 乃是借助求均值的操作来达成的, 这也正好就是K-Means中的Means这个名字的由来。
瞧, 请来看有一个具体的范例, 比如说, 好像我们打算要去得到四个簇, 接着这里具有 300 个样本, 那么此时我们便能够去使用如同下面这样子的代码:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
# 生成示例数据
X, y = make_blobs(
n_samples=300, # 样本数量
centers=4, # 簇的数量
cluster_std=0.60, # 簇的标准差
random_state=0 # 随机种子
)
# 创建 KMeans 模型并拟合数据
kmeans = KMeans(n_clusters=4, init='k-means++', max_iter=300, n_init=10, random_state=0)
# 训练模型并预测每个样本所属的簇
pred_y = kmeans.fit_predict(X)
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=pred_y, s=50, cmap='viridis')
# 绘制聚类中心
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=200, c='red', alpha=0.7, label='Cluster Centers')
plt.title('K-Means Clustering')
plt.xlabel('feature 1')
plt.ylabel('feature 2')
plt.legend()
plt.show()
因为核心功能全都标注有注释,因而此处便不再阐述代码的用途了。能够瞧见我们生成了四个簇, 那些簇依靠不同颜色展开区分, 并且运用红色对簇的中心予以标明, 情况如下:

鉴于K-Means无需预先给数据打标签, 故而它颇适用于大规模数据, 并且其可解释性颇为突出, 毕竟簇的中心即为特征代表, 正因如此该算法适于譬如客户分群、图像分割、异常检测等场景。