K-means 算法是无监督的 聚类算法,算法简单,有效。
K-means算法:
输入参数:
指定聚类数目 k,训练集 X
输出 :
k 个聚类
算法描述:
K-means 算法 是一个 迭代算法,每次迭代分成两个步骤:
1)指定聚类步骤:
计算每个样本到 k 个 聚类中心的 距离,将样本归类到 距离 聚类中心 最小的那个类别
2)移动聚类中心步骤:
根据每个聚类所拥有的样本点,重新计算每个聚类的中心
伪代码描述:
随机初始化 k 个聚类的 中心 u(1), u(2)... u(k)
repeat {
for i = 1 to m # 假设有m 个样本
c(i) = 聚类中心 离 X(i) 最近的那个聚类的下标索引 #(1,2... k)
for i = 1 to k # k 个类别
u(i) = 属于 i 聚类所有 点的 平均值,即 中心
}
注意:停止条件可以自己设定,比如 归类不再发生变化,或者最多 N次迭代 等
K-means算法 = 优化问题:
K-means的优化目标:
J(c(1), c(2)...c(m), u(1), u(2)...u(k)) = 1/2 * sum( ||x(i) - uc(i) || ^2)
min J
对应到算法:
1)指定聚类步骤时,保持聚类中心不变,通过改变每个样本所属聚类来最小化 J;
2)移动聚类中心步骤时,通过移动调整聚类中心 来 最小化 J。
K-means算法存在问题:
往往K-means算法的解空间存在多个满足 J 局部最小值,因此K-means算法得到的解,很有可能只是满足 J 局部最小的那个解,而不是全局最小的那个解。
一种避免方案:
运行 K-means 算法 n 次,比如 n = 100 次,每次 都是 随机初始化 k 个 聚类中心, 然后迭代最后收敛得到 k 个 聚类。
最后,依此计算 这 n 次 J 值,选择 J 值 最小那次 得到的 k 个 聚类
如何选择 k?:
计算 J 随着 k 数目变化 而 如何变化,k = 1, 2 ..
如果选择的 k 是 发生比较明显转折的那个点,就叫做 elbow method