你好,数据爱好者们!👋
当你深入无监督学习的世界时,你会遇到一些任务,目标是找出没有明确标签的数据中的隐藏模式。这类任务中最常用的技术是聚类。今天,让我们来看看K-Means聚类,并通过一个实际的Python例子来展示它!🚀
此处省略内容
无监督学习到底是什么?🤔无监督学习是一种机器学习方法,其中模型接收的数据没有任何标签。目标是发现数据中的模式、结构或关系。模型尝试从输入数据中学习,而不需要任何关于预期输出的指示。
例如聚类、异常检测和降维。
此处省略部分内容
你知道什么是分类吗? 🧑🤝🧑聚类 是一种无监督学习技术,它根据数据点的相似性来分组数据。最常见的聚类算法是 K-Means,其中 "K" 代表你希望将数据分成的簇的数量。
如图所示,这是一张图片,你可以通过链接查看:
K-Means 算法 📝
注:K-Means 算法步骤如下
- 初始化K个质心:从数据中随机选择K个点作为初始聚类中心。
- 将数据点分配给最近的簇:每个数据点被分配到最近的质心,从而形成K个聚类。
- 更新质心:分配后,根据每个聚类中数据点的平均位置计算新的质心。
- 重复:重复步骤2和3,直到质心不再变动或达到稳定状态。
此处为星号占位符(
(或重复使用 asterisks: ))
这里是一个用Python实现K-Means聚类的示例。我将一步步地向你解释,解释每个步骤的具体内容!
此处为空
第一步:导入 🧑🔬
让我们开始吧!
import pandas
import numpy
import matplotlib.pyplot as plt
import seaborn as sns
from warnings import filterwarnings
filterwarnings('ignore')
全屏 退出全屏
我们首先从引入必要的库开始。
matplotlib
和seaborn
用于可视化数据。pandas
和numpy
处理数据。filterwarnings
用于过滤代码中的警告。
……
下一步:生成合成数据💡
首先,我们从 `sklearn.datasets` 导入 `make_blobs` 函数 # 导入函数
x, y = make_blobs(n_samples=1000, centers=3, n_features=2) # 生成聚类数据
plt.scatter(x[:, 0], x[:, 1], c=y) # 绘制散点图
进入全屏 退出全屏
在这里,我们生成一个合成的数据集,包含1000个样本和3个聚类中心。
make_blobs
用于生成具有可分离聚类的二维数据。plt.scatter
用于帮助我们可视化数据点,其中颜色表示实际的聚类。
输出:
散点图显示了三个明显的群体。
等等
第三步:标准化数据 🔄
从 sklearn.preprocessing 导入 StandardScaler 作为 scaler
scaler = StandardScaler()
从 sklearn.model_selection 导入 train_test_split 作为 train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=42)
x_train_scaled = scaler.fit_transform(x_train)
x_test_scaled = scaler.transform(x_test)
进入全屏,退出全屏
- 在K-Means中,标准化至关重要,因为它确保所有特征具有相似的度量。
train_test_split
将数据划分成训练集和测试集。-
StandardScaler
将数据标准化到同一尺度。 -
- *
步骤4:肘形法找到最佳K值 🧩
from sklearn.cluster import KMeans
创建一个空列表 wscc
当 k 的值从 1 到 10 遍历时:
创建一个 KMeans 模型,设置聚类数为 k,初始化方式为 'k-means++'
使用标准化的训练数据 x_train_scaled 和标签 y_train 来拟合模型
计算并追加模型的惯性值到 wscc 列表
切换到全屏模式,退出全屏
首先,我们使用肘法来确定最佳的K值。惯性值衡量数据拟合到聚类中的程度。
KMeans
对不同 K 值(从 1 到 10)对数据进行聚类。- 我们将惯性值存储于列表
wscc
中,以评估“拐点”。
输出结果 (wscc
):
[1499.99, 594.74, 65.69, 58.75, 51.76, 41.96, 37.2, 34.92, 29.05, 27.66]
全屏模式 全屏退出模式
第五步:我们来画个肘曲线吧 📉
plt.plot(range(1, 11), wscc)
plt.xticks(range(1, 11))
plt.xlabel('聚类的数量')
plt.ylabel('WCSS(组内平方和)')
全屏模式,退出全屏
肘形曲线帮助我们找到最佳的K。
- 随着 K 的增加,惯性减少得越来越多。
-
转折点是惯性减少开始变慢的地方,这表明 K 值已经找到了最优点。
-
- *
第六步:找到K值的拐点
从kneed导入KneeLocator()
kl = KneeLocator(range(1, 11), wscc, curve='convex', direction='decreasing')
kl.elbow
进入全屏 退出全屏
使用 KneeLocator,我们能找到曲线的拐点。
根据惯性曲线,肘部
方法帮助我们找到最优的 K 值。
显示结果:
3
进入全屏模式,退出全屏模式
所以,最佳的聚类数量就是3,太棒了!🎉
第七步:轮廓分数评估 🌟
从 sklearn.metrics 导入 silhouette_score
轮廓系数 = []
for k in range(2, 11):
kmean = KMeans(n_clusters=k, init='k-means++')
kmean.fit(x_train_scaled)
得分 = silhouette_score(x_train_scaled, kmean.labels_)
轮廓系数.append(得分)
plt.plot(range(2, 11), 轮廓系数)
plt.xticks(range(2, 11))
plt.xlabel('聚类数')
plt.ylabel('轮廓系数')
切换到全屏,退出全屏
轮廓得分衡量的是一个聚类内数据点与其它聚类中数据点的接近度,越接近代表聚类效果越好。
-
得分越高说明聚类越分明。
-
- *
- K-Means算法 是一种将相似的数据点分组到K个簇中的强大技术。
- 肘法 和 轮廓系数 是确定最优K的有效方法。
- 您可以轻松地使用
scikit-learn
实现K-Means算法、可视化结果,并评估聚类效果。
所以,下次当你遇到未标记的数据时,不妨试试看K-Means聚类,看看它是否适合你的数据集!😎
开心聚会! 🎉
共同学习,写下你的评论
评论加载中...
作者其他优质文章