当前位置: 首页 > news >正文

机器学习:K-means算法(内有精彩动图)

目录

前言

一、K-means算法

1.K-means算法概念

2.具体步骤

3.精彩动图

4.算法效果评价

二、代码实现

1.完整代码

2.结果展示

3.步骤解析

1.数据预处理

2.建立并训练模型

3.打印图像

四、算法优缺点

1.优点

2.缺点

总结


前言

        机器学习里除了分类算法,回归算法,还有聚类算法,这里讲的k均值算法便是其中一种

 

一、K-means算法

1.K-means算法概念

        K均值(K-Means)算法是一种常见的聚类算法,用于将数据集分成预定数量的簇(k个簇)。算法的目标是将数据点划分到k个簇中,以最小化簇内数据点之间的平方距离的总和。

 

2.具体步骤

  1. 初始化簇中心

    随机选择k个数据点作为初始簇中心,或者通过某些启发式方法选择。
  2. 分配数据点

    将每个数据点分配到离它最近的簇中心所对应的簇中。
  3. 更新簇中心

    计算每个簇内所有数据点的均值,并将簇中心更新为这个均值。
  4. 重复

    重复步骤2和3,直到簇中心的变化非常小或达到最大迭代次数为止。
  5. 结束

    算法收敛,簇中心不再变化或变化非常小,最终得到的簇划分即为聚类结果。

 

3.精彩动图

 

4.算法效果评价

  • 轮廓系数(Silhouette Score)是用于评估聚类效果的指标。它衡量了数据点在其簇内的一致性和与其他簇的分隔度。轮廓系数的值范围从 -1 到 1,值越高表示聚类效果越好。

 

 

二、代码实现

1.完整代码

  • 代码完成的是对学生的分类
import pandas as pd# data = pd.read_csv('data.txt', sep=' ')
# x = data.iloc[:, 1:5]from sklearn.preprocessing import StandardScalerdata = pd.read_csv('datingTestSet2.txt', sep='\t', header=None)
x = data.iloc[:, 0:3]
std = StandardScaler()
x = std.fit_transform(x)
"""
根据分成不同的簇,自动计算轮廓系数得分
"""
from sklearn.cluster import KMeans
from sklearn import metricsscores = []
for k in range(2, 10):   # 选取最佳的簇数labels = KMeans(n_clusters=k).fit(x).labels_  # 簇标签score = metrics.silhouette_score(x, labels)  # 轮廓系数scores.append(score)
print(scores)
best_k = scores.index(max(scores)) + 2
print(best_k)
labels = KMeans(n_clusters=best_k).fit(x).labels_
score = metrics.silhouette_score(x, labels)
print(labels, score)import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体
plt.rcParams['axes.unicode_minus'] = False  # 解决符号显示为方块的问题
# 绘制轮廓系数得分与簇数量的关系图
plt.figure(figsize=(8, 6))
plt.plot(range(2, 10), scores, marker='o')
plt.xlabel('簇数量 (k)')
plt.ylabel('轮廓系数')
plt.title('簇数量与轮廓系数')
plt.xticks(range(2, 10))
plt.grid(True)
plt.show()# 打印最佳簇数量
best_k = scores.index(max(scores)) + 2
print(f"最佳簇数量: {best_k}")

 

2.结果展示

  • 因为数据比较分散,所以轮廓系数比较低

 

3.步骤解析

1.数据预处理

  1. 导入pands库
  2. 导入数据,取出特征数据
  3. 对数据进行标准化
import pandas as pd# data = pd.read_csv('data.txt', sep=' ')
# x = data.iloc[:, 1:5]from sklearn.preprocessing import StandardScalerdata = pd.read_csv('datingTestSet2.txt', sep='\t', header=None)
x = data.iloc[:, 0:3]
std = StandardScaler()
x = std.fit_transform(x)

 

2.建立并训练模型

  • 利用for循环找到模型内某个参数在某个范围内的最佳值
"""
根据分成不同的簇,自动计算轮廓系数得分
"""
from sklearn.cluster import KMeans
from sklearn import metricsscores = []
for k in range(2, 10):   # 选取最佳的簇数labels = KMeans(n_clusters=k).fit(x).labels_  # 簇标签score = metrics.silhouette_score(x, labels)  # 轮廓系数scores.append(score)
print(scores)
best_k = scores.index(max(scores)) + 2
print(best_k)
labels = KMeans(n_clusters=best_k).fit(x).labels_
score = metrics.silhouette_score(x, labels)
print(labels, score)

 

3.打印图像

import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体
plt.rcParams['axes.unicode_minus'] = False  # 解决符号显示为方块的问题
# 绘制轮廓系数得分与簇数量的关系图
plt.figure(figsize=(8, 6))
plt.plot(range(2, 10), scores, marker='o')
plt.xlabel('簇数量 (k)')
plt.ylabel('轮廓系数')
plt.title('簇数量与轮廓系数')
plt.xticks(range(2, 10))
plt.grid(True)
plt.show()

 

 

四、算法优缺点

1.优点

  • 简单易实现。
  • 计算效率较高,适用于大规模数据集。

 

2.缺点

  • 需要事先指定k的值,且k的选择可能影响结果。
  • 对初始簇中心敏感,可能会收敛到局部最优解。
  • 不适用于具有非凸形状簇的数据集。
  • 对噪声和异常值敏感。

 

总结

        K均值是一种迭代的聚类算法,旨在将数据集分成k个簇,使得每个簇的内部数据点尽可能相似,而不同簇的数据点尽可能不同。


http://www.mrgr.cn/news/11727.html

相关文章:

  • MySQL运维学习(2):主从复制
  • 在 Monaco Editor 中自定义右键菜单并支持多级菜单
  • 对于 OpenAI 最新发布 支持实时语音对话的模型GPT-4o,我想说
  • 新手科研人必看! 2024年8月学术论文疑惑解答,迅速提升你的SCI投稿质量。
  • iOS WebView
  • Linux--find命令-搜索
  • kafka
  • Aria2安装和使用-Mac版
  • Nuxt 入门实战 - 05:特性
  • 【Python机器学习】NLP词中的数学——词袋
  • 系统编程-信号量集
  • NLP从零开始------14.文本中阶序列处理之语言模型(2)
  • SSRF漏洞(服务器端请求伪造)相关案例
  • 初识数据库
  • Dotnet Core-关于8.0版本中jwt的官方bug
  • BC156 牛牛的数组匹配(c语言)
  • 【C/C++】typedef用法
  • SpringCloudGateway重写负载均衡策略
  • CSS 中处理文本溢出并隐藏它
  • 论文笔记:Large Language Models are Zero-Shot Next LocationPredictors