1. 理解聚类
聚类是一种无监督的机器学习任务,它可以自动将数据划分成类cluster。因此聚类分组不需要提前被告知所划分的组应该是什么样的。因为我们甚至可能都不知道我们再寻找什么,所以聚类是用于知识发现而不是预测
2. K-Means聚类的原理
(1) K代表要把数据分为几类,比如上面的例子,要把科学家分为3类,那么K的值为3,然后在已有数据中随机找3个点为中心点,比如,以下A、B、C3个点(有颜色的那三个点)为中心点
(2) 分别求剩余的点和3个中心点之间的距离,可以选择不同的计算距离的方法,不同的方法所得的结果会有差距,而且迭代的次数也不一样
(3) 使用距离来分配和更新类
第一次跌代的过程:
把每个点到3个中心点的距离作比较,把距离在某个范围内的一些点划分为一类,比如某个到A的距离为10,到B的距离为15,到C的距离为3,那么这个点与C是一类
第二次迭代:
把3个中心点的位置,设置为上一步已经聚好的三个类的中心点,再进行迭代,重新计算距离,在进行聚类,那么可能上次结果中,原来属于B类的一个点,在这个迭代中划分到A类中,那么A类的B类的中心点又会改变
随着一次次中心点的变化,进行不断的迭代
(4) 收敛
当中心点的位置不再变化时,开始收敛,不再迭代,但这种情况几乎不会出现,通常设置一个阈值来结束收敛
(5) K-Means聚类的问题
a. 因为第一次跌代时中心点的选取是随机的,如果选取的中心点是这样的
那么每次迭代的结果都不一样,使得计算很长时间仍然不能收敛,K-Means原生算法本身没有解决这个问题,需要人为进行评估来决定是否收敛
K-means++ 和 K-Means 2 算法对第一次中心点的选择进行了改进
b. 实际情况中,我们往往不知道原有数据能分成几类,即K的值事先不好确定
通常使用肘部法来决定聚类的数量
3. 常用的求距离的方法
a. 欧式距离测度,就是两点间的距离
b. 平方欧式距离测度,欧式距离的平方
c. 曼哈顿距离测度
d. 余弦距离测度(适用于文本)
e. 谷本距离测度,同时比较夹角和距离的测度
f. 加权距离测度,欧式距离中加了权重
4. 使用Mahout做K-Means聚类
Mahout做K-Means聚类的命令格式:
MAHOUT_HOME/bin/mahout kmeans
--input # 输入路径
--output # 输出路径
--distanceMeasure # 距离测度方法
--numClusters # K的值
--randomSeed <randomSeed1> [<randomSeed2> ...]
--convergenceDelta # 收敛的阈值
--maxIter # 最大迭代次数
--overwrite # 结果以覆盖形式追加
--clustering # 只有加这个选项才会执行聚类
--method # 选择单机运行还是mapreduce
--tempDir <tempDir> # 临时文件存放目录
--clusters (-c)
# 可以简写为-c
# 指定中心点所在的位置,但必须写为SequenceFile文件
# 如果指定了K的值,那么即使这里设置了中心点位置的文件
# 也会按照随机方式来取中心点
# 如果写为 -c canopy,那么第一次迭代会是一次canopy迭代
5. Canopy聚类
canopy聚类只进行一次迭代,通常不会单独使用,而把它作为K-Means聚类的第一次迭代来使用,为了使得K-Means聚类的第一次迭代时选取的中心点更合理,它的选取中心点的策略如下: