自学内容网 自学内容网

详解机器学习经典模型(原理及应用)——K-Means

一、K-Means算法概念

        K-Means 算法是一种经典的聚类分析方法,属于无监督学习的一种。它的目标是将数据集中的样本划分为预定数量的簇,使得簇内的样本尽可能相似,而簇间的样本尽可能不同。K-Means在业务中也有诸多用途,比如在进行探索性数据分析的过程中,我们会使用K-Means简单看看数据分布,从而辅助后面的建模判断等等。

二、K-Means算法流程

1、选择K值

        K是预先指定的簇数量,它是算法的输入参数,需要根据数据集和需求来确定,也就是说你要预先估计大概可以聚出多少个类簇,然后将K值设定成相对应的数目,训练之后再评估效果。一般我们会选择多个K值,循环训练并输出轮廓系数等指标,从而选定最佳的K值。

2、初始化簇中心

        随机选择 K 个数据点作为初始簇中心(质心),可以使用更复杂的初始化方法,如 K-Means++。这个环节通常使用欧几里得距离来衡量数据点与簇中心之间的距离,对于数据点x和簇中心c:

d(x,c) = \sqrt{\sum_{i=1}^{n}(x_{i}-c_{i})^{2}}

        其中,x_{i}是数据点x的第i个特征,c_{i}是簇中心c的第i个特征,n是特征的数量。

3、分配数据点到最近的簇

        对于数据集中的每个数据点,计算它与每个簇中心的距离,并将其分配给最近的簇。分配的决策基于最小化距离:

C(x) = argmin_{k}d(x,c_{k})

        其中,C(x)表示数据点x被分配到的簇,c_{k}是第k个簇的中心。

4、更新簇中心

        一旦所有数据点都被分配,重新计算每个簇的中心,通常是簇内所有数据点的均值。一旦所有数据点都被分配到簇中,每个簇的中心更新为该簇所有数据点的均值。簇中心的更新公式为:

c_{k} = \frac{1}{|S_{k}|}\sum _{x-from-S_{k}}x

        其中,c_{k}是第k个簇的新中心,S_{k}是分配给第k个簇的所有数据点的集合,|S_{k}|是簇k中数据点的数量。

5、迭代过程

        重复步骤 3 和 4,直到簇中心不再发生变化,或者变化小于某个预设的阈值,或者达到最大迭代次数。

6、总成本

        在每次迭代中,可以计算总成本(通常是簇内误差平方和,SSE)来评估模型的性能,这一步相当于损失函数,K-Means训练的优化目标就是最小化SSE:

SSE = \sum_{k=1}^{K}\sum _{x-from-S_{k}}d(x,c_{k})^2

        其中,K是簇的数量。

三、算法应用示例

        这里给出K-Means的示例代码以及可视化结果。

# 导入必要的库
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# 生成模拟数据集
X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 创建 KMeans 实例,设置簇的数量
kmeans = KMeans(n_clusters=4)

# 训练模型
kmeans.fit(X)

# 预测聚类结果
y_kmeans = kmeans.predict(X)

# 获取簇中心
centers = kmeans.cluster_centers_

# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.5)
plt.title('KMeans Clustering')
plt.show()

四、总结

        还记得笔者当年毕业秋招的时候,忘记了是哪一家公司的算法笔试题最后一题竟然是手撕K-Means!可见这个算法的含金量!在探索性数据分析、数据可视化等环节经常都会出现它的影子,但具体何时应用需结合其优缺点及任务需求。

1、优点

        (1)简单易懂:K-Means 算法的原理和实现都非常简单,容易理解和解释。

        (2)无需预设类别标签:作为无监督学习算法,K-Means 不需要预先定义的类别标签。

2、缺点

        (1)对初始值敏感:算法的结果可能依赖于初始簇中心的选择,可能导致不同的聚类结果,当然现在已经有许多优化算法用于缓解这个问题了。

        (2)需要预先指定簇数量:用户必须预先指定 K 值,即簇的数量,这需要多次尝试和领域知识。

        (3)对离群点敏感:离群点可能会对簇中心的计算产生较大影响,从而影响聚类质量。

        (4)假设簇是凸形且相似大小:K-Means 算法假设簇是圆形且大小相似(从算法原理可以看出,一个类簇中的所有样本距簇中心的距离都在某一个指定的半径内),如果数据集是非球形的,K-Means算法的效果不一定很好(甚至会很差)。

        (5)计算效率问题:在每次迭代中都需要计算所有数据点到所有簇中心的距离,这在数据量大时会导致计算效率问题(聚类算法通病,计算过程很慢,在使用轮廓系数等指标评估的时候。指标的计算过程也很慢)。


原文地址:https://blog.csdn.net/ChaneMo/article/details/142450070

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!