前面学习了监督学习的两大类问题:分类和回归。
后面就开始学习无监督学习:密度估计和聚类
首先了解一下监督学习和无监督学习的差别,这一点可以直接从我们输入的数据看出来
supervise learning :
{(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))}
unsupervise learning:
{x(1),x(2),...,x(m)}
显然,监督学习的数据都是成对出现,带有lable
y
,而无监督学习就没有
接下来开始一个聚类算法的学习,K-means
输入:
1. 随机初始
K
个中心点
2. 循环以下两个步骤:
- cluster assignment step: 找到
m
个点分别对应的距离最近的类,
- move centroid step: 分别计算
K
个类别的均值,作为新的中心点
(如果某个中心点所在的类一个点也没有,那么可以考虑把这个中心点去掉,把k个类变成k-1个类,也可以重新初始化k个中心点)
对于这个聚类算法,我们有如下的几个问题要解决:
1. 我们的k要怎么选取
2. 选定k以后,初始中心点
μk
要怎么选择
3. 如果出现了local optimal怎么办
4. optimization objective
optimization objective:
在监督学习中,我们都有一个cost function。在这里,我们显然也应有对应的
J
来进行衡量。于是,我们有distortion function :
其中 μc(i) 是第i个点所在的类的中心点。
那么 J 其实就是每个点和它所在类的中心点的欧氏距离和的均值。
我们的optimization objective 就是:
在K-means循环的过程中,两个step分别对应不同的优化目标:
assignment step:固定了
μk
,不断地调整
c(i)
move step:不断地优化
μk
k怎么选择?
主要还是靠人工的方法进行选择?可供参考的方法有:
elbow method:就是选择不同的k计算distortion function,看在哪一个k下出现了明显的转折点elbow,那么就选择那个k作为我们的目标K
但是有一个问题是,我们在实际运用的过程中,我们会发现k之间的弯折程度并没有那么大,没有明显的转折点,有多个k可以选择。
更一般的方法是,选择不同的k进行聚类,然后在后续的过程中使用不同的维度评估不同的k的效果
初始中心点的选择:
直接在给出的example里面选择k个点作为初始的中心点。
但是上述的选择方法有时候容易出现local optimal,我们怎么解决:
在
K
=2 - 10 之间的时候,我们使用multiple random initialization多次随机初始化的方法。不要就把一次聚类的解决当成最后的结果。要运行K-means算法多次,然后选择其中最小的distortion function
当然,在
K
<script type="math/tex" id="MathJax-Element-22">K</script>比较大的时候,前面的这种方法的效果就比较有限了。