赞
踩
K-means 算法是一种经典的无监督学习方法,用于对未标记的数据集进行分群,即将数据集中相似的对象划分为不同的簇。以下是其基本原理:
1. 初始化:
2. 分配对象到簇:
3. 更新聚类中心:
4. 判断收敛与迭代:
上述过程反复进行,直到聚类中心的位置不再显著变化或达到预设的迭代次数上限。最终得到的簇即为数据集中的自然结构划分,每个簇内的对象在特征空间中较为接近,而不同簇之间的对象相对较远。
K-means 聚类因其简单、高效的特点,在众多领域中有着广泛应用,包括但不限于:
1. 数据挖掘与分析:
2. 图像处理与计算机视觉:
3. 生物医学研究:
4. 其他领域:
尽管 K-means 算法简单易用,但在实际应用中可能会遇到一些挑战,为此研究人员提出了多种优化与改进策略:
1. 初始聚类中心的选择:
2. 距离度量与标准化:
3. 处理不同类型数据与噪声:
4. 动态调整簇数量 K:
5. 并行与分布式计算:
6. 异质聚类:
7. 高维数据聚类:
8. 时间序列与流数据聚类:
9. 加权 K-means 聚类:
10. 聚类后处理与评估:
综上所述,通过对 K-means 聚类算法进行适当的优化与改进,我们可以应对更广泛的数据类型、规模、特性和应用场景,提高聚类的准确性和效率,使其在实际问题中发挥更大的作用。同时,结合领域知识和具体需求,灵活运用各种策略和方法,有助于获得更为满意的聚类结果。
以下是一个使用 K-means 聚类算法进行客户细分的简单实例。在这个例子中,我们假设有一家电商公司收集了其部分客户的购买历史数据,包括两个主要特征:年度消费金额(Annual_Spending
)和购物频次(Purchase_Frequency
)。公司希望通过 K-means 聚类算法将客户分为不同的群体,以便制定更具针对性的营销策略。
数据准备:
假设我们有一个包含 n
个客户的样本数据集 dataset
,其中每个客户记录由两列组成:
dataset = [
[Annual_Spending_1, Purchase_Frequency_1],
[Annual_Spending_2, Purchase_Frequency_2],
...
[Annual_Spending_n, Purchase_Frequency_n]
]
实施 K-means 聚类:
k
个初始聚类中心,这里假设 k=3
,可以随机从数据集中抽取 k
个样本作为初始聚类中心。import numpy as np
k = 3
initial_centers = np.random.choice(dataset, k, replace=False)
迭代过程:
def euclidean_distance(sample, center):
return np.sqrt(np.sum((sample - center)**2))
clusters = [[] for _ in range(k)]
for sample in dataset:
distances = [euclidean_distance(sample, center) for center in initial_centers]
closest_cluster_index = np.argmin(distances)
clusters[closest_cluster_index].append(sample)
new_centers = []
for cluster in clusters:
if cluster:
mean = np.mean(cluster, axis=0)
new_centers.append(mean)
else:
# 如果某个聚类为空,可以重新随机选择一个样本作为中心,或者使用前一轮的中心
new_centers.append(initial_centers[np.random.randint(k)])
收敛判断:比较新旧聚类中心的变化,如果变化小于某个设定阈值或达到最大迭代次数,则停止迭代;否则,用新聚类中心替换旧中心,继续下一轮迭代。
convergence_threshold = 0.01
max_iterations = 100
iteration = 0
while iteration < max_iterations:
old_centers = initial_centers.copy()
initial_centers = new_centers
# ... 重复步骤 2 中的分配样本和更新聚类中心操作
# ... 计算新旧聚类中心之间的差异,并判断是否满足收敛条件
# 如果未达到收敛条件,增加迭代计数器并继续下一轮
iteration += 1
# 当算法收敛或达到最大迭代次数时,输出最终的聚类结果
结果解释与应用:
经过 K-means 聚类后,我们得到了三个客户群体(假设 k=3
)。每个群体代表一类具有相似消费行为的客户,可以根据聚类结果分析:
以上实例展示了如何使用 K-means 聚类算法对客户数据进行细分。实际应用中,可能还需要对数据进行预处理(如标准化或归一化)、选择合适的 k
值(可以通过肘部法则、轮廓系数等方法确定)、以及对聚类结果进行可视化(如使用散点图展示不同群体在特征空间中的分布)等步骤。
上述实例展示了 K-means 聚类算法的基本应用流程。接下来,我们将对实例进行补充和完善,包括数据预处理、确定 K 值、结果可视化以及对聚类结果的解释与应用。
1. 数据预处理:
在实际应用中,数据往往需要进行预处理以提高聚类效果。在这个例子中,由于年度消费金额和购物频次的量纲和数值范围可能存在较大差异,我们对其进行标准化处理:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_dataset = scaler.fit_transform(dataset)
标准化后的数据将具有零均值和单位方差,有助于消除特征间的尺度差异,使得距离计算更加公平。
2. 确定 K 值:
K-means 聚类算法需要预先指定簇的数量 k
。在这里,我们使用肘部法则来帮助确定一个合适的 k
值。肘部法则通过观察随着 k
增大,轮廓系数或簇内平方和(inertia)的变化趋势,选择拐点(即“肘部”)处的 k
值。
from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score inertias = [] silhouette_scores = [] for k in range(2, 11): # 测试 2 到 10 个簇 kmeans = KMeans(n_clusters=k).fit(scaled_dataset) inertias.append(kmeans.inertia_) silhouette_scores.append(silhouette_score(scaled_dataset, kmeans.labels_)) plt.figure(figsize=(10, 6)) plt.subplot(1, 2, 1) plt.plot(range(2, 11), inertias, marker='o') plt.title('Elbow Method: Inertia vs. Number of Clusters') plt.xlabel('Number of Clusters (k)') plt.ylabel('Inertia') plt.subplot(1, 2, 2) plt.plot(range(2, 11), silhouette_scores, marker='o') plt.title('Silhouette Score vs. Number of Clusters') plt.xlabel('Number of Clusters (k)') plt.ylabel('Silhouette Score') plt.tight_layout() plt.show() # 根据图形判断“肘部”位置,选择合适的 k 值
3. 结果可视化:
使用散点图将聚类结果可视化,可以帮助我们直观理解不同客户群体在年度消费金额和购物频次特征空间中的分布。
def plot_clusters(dataset, labels, centers):
plt.figure(figsize=(8, 6))
plt.scatter(dataset[:, 0], dataset[:, 1], c=labels, cmap='viridis', alpha=0.8)
plt.scatter(centers[:, 0], centers[:, 1], marker='X', s=150, color='red', label='Cluster Centers')
plt.xlabel('Annual Spending (Standardized)')
plt.ylabel('Purchase Frequency (Standardized)')
plt.legend()
plt.show()
k = 3 # 假设通过肘部法则确定 k=3
kmeans = KMeans(n_clusters=k).fit(scaled_dataset)
labels = kmeans.labels_
centers = kmeans.cluster_centers_
plot_clusters(scaled_dataset, labels, centers)
4. 聚类结果的解释与应用:
根据散点图和聚类结果,我们可以对三个客户群体进行如下解读和应用策略:
群体 0:低年度消费金额、低购物频次的客户,可能对价格敏感。营销策略:推送优惠券、特价商品,鼓励他们增加消费。
群体 1:中等年度消费金额、中购物频次的客户,具有一定忠诚度但购物频率不高。营销策略:定期发送新品推荐、促销活动通知,保持其购物活跃度。
群体 2:高年度消费金额、高购物频次的客户,为公司的高价值客户。营销策略:提供 VIP 服务、优先权益,维护其满意度和忠诚度,确保长期价值贡献。
至此,我们完成了使用 K-means 聚类算法对客户数据进行细分的完整过程,包括数据预处理、确定 K 值、结果可视化以及对聚类结果的解释与应用。这些步骤有助于电商公司制定有针对性的营销策略,提升客户管理与服务效果。
python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)
50个开发必备的Python经典脚本(41-50)
————————————————
最后我们放松一下眼睛
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。