在数据科学的众多领域中,聚类算法无疑是探索数据集内在结构的强大工具。本文将带您深入了解如何应用主成分分析(PCA)进行降维,以及如何使用K-Means和DBSCAN这两种流行的聚类算法,来揭示数据的隐藏模式。
代码开源地址👉:
源码地址https://www.yuque.com/yuqueyonghuik8ysz/gxfuvi/gtih647ap8ric62h?singleDoc#
一、PCA降维:理论到实践
在处理高维数据时,直观理解数据结构往往是一个挑战。这时,PCA就显得尤为重要。PCA是一种降维技术,能够将数据从原始的高维空间转换到低维空间,同时尽可能保留数据的变异性。
实践步骤:
- 导入必要的库:首先,我们需要导入
Pandas
用于数据处理,NumPy
进行数值计算,以及sklearn.decomposition
中的PCA。 - 标准化数据:PCA对数据的规模非常敏感,因此在应用PCA之前,先使用
sklearn.preprocessing.StandardScaler
对数据进行标准化。 - 应用PCA:接下来,实例化PCA对象,选择合适的组件数量,然后对数据集进行拟合和转换。
二、K-Means聚类:寻找数据的自然分组
K-Means算法通过将数据点分配到K个簇中,使得簇内的数据点尽可能相似,簇间的数据点尽可能不同,从而发现数据的自然分组。
实践步骤:
- 选择K值:K是事先设定的簇的数量。
Yellowbrick
库的KElbowVisualizer
可以帮助我们通过肘部法则选择一个合适的K值。 - 应用K-Means:使用
sklearn.cluster.KMeans
,根据选择的K值对数据进行聚类。 - 结果分析:分析各个簇的特征,以及簇中心,从而对数据进行解释。
三、DBSCAN聚类:基于密度的聚类方法
与K-Means不同,DBSCAN不需要预先指定簇的数量。它通过识别被低密度区域分隔的高密度区域,来形成簇。
实践步骤:
- 参数设置:DBSCAN的主要参数是
eps
和min_samples
,分别代表搜索邻居的半径和形成密集区域所需的最小样本数。 - 应用DBSCAN:使用
sklearn.cluster.DBSCAN
对数据应用DBSCAN算法。 - 结果分析:识别核心样本、边界点和噪声点,分析每个簇的特性。
数据可视化:理解聚类结果
无论是PCA降维还是聚类,数据可视化都是理解结果的关键。Matplotlib
和Seaborn
提供了丰富的可视化工具,帮助我们深入理解数据集的潜在模式。
- PCA结果可视化:通过绘制PCA降维后的散点图,观察数据点在低维空间的分布。
- K-Means聚类可视化:使用散点图显示不同簇的数据点,以及簇中心。
- DBSCAN结果可视化:标识出核心点、边界点和噪声点,理解数据的密度结构。
第一步,导入数据
以市场营销数据集为例,其中包含了客户的个人信息、购买行为以及对营销活动的响应。
每行代表一个客户,以下是每列的简要描述:
- ID:客户的唯一标识符。
- Year_Birth:客户的出生年份。
- Education:客户的教育水平(如Graduation、PhD等)。
- Marital_Status:客户的婚姻状况(如Single、Married、Together等)。
- Income:客户的年收入。
- Kidhome:家中有小孩的数量。
- Teenhome:家中有青少年的数量。
- Dt_Customer:客户首次成为公司客户的日期。
- Recency:自客户最后一次购买以来的天数。
- MntWines:过去两年内购买葡萄酒的金额。
- 以下省略的列可能包括对其他产品类别的支出(如肉类、鱼类、甜品等),在线访问频次,以及对几轮特定营销活动的响应情况(如AcceptedCmp1、AcceptedCmp2等)。
- NumWebVisitsMonth:过去一个月内访问公司网站的次数。
- AcceptedCmp3、AcceptedCmp4、AcceptedCmp5、AcceptedCmp1、AcceptedCmp2:表示客户是否接受了第3、4、5、1、2轮的营销活动。
- Complain:客户是否在最近两年内投诉过。
- Z_CostContact、Z_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_