机器学习算法-k-means
今天我们用 「超市顾客分组」 的例子来讲解K-means算法,从原理到实现一步步拆解,保证零基础也能懂!
🛒 例子背景
假设你是超市经理,手上有顾客的以下数据:
顾客ID | 每月消费金额(元) | 每周到店次数 |
---|---|---|
1 | 3000 | 2 |
2 | 5000 | 8 |
3 | 3500 | 3 |
4 | 7000 | 6 |
5 | 2000 | 1 |
你想把顾客分成 3个群体,分别制定营销策略,该怎么做?
🌟 K-means原理
1. 核心思想
"物以类聚" —— 让相似特征的顾客自动聚成一类
➡️ 通过计算距离,把数据划分到最近的簇(cluster)
2. 算法步骤
1️⃣ 随机选3个初始中心点(比如选顾客1/2/3作为初始中心)
2️⃣ 把所有顾客分到最近的中心(按距离计算)
3️⃣ 重新计算中心点(取各簇的平均值)
4️⃣ 重复2-3步直到中心点不再变化
3. 距离计算(欧氏距离)
比如顾客4(7000,6)到中心点(5000,8)的距离:
√[(7000-5000)² + (6-8)²] = √(4,000,000 + 4) ≈ 2000
🎯 具体分步演示
初始随机中心:
-
中心1:顾客1 (3000,2)
-
中心2:顾客2 (5000,8)
-
中心3:顾客3 (3500,3)
第一轮分组:
-
顾客4到三个中心的距离:
-
到中心1:√[(7000-3000)²+(6-2)²] ≈ 4000
-
到中心2:≈2000
-
到中心3:≈3504
→ 归到中心2的簇
-
-
同理分组其他顾客
重新计算中心:
-
中心2的新位置 = (5000+7000)/2=6000, (8+6)/2=7 → (6000,7)
重复直到稳定(通常3-5轮)
🛠️ Python代码实现
from sklearn.cluster import KMeans
import numpy as np# 准备数据
X = np.array([[3000, 2],[5000, 8],[3500, 3],[7000, 6],[2000, 1]
])# 创建模型(分3类)
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)# 查看结果
print("簇中心点坐标:\n", kmeans.cluster_centers_)
print("各顾客所属簇:", kmeans.labels_)# 预测新顾客
new_customer = np.array([[4000, 4]])
print("新顾客所属簇:", kmeans.predict(new_customer))
输出示例:
簇中心点坐标:[[ 3333.33 2. ] # 低频低消费组[ 6000. 7. ] # 高频高消费组[ 2000. 1. ]] # 低频低消费组(可能异常值) 各顾客所属簇: [0 1 0 1 2] 新顾客所属簇: [0]
📊 结果解读
簇号 | 特征 | 营销策略 |
---|---|---|
0 | 中等消费,低频到店 | 发送折扣券刺激消费 |
1 | 高消费,高频到店 | 推送VIP专属福利 |
2 | 低消费,低频到店 | 发送新商品试用邀请 |
🔍 关键细节
-
如何选K值?
-
肘部法则(Elbow Method):观察不同K值时误差下降的拐点
-
-
特征标准化很重要!
-
消费金额(3000-7000)和到店次数(1-8)量纲不同,需先标准化:
from sklearn.preprocessing import StandardScaler X_scaled = StandardScaler().fit_transform(X)
-
-
算法局限性
-
对初始中心敏感(可能局部最优)→ 多跑几次选最好结果
-
只适合球形分布数据(对复杂形状需用DBSCAN等算法)
-
🌰 实际应用场景
-
用户画像:电商用户分群
-
图像压缩:用16种颜色代表所有像素(K=16)
-
异常检测:离所有中心点远的点可能是异常