细说机器学习算法之K-Means及代码实现

系列文章目录

第一章:Pyhton机器学习算法之KNN

第二章:Pyhton机器学习算法之K—Means


目录

系列文章目录

前言

一、基本思想:

二、实现步骤:

三、基本概念:

四、代码实例:

五、实际案例:

六、优缺点:

七、应用场景:

八、K值选择方法:

九、改进与优化方法:

总结


 

 

前言

K-Means,即K均值算法,是聚类算法中最流行的算法之一,属于无监督学习方法,核心任务是对给定的数据集进行数据点的有效分组,使同一群组内的数据点之间具有较高的相似性,而不同群组的数据点之间存在显著的差异。以下是对K-Means算法的详细介绍:


 

一、基本思想:

K-Means算法的工作原理基于迭代优化的思想:

  • 选择初始聚类中心:算法首先随机选择K个数据点作为初始的聚类中心。
  • 分配数据点:接着计算每个数据点到这K个聚类中心的距离,并将数据点分配到距离最近的聚类中心所属的群组。
  • 更新聚类中心:然后算法会重新计算每个群组的聚类中心,即计算该群组内所有数据点的平均值,作为新的聚类中心。
  • 重复迭代:上述过程会不断重复,直到满足某个终止条件,如聚类中心不再发生显著变化或达到预设的迭代次数。

通过这种方式,K-Means算法能够逐步优化聚类结果,使得同一群组内的数据点更加紧密,而不同群组的数据点更加分散。

二、实现步骤:

K-Means算法的实现可以概括为以下几个关键步骤:

  1. 选择K值:用户需要确定聚类的数量K,即希望将数据划分为多少个群组。
  2. 初始化聚类中心:随机选择K个数据点作为初始的聚类中心。
  3. 分配数据点:计算每个数据点到K个聚类中心的距离,并将数据点分配到距离最近的聚类中心所属的群组。
  4. 更新聚类中心:对于每个群组,计算该群组内所有数据点的平均值,作为新的聚类中心。
  5. 重复迭代:重复上述分配和更新的步骤,直到满足终止条件,如聚类中心不再发生显著变化或达到预设的迭代次数。
  6. 输出结果:最终,算法会输出K个聚类中心以及每个数据点所属的群组信息。

三、基本概念:

聚类:对数据集进行数据点的有效分组,帮助人们更好地理解和汇总数据,进而对数据的各个单元进行精准分类。

7a3651e9c54842b8ae34c918cef154b8.png

更新聚类中心与重复迭代:对于每个群组,计算该群组内所有数据点的平均值,作为新的聚类中心。重复上述分配和更新的步骤,直到满足终止条件,如聚类中心不再发生显著变化或达到预设的迭代次数。

                             533f16a60c284f2d8040cdb92208c6a8.png

四、代码实例:

from sklearn.datasets import load_iris
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 加载 Iris 数据集
iris = load_iris()
X = iris.data[:, :2]  # 仅选择前两个特征进行可视化
# 注意:这里没有 target 变量用于 KMeans,因为我们是无监督学习
# 但为了可视化原始数据的类别,我们保留 iris.target
y_true = iris.target  # 真实标签,用于后续可视化

# 创建 KMeans 模型并拟合数据
kmeans = KMeans(n_clusters=3, random_state=42)  # 设置随机种子以确保结果可重复
y_predict = kmeans.fit_predict(X)  # 对数据进行聚类并预测标签




# 设置全局字体为黑体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决坐标轴负号显示问题
plt.rcParams['axes.unicode_minus'] = False
fig,axs=plt.subplots(2,1,figsize=(10,10),dpi=70)
axs[0].scatter(X[:,0],X[:,1],c=y_true)
axs[0].set_title('真实数据')
axs[1].scatter(X[:,0],X[:,1],c=y_predict)
axs[1].set_title('预测数据')

7b21d2bbb30b4ecea240a8021b392aba.png

# 创建网格以进行可视化
x = np.linspace(X[:, 0].min(), X[:, 0].max(), 150)
y = np.linspace(X[:, 1].min(), X[:, 1].max(), 150)
xx, yy = np.meshgrid(x, y)
zz = kmeans.predict(np.c_[xx.ravel(), yy.ravel()])  # 预测网格中每个点的聚类标签
zz = zz.reshape(xx.shape)  # 重塑 zz 以匹配 xx 和 yy 的形状

# 可视化聚类结果
plt.contourf(xx, yy, zz, cmap='viridis', alpha=0.3)  # 使用 alpha 参数使颜色填充半透明
plt.scatter(X[:, 0], X[:, 1], c=y_true, cmap='gray', edgecolor='k', marker='o')  # 可视化原始数据的类别
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], c='red', marker='x')  # 可视化聚类中心
plt.title('KMeans Clustering of Iris Dataset (First 2 Features)')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

# 打印聚类中心
print('聚类中心:\n', kmeans.cluster_centers_)

4e4b9b19dfab468491bb9ae390197b1e.png

#计算轮廓系数的平均值
from sklearn.metrics import silhouette_score
from sklearn.metrics import silhouette_samples

score= silhouette_score(X,y_predict) #与真实距离越接近 那么轮廓系数越高

score2= silhouette_samples(X,y_predict)
score2.mean()

29001c73a5c044cb8a94f6c84f8161bc.png

五、实际案例:

#实战中国足球 数据我之后会上传
data = pd.read_csv(r'D:/data/data.csv',encoding='gbk')

4d6911af5e89410e83e791cebd2cde99.png

train =data.loc[:,'2019年国际排名':'2015亚洲杯'] #拆分训练集 舍去国家列

d972e2e233fe42be91d67199094d573d.png

y_predict=kmeans.fit_predict(train) #进行分类预测

for i in [1,2,0]:
   country=data['国家'][y_predict ==i]
   print(country.tolist())

763d73b555564f86b5bab5c79c2d23e1.png

score3= silhouette_score(train,y_predict)
data['队伍分类']=y_predict
data['队伍分类']= data['队伍分类'].replace({0:'弱队',1:'中等队',2:'强队'})

 

ea3b347689a646f89b238c40edb402c8.png

plt.scatter(train['2019年国际排名'],train['2018世界杯'],train['2015亚洲杯'],c=y_predict)
center = kmeans.cluster_centers_
plt.scatter(center[:,0],center[:,1],center[:,2],c='red',marker='+')

8f416da4c4bb40ff8884ef7b9e6b2d63.png

重要参数:
n_clusters:聚类的个数(即簇)
重要属性:
cluster_centers_:[n clusters,n features]的数组,表示聚类中心点的坐标。labels:每个样本点的标签

六、优缺点:

  • 优点

    • 算法简单易懂,计算效率高。
    • 适用于大规模数据集。
    • 能够提供明确的聚类结果,便于后续的数据分析和处理。
  • 局限性

    • 对初始聚类中心的选择较为敏感,不同的初始选择可能导致截然不同的聚类结果。
    • 需要事先确定K值,这在某些情况下可能较为困难。
    • 假设数据点是线性可分的,且每个群组的数据点都服从高斯分布,这在实际应用中可能并不总是成立。
    • 对噪声和异常值较为敏感,可能会导致聚类中心的偏移,从而影响聚类结果的准确性。
    • 只适用于凸形数据集,对于非凸形的数据集可能无法得到理想的聚类结果。

七、应用场景:

K-Means算法在多个领域都有广泛的应用,包括但不限于:

  • 市场营销:企业可以利用K-Means算法对客户进行细分,从而制定更加精准的营销策略。
  • 图像处理:K-Means算法可以用于图像分割和颜色压缩。
  • 生物信息学:它可以帮助研究人员识别基因表达数据中的不同模式。
  • 文本聚类:K-Means算法可以对文本数据进行聚类分析,将相似的文档或单词归为一类。
  • 社交网络分析:K-Means算法可用于分析用户的行为模式、兴趣爱好等,将用户聚类为不同的社群,便于个性化推荐和社区管理。
  • 物流配送优化:K-Means算法可用于对配送点进行聚类分析,优化配送路径、降低配送成本和提高配送效率。

八、K值选择方法:

选择合适的K值是K-Means算法中的一个关键问题。为了确定最佳的K值,用户可以尝试不同的K值,并利用内部验证的度量方法来评估聚类质量。例如:

  • 肘部法则(Elbow Method):通过观察聚类误差平方和(SSE)随K值变化的趋势来确定最佳的K值。
  • 轮廓系数(Silhouette Coefficient)Davies-Bouldin指数:这些度量方法能够帮助用户更加客观地选择合适的K值,从而得到更加准确的聚类结果。(我们目前上面实际案例用的都是轮廓系数进行评估)

九、改进与优化方法:

为了克服K-Means算法的局限性,研究人员提出了多种改进和优化方法:

  • K-Means++算法:一种改进的初始化方法,能够更加均匀地选择初始聚类中心,从而减少算法对初始选择的敏感性。
  • 并行K-Means算法和分布式K-Means算法:这些方法通过利用并行计算和分布式存储等技术,提高了K-Means算法的计算效率和可扩展性。
  • 与其他算法的结合:如与遗传算法、粒子群优化算法等智能优化算法的结合,以进一步提高聚类性能。

总结

综上所述,K-Means算法是一种简单高效的聚类算法,具有广泛的应用场景。然而,它也存在一些局限性,需要在实际应用中根据具体的数据特点和需求进行选择和优化。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值