目录
🍉简介
🍈K-means聚类模型详解
🍈K-means聚类的基本原理
假设我们有一个数据集${x_1, x_2, \ldots, x_n}$,其中每个数据点$x_i$是一个d维向量。我们需要将这些数据点分成K个簇${C_1, C_2, \ldots, C_K}$。K-means的优化目标可以表示为:
其中,$\mu_k$表示簇$C_k$的质心。
🍈K-means聚类的算法步骤
K-means聚类算法主要包括以下步骤:
🍈K-means聚类的优缺点
🍍优点
🍍缺点
🍈K-means聚类的应用场景
K-means聚类在实际中有广泛的应用,包括但不限于:
🍈K-means的改进和变体
为了克服K-means的一些缺点,研究人员提出了许多改进和变体方法:
🍉K-means聚类算法示例
🍈问题
假设我们是一家电子商务公司,希望通过分析客户的购买行为,将客户分成不同的群体,以便进行有针对性的市场营销。我们拥有以下客户数据集:
🍍数据准备
首先,我们需要对数据进行预处理和标准化,因为不同特征的量纲可能会影响聚类效果。
import pandas as pd
from sklearn.preprocessing import StandardScaler
# 创建示例数据集
data = {
'CustomerID': [1, 2, 3, 4, 5],
'Age': [25, 34, 45, 23, 35],
'Annual Income (k$)': [15, 20, 35, 60, 45],
'Spending Score (1-100)': [39, 81, 6, 77, 40]
}
df = pd.DataFrame(data)
# 标准化特征
scaler = StandardScaler()
df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']] = scaler.fit_transform(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])
🍍选择K值
通常情况下,选择K值可以通过“肘部法则”来确定。我们绘制不同K值下的SSE(误差平方和)曲线,选择拐点作为K值。
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 计算不同K值下的SSE
sse = []
for k in range(1, 11):
kmeans = KMeans(n_clusters=k, random_state=0)
kmeans.fit(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])
sse.append(kmeans.inertia_)
# 绘制肘部法则图
plt.figure(figsize=(8, 5))
plt.plot(range(1, 11), sse, marker='o')
plt.title('Elbow Method for Optimal K')
plt.xlabel('Number of clusters')
plt.ylabel('SSE')
plt.show()
假设通过肘部法则确定K值为3。
🍍运行K-means聚类
使用K-means算法对客户进行分群。
# 运行K-means聚类
kmeans = KMeans(n_clusters=3, random_state=0)
df['Cluster'] = kmeans.fit_predict(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])
# 查看聚类结果
print(df)
🍍分析聚类结果
通过可视化和统计分析,我们可以更好地理解每个簇的特征。
# 可视化聚类结果
plt.figure(figsize=(8, 5))
plt.scatter(df['Annual Income (k$)'], df['Spending Score (1-100)'], c=df['Cluster'], cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 1], kmeans.cluster_centers_[:, 2], s=300, c='red')
plt.title('Customer Segments')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.show()
此外,我们可以查看每个簇的中心和簇内数据点的分布情况:
# 查看每个簇的中心
centroids = kmeans.cluster_centers_
print("Cluster Centers:\n", centroids)
# 查看每个簇的样本数量
print(df['Cluster'].value_counts())
🍈完整代码实现
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 创建示例数据集
data = {
'CustomerID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'Age': [25, 34, 45, 23, 35, 64, 24, 29, 33, 55],
'Annual Income (k$)': [15, 20, 35, 60, 45, 70, 18, 24, 50, 40],
'Spending Score (1-100)': [39, 81, 6, 77, 40, 80, 20, 60, 54, 50]
}
df = pd.DataFrame(data)
# 标准化特征
scaler = StandardScaler()
df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']] = scaler.fit_transform(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])
# 计算不同K值下的SSE
sse = []
for k in range(1, 11):
kmeans = KMeans(n_clusters=k, random_state=0)
kmeans.fit(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])
sse.append(kmeans.inertia_)
# 绘制肘部法则图
plt.figure(figsize=(8, 5))
plt.plot(range(1, 11), sse, marker='o')
plt.title('Elbow Method for Optimal K')
plt.xlabel('Number of clusters')
plt.ylabel('SSE')
plt.show()
# 根据肘部法则选择K值为3
k = 3
# 运行K-means聚类
kmeans = KMeans(n_clusters=k, random_state=0)
df['Cluster'] = kmeans.fit_predict(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])
# 查看聚类结果
print(df)
# 可视化聚类结果
plt.figure(figsize=(8, 5))
plt.scatter(df['Annual Income (k$)'], df['Spending Score (1-100)'], c=df['Cluster'], cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 1], kmeans.cluster_centers_[:, 2], s=300, c='red', marker='x')
plt.title('Customer Segments')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.show()
# 查看每个簇的中心
centroids = kmeans.cluster_centers_
print("Cluster Centers:\n", centroids)
# 查看每个簇的样本数量
print(df['Cluster'].value_counts())
🍈代码解释
🍍导入必要的库:
🍍创建示例数据集:
🍍标准化特征:
🍍选择K值:
🍍运行K-means聚类:
🍍可视化聚类结果:
🍍查看聚类结果:
希望这些能对刚学习算法的同学们提供些帮助哦!!!