聚类(Clustering)是无监督学习:输入只有特征,没有已知目标标签;算法依据相似度把对象分组。聚类得到的编号只是算法发现的模式,不自动等于真实、已验证的业务类别。目标是找到组内较紧密、组间有意义差异、并且对任务有用的分组。
与监督学习对比:分类根据已有标签学习预测类别;聚类则从无标签数据中探索可能的群组。
Lab 6 使用 300 个模拟客户,采用三项行为特征:
| 特征 | 含义 | 解读方向 |
|---|---|---|
avg_spend |
平均每笔消费金额(美元) | 越高代表单笔消费越高 |
purchase_freq |
近 3 个月购买次数 | 越高代表购买越频繁 |
recency_days |
距最近一次购买的天数 | 越低代表最近有购买 |
每位客户可表示为特征向量,例如 $x=[avg\_spend, purchase\_freq, recency\_days]$。customer_id 只用于识别客户,不能参与缩放或距离计算。
常用欧氏距离:$d(x,z)=\sqrt{\sum_j(x_j-z_j)^2}$。距离越小,特征表现越相似。由于美元、次数、天数的量纲不同,先对每项特征做 Z-score 标准化:
“标准化是把不同单位的数据转换到可比较的尺度上”
Z=(value-mean)/std
标准化后各特征大致均值为 0、标准差为 1,避免数值范围较大的特征不成比例地支配距离。
如果直接计算距离,数值范围较大可能对距离产生更大的影响,使其他特征的作用被削弱。
Example:保存客户 ID 和标准化后的特征;get_features() 返回特征,distance(other) 计算两条特征向量的距离(默认欧氏距离)。Cluster:保存成员和质心(centroid);质心是成员特征的均值。update(new_examples) 更新成员、重算质心并返回质心移动距离;variability() 计算成员到质心的平方距离总和。K-means的目标是把数据分成K个群体,每个群体拥有一个质心。