K-means原理
K-means步骤
- 随机设置K个特征空间内的点作为初始的聚类中心
- 对去其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心作为标记类别
- 接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
- 如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程
K-means性能评估指标
轮廓系数
计算公式:
注:对于每个点i为已聚类数据中的样本,为i到其他族群的所有样本的距离最小值,
为i到本身族群的距离平均值
最终计算出所有样本点的轮廓系数平均值
K-means总结
特点:采用迭代试算法,直观易懂并且非常实用
缺点:容易收敛到局部最优解(多次聚类)
注意:聚类一般做在分类之前
sklearn K-meansAPI:sklearn.cluster.KMeans
sklearn K-means性能评估API:sklearn.metrics.silhouette_score
# -*- coding: utf-8 -*-
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 读取数据
# 订单信息 order_id, product_id
prior = pd.read_csv("./instacart/order_products__prior.csv")
# 商品表 product_id, aisles_id
products = pd.read_csv("./instacart/products.csv")
# 用户与订单表 user_id, order_id
orders = pd.read_csv("./instacart/orders.csv")
# 商品名称表 aisle_id, aisles
aisles = pd.read_csv("./instacart/aisles.csv")
# 合并四张表到一张表
mg = pd.merge(prior, products, on=["product_id", "product_id"])
mg = pd.merge(mg, orders, on=["order_id", "order_id"])
merge_csv = pd.merge(mg, aisles, on=["aisle_id", "aisle_id"])
# 将数据变成行:用户, 列:物品类别名称 分组 交叉表; 特殊的分组
user_aisle = pd.crosstab(merge_csv["user_id"], merge_csv["aisle"])
# print(user_aisle.shape)
# 进行主成分分析
pc = PCA(n_components=0.9)
data = pc.fit_transform(user_aisle)
"""聚类 K-means"""
# 假设已经知道类别 4
cust_cluster = data[: 500] # 取500个做聚类,可以取全部
# 实例化K-means
km = KMeans(n_clusters=4)
km.fit(cust_cluster)
predict = km.predict(cust_cluster)
print(predict)
# 计算聚类的效果
score = silhouette_score(cust_cluster, predict)
print(score)