聚类实战:从PCA降维到K-Means和DBSCAN的完整指南

在数据科学的众多领域中,聚类算法无疑是探索数据集内在结构的强大工具。本文将带您深入了解如何应用主成分分析(PCA)进行降维,以及如何使用K-Means和DBSCAN这两种流行的聚类算法,来揭示数据的隐藏模式。

代码开源地址👉:

源码地址icon-default.png?t=O83Ahttps://www.yuque.com/yuqueyonghuik8ysz/gxfuvi/gtih647ap8ric62h?singleDoc#

一、PCA降维:理论到实践

在处理高维数据时,直观理解数据结构往往是一个挑战。这时,PCA就显得尤为重要。PCA是一种降维技术,能够将数据从原始的高维空间转换到低维空间,同时尽可能保留数据的变异性。

实践步骤:

  1. 导入必要的库:首先,我们需要导入Pandas用于数据处理,NumPy进行数值计算,以及sklearn.decomposition中的PCA。
  2. 标准化数据:PCA对数据的规模非常敏感,因此在应用PCA之前,先使用sklearn.preprocessing.StandardScaler对数据进行标准化。
  3. 应用PCA:接下来,实例化PCA对象,选择合适的组件数量,然后对数据集进行拟合和转换。

二、K-Means聚类:寻找数据的自然分组

K-Means算法通过将数据点分配到K个簇中,使得簇内的数据点尽可能相似,簇间的数据点尽可能不同,从而发现数据的自然分组。

实践步骤:

  1. 选择K值:K是事先设定的簇的数量。Yellowbrick库的KElbowVisualizer可以帮助我们通过肘部法则选择一个合适的K值。
  2. 应用K-Means:使用sklearn.cluster.KMeans,根据选择的K值对数据进行聚类。
  3. 结果分析:分析各个簇的特征,以及簇中心,从而对数据进行解释。

三、DBSCAN聚类:基于密度的聚类方法

与K-Means不同,DBSCAN不需要预先指定簇的数量。它通过识别被低密度区域分隔的高密度区域,来形成簇。

实践步骤:

  1. 参数设置:DBSCAN的主要参数是epsmin_samples,分别代表搜索邻居的半径和形成密集区域所需的最小样本数。
  2. 应用DBSCAN:使用sklearn.cluster.DBSCAN对数据应用DBSCAN算法。
  3. 结果分析:识别核心样本、边界点和噪声点,分析每个簇的特性。

数据可视化:理解聚类结果

无论是PCA降维还是聚类,数据可视化都是理解结果的关键。MatplotlibSeaborn提供了丰富的可视化工具,帮助我们深入理解数据集的潜在模式。

  1. PCA结果可视化:通过绘制PCA降维后的散点图,观察数据点在低维空间的分布。
  2. K-Means聚类可视化:使用散点图显示不同簇的数据点,以及簇中心。
  3. DBSCAN结果可视化:标识出核心点、边界点和噪声点,理解数据的密度结构。

第一步,导入数据

以市场营销数据集为例,其中包含了客户的个人信息、购买行为以及对营销活动的响应。

每行代表一个客户,以下是每列的简要描述:

  • ID:客户的唯一标识符。
  • Year_Birth:客户的出生年份。
  • Education:客户的教育水平(如Graduation、PhD等)。
  • Marital_Status:客户的婚姻状况(如Single、Married、Together等)。
  • Income:客户的年收入。
  • Kidhome:家中有小孩的数量。
  • Teenhome:家中有青少年的数量。
  • Dt_Customer:客户首次成为公司客户的日期。
  • Recency:自客户最后一次购买以来的天数。
  • MntWines:过去两年内购买葡萄酒的金额。
  • 以下省略的列可能包括对其他产品类别的支出(如肉类、鱼类、甜品等),在线访问频次,以及对几轮特定营销活动的响应情况(如AcceptedCmp1、AcceptedCmp2等)。
  • NumWebVisitsMonth:过去一个月内访问公司网站的次数。
  • AcceptedCmp3AcceptedCmp4AcceptedCmp5AcceptedCmp1AcceptedCmp2:表示客户是否接受了第3、4、5、1、2轮的营销活动。
  • Complain:客户是否在最近两年内投诉过。
  • Z_CostContactZ_Revenue:这两列的含义不太清楚,可能是与客户联系的成本和产生的收益相关的内部指标。
  • Response:客户对最近一次营销活动的响应(1表示接受,0表示未接受)。
data = pd.read_csv("data.csv")
print("Number of datapoints:", len(data))
data.head()

查看数据

ID	Year_Birth	Education	Marital_Status	Income	Kidhome	Teenhome	Dt_Customer	Recency	MntWines	...	NumWebVisitsMonth	AcceptedCmp3	AcceptedCmp4	AcceptedCmp5	AcceptedCmp1	AcceptedCmp2	Complain	Z_CostContact	Z_Revenue	Response
0	5524	1957	Graduation	Single	58138.0	0	0	04-09-2012	58	635	...	7	0	0	0	0	0	0	3	11	1
1	2174	1954	Graduation	Single	46344.0	1	1	08-03-2014	38	11	...	5	0	0	0	0	0	0	3	11	0
2	4141	1965	Graduation	Together	71613.0	0	0	21-08-2013	26	426	...	4	0	0	0	0	0	0	3	11	0
3	6182	1984	Graduation	Together	26646.0	1	0	10-02-2014	26	11	...	6	0	0	0	0	0	0	3	11	0
4	5324	1981	PhD	Married	58293.0	1	0	19-01-2014	94	173	
palette = ["#FF6B6B", "#FDD835", "#1DE9B6", "#81D4FA", "#B39DDB", "#FF8A65"]
To_Plot = [ "Income", "Recency", "Customer_For", "Age", "Spent", "Is_Parent"]
print("Reletive Plot Of Some Selected Features: A Data Subset")

# 绘制图形
plt.figure()
sns.pairplot(data[To_Plot], hue="Is_Parent", palette=palette)
plt.show()

第二步,计算相关性矩阵

data_encoded = pd.get_dummies(data, drop_first=True)

# 计算相关性矩阵
corrmat = data_encoded.corr()

# 设置图形的风格和大小
plt.figure(figsize=(20, 20))
sns.heatmap(corrmat, annot=True, cmap='viridis', center=0)

# 显示图形
plt.show()

三步,PCA降维

pca = PCA(n_components=3)
pca.fit(scaled_ds)
PCA_ds = pd.DataFrame(pca.transform(scaled_ds), columns=(["col1","col2", "col3"]))
PCA_ds.describe().T

查看降维后的数据分布

x =PCA_ds["col1"]
y =PCA_ds["col2"]
z =PCA_ds["col3"]
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection="3d")
ax.scatter(x,y,z, c="maroon", marker="o" )
ax.set_title("A 3D Projection Of Data In The Reduced Dimension")
plt.show()

第四步,使用KElbowVisualizer计算需要聚类的种类

Elbow_M = KElbowVisualizer(KMeans(), k=10)
Elbow_M.fit(PCA_ds)
Elbow_M.show()

第五步,Agglomerative聚类

AC = AgglomerativeClustering(n_clusters=4)
yhat_AC = AC.fit_predict(PCA_ds)
PCA_ds["Clusters"] = yhat_AC
data["Clusters"]= yhat_AC

第六步,DBSCAN聚类

dbscan = DBSCAN(eps=0.5, min_samples=5)
dbscan_labels = dbscan.fit_predict(scaled_ds)
data['DBSCAN_cluster'] = dbscan_labels

第七步,KMeans聚类

k = 5  # Example number of clusters
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans_labels = kmeans.fit_predict(scaled_ds)
centroids = kmeans.cluster_centers_

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值