[机器学习复习笔记] Clustering 聚类 (K-means实现)

Cluster (KMeans实现)

1. KMeans 介绍及符号说明

给定样本集 D={x1,x2,...,xm}KMeans 算法针对聚类所得的簇划分 C={C1,C2,...,Ck}(分为 k 类) 最小化平方差:

  • 平方差
    其中 x 为当前簇 Ci 中的样本向量,μi 为簇 Ci均值向量

E=i=1kxCi||xμi||22

  • 均值向量

μi=1|Ci|xCix

  • 样本向量 xj 与均值向量 μi 之间的距离,dji=distf(xj,μi),其中函数 f 可以是 闵可夫斯基距离欧几里得距离 或者 曼哈顿距离

    • 闵可夫斯基距离

    distmk(xi,xj)=(u=1d|xiuxju|p)1p

    • 欧几里得距离
      p 取2时,闵可夫斯基距离即为欧几里得距离

    disted(xi,xj)=u=1d|xiuxju|2

    • 曼哈顿距离
      p 取1时,闵可夫斯基距离即为曼哈顿距离

    distman(xi,xj)=||xixj||1=u=1d|xiuxju|


2. KMeans算法过程

K-Means 算法就是求解最优化问题:

C=argminCE(C)=argminCi=1kxCi||xμi||2

相似的样本被聚集到同一类别后,使得损失函数 E 最小。

具体迭代方法如下:



一般情况下,为了避免运行时间过长,会设置一个最大迭代轮数或者最小调整幅度阈值,当超过最大轮数或者小于最小阈值时,退出循环。


3. KMeans 代码

from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import accuracy_score

df = datasets.load_iris()
X, y = df['data'], df['target']
X = MinMaxScaler().fit_transform(X)

# 设定初始质心 KMeans是无监督学习 为了让结果和target进行比较 人工设置初始质心
init = np.array([X[y==0].mean(axis=0), X[y==1].mean(axis=0), X[y==2].mean(axis=0)])
print("初始质心: \n", init, end="\n\n")

# 分成三类
model = KMeans(n_clusters=3, n_init=init)

# 模型训练
model.fit(X)

# 输出迭代之后的质心
centroid = model.cluster_centers_
print("经过迭代之后质心为: \n", centroid, end="\n\n")

# 测试集 测试结果显示
y_pred = model.predict(X)

# 模型准确率测试
accuracy = accuracy_score(y, y_pred)
print("测试准确率为: ", accuracy, end="\n\n")
posted @   MarisaMagic  阅读(153)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示