Python使用K-means聚类分析

Python使用K-means聚类分析



介绍

提示:这里可以添加本文要记录的大概内容:

本文将使用所谓的无监督学习算法。 无监督算法不使用目标; 相反,它们的目的是学习数据的某些属性,以某种方式表示特征的结构。 在用于预测的特征工程的上下文中,您可以将无监督算法视为一种“特征发现”技术。

聚类只是意味着根据点之间的相似程度将数据点分配给组。 可以说,聚类算法使“物以类聚”。

当用于特征工程时,我们可以尝试发现代表细分市场或具有相似天气模式的地理区域的客户群。 添加集群标签的功能可以帮助机器学习模型理清复杂的空间或邻近关系。

1.集群标签作为特征

应用于单个实值特征,聚类就像传统的“分箱”或“离散化”变换。 在多个特征上,它就像“多维合并”(有时称为矢量量化)。
在这里插入图片描述添加到数据框,集群标签的功能可能如下所示:
在这里插入图片描述

请务必记住,此聚类功能是分类的。 在这里,它显示为典型的聚类算法会产生的标签编码(即,作为整数序列); 根据您的模型,单热编码可能更合适。添加聚类标签的动机是聚类会将特征之间的复杂关系分解为更简单的块。 然后,我们的模型可以一个接一个地学习更简单的块,而不必一次学习所有复杂的整体。 这是一种“分而治之”的策略。
在这里插入图片描述
该图显示了聚类如何改进简单的线性模型。 YearBuilt 和 SalePrice 之间的曲线关系对于这种模型来说太复杂了——它欠拟合。 然而,在较小的块上,这种关系几乎是线性的,并且模型可以轻松学习。


提示:以下是本篇文章正文内容,下面案例可供参考

一、k-均值聚类

有很多聚类算法。 它们的主要区别在于如何衡量“相似性”或“接近性”,以及它们使用的特征类型。 我们将使用的算法 k-means 直观且易于在特征工程环境中应用。 根据您的应用程序,另一种算法可能更合适。

K 均值聚类使用普通直线距离(换言之,欧几里德距离)来衡量相似性。 它通过在特征空间内放置一些称为质心的点来创建聚类。 数据集中的每个点都分配给它最接近的质心的集群。 “k-means”中的“k”是它创建的质心(即簇)的数量。 您自己定义 k。

您可以想象每个质心通过一系列辐射圆捕获点。 当来自竞争质心的多组圆圈重叠时,它们会形成一条线。 结果就是所谓的 Voronoi 镶嵌。 曲面细分向您展示了未来数据将被分配到哪些集群; 曲面细分本质上是 k-means 从其训练数据中学到的东西。

上述 Ames 数据集上的聚类是 k 均值聚类。 这是同一张图,显示了曲面细分和质心。
在这里插入图片描述
让我们回顾一下 k-means 算法如何学习聚类以及这对特征工程意味着什么。 我们将重点关注 scikit-learn 实现中的三个参数:n_clusters、max_iter 和 n_init。

这是一个简单的两步过程。 该算法首先随机初始化一些预定义数量 (n_clusters) 的质心。 然后迭代这两个操作:

将点分配给最近的簇质心
移动每个质心以最小化到其点的距离
它迭代这两个步骤,直到质心不再移动,或者直到达到某个最大迭代次数 (max_iter)。

质心的初始随机位置经常会以较差的聚类结束。 由于这个原因,该算法重复多次(n_init)并返回每个点与其质心之间的总距离最小的聚类,即最佳聚类。

下面的动画显示了正在运行的算法。 它说明了结果对初始质心的依赖性以及迭代直到收敛的重要性。
在这里插入图片描述
您可能需要为大量集群增加 max_iter 或为复杂数据集增加 n_init。 通常,您需要自己选择的唯一参数是 n_clusters(即 k)。 一组特征的最佳划分取决于您使用的模型和您试图预测的内容,因此最好像任何超参数一样调整它(例如通过交叉验证)。

二、示例 - 加州住房

作为空间特征,California Housing 的“纬度”和“经度”自然成为 k-means 聚类的候选对象。 在此示例中,我们将这些与“MedInc”(收入中位数)进行聚类,以创建加利福尼亚不同地区的经济细分。

代码如下(示例):

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from sklearn.cluster import KMeans

plt.style.use("seaborn-whitegrid")
plt.rc("figure", autolayout=True)
plt.rc(
    "axes",
    labelweight="bold",
    labelsize="large",
    titleweight="bold",
    titlesize=14,
    titlepad=10,
)

df = pd.read_csv("../input/fe-course-data/housing.csv")
X = df.loc[:, ["MedInc", "Latitude", "Longitude"]]
X.head()

在这里插入图片描述

2.KMeans

由于 k 均值聚类对尺度敏感,因此使用极值重新尺度或规范化数据可能是个好主意。 我们的功能已经大致处于相同的规模,所以我们将保持原样

# Create cluster feature
kmeans = KMeans(n_clusters=6)
X["Cluster"] = kmeans.fit_predict(X)
X["Cluster"] = X["Cluster"].astype("category")

X.head()

该处使用的url网络请求的数据。

现在让我们看几幅图,看看它的效果如何。 首先,显示集群地理分布的散点图。 该算法似乎为沿海的高收入地区创建了单独的细分市场。

sns.relplot(
    x="Longitude", y="Latitude", hue="Cluster", data=X, height=6,
);

在这里插入图片描述
此数据集中的目标是 MedHouseVal(房屋中值)。 这些箱线图显示了目标在每个集群中的分布。 如果聚类提供信息,这些分布在大多数情况下应该在 MedHouseVal 中分离,这确实是我们所看到的。

X["MedHouseVal"] = df["MedHouseVal"]
sns.catplot(x="MedHouseVal", y="Cluster", data=X, kind="boxen", height=6);

在这里插入图片描述


总结

提示:这里对文章进行总结:

以上就是今天要讲的内容

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
k均值聚类算法是一种常用的聚类算法,用于将数据集划分为k个不同的簇。在python中,可以使用sklearn库中的KMeans类来实现k均值聚类算法。以下是一个示例代码: ```python from sklearn.cluster import KMeans import numpy as np X = np.array([[1, 2], [1, 4], [1, 0], [10, 2], [10, 4], [10, 0]]) kmeans = KMeans(n_clusters=2, random_state=0).fit(X) labels = kmeans.labels_ centers = kmeans.cluster_centers_ print("每个数据点所属的簇标签:", labels) print("每个簇的中心点坐标:", centers) ``` 这段代码使用sklearn库中的KMeans类对输入数据X进行聚类,并得到每个数据点所属的簇标签和每个簇的中心点坐标。在这个例子中,输入数据X是一个二维数组,包含了6个数据点,每个数据点有两个特征。通过设置n_clusters参数为2,即将数据集划分为两个簇。聚类结果保存在labels变量中,每个数据点对应的簇标签,而centers变量保存了每个簇的中心点坐标。 请注意,这只是一个简单的示例,实际应用中,可以根据需要调整参数并针对具体的数据集进行适当的调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python实现聚类K-means算法](https://blog.csdn.net/wyn1564464568/article/details/125782286)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python量化投资、代码解析与论文精读

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值