无监督学习(Unsupervised Learning)可以分为两种:
化繁为简
1、聚类
2、降维
无中生有
对于无监督学习(unsupervised learning)来说,通常我们会知道
(
x
,
y
^
)
(x,\hat{y})
(x,y^)中的
x
x
x或者
y
^
\hat{y}
y^,其中:
化繁为简就是把复杂的输入变成比较简单的输出,比如把一些没有打标签的树的图片变成一颗抽象的树,此时训练数据就只有输入
x
x
x,而没有输出
y
^
\hat{y}
y^。
无中生有就是随机给函数一个数字,他就会生成不同的图像,此时训练数据没有输入
x
x
x,只有输出
y
^
\hat{y}
y^。
聚类
聚类就是把相近的样本划分为同一类,比如对下面没有标签的图像进行分类,手动打上类群1,类群2,类群3的标签,这个分类的过程就是化繁为简的过程。
1、K-means(K均值聚类算法)
有一些无标记的数据
(
x
1
,
.
.
.
,
x
n
,
.
.
.
,
x
N
)
(x^{1},...,x^{n},...,x^{N})
(x1,...,xn,...,xN),我们需要把它划分为K个类群。
对每个类群都要找出一个中心
c
i
c^{i}
ci,
i
ϵ
{
1
,
2
,
.
.
.
.
K
}
i\epsilon \left \{ 1,2,....K \right \}
iϵ{1,2,....K},开始的时候可以从训练数据里随机挑选K个对象
x
n
x^{n}
xn出来作为K个中心的
c
i
c^{i}
ci的初始值。
遍历所有的对象
x
n
x^{n}
xn,并判断它属于哪一个类群,如果
x
n
x^{n}
xn与第i个类群的中心
c
i
c^{i}
ci最接近,那他就属于该类群,我们可以用
b
i
n
=
1
b_{i}^{n}=1
bin=1来表示第n个对象属于第i个类群,
b
i
n
=
0
b_{i}^{n}=0
bin=0表示不属于。
更新中心center:把每一个类群里的所有对象取平均值作为新的中心,即新的中心
c
i
=
∑
x
n
b
i
n
x
n
/
∑
x
n
b
i
n
c^{i} = \sum_{x^{n}}^{}b_{i}^{n}x^{n}/\sum_{x^{n}}^{}b_{i}^{n}
ci=∑xnbinxn/∑xnbin
然后反复以上操作,直到收敛。
2、HAC
Hierarchical Agglomerative Clustering(层次聚类)
假如有5个样本点,要做聚类:
1、building a tree
整个过程类似建立Huffman tree,但是Huffman是根据词频, 而HAC是根据相似度建树:
对五个样本点两两计算相似度,挑出最相似的一对,比如样本点1和2.
将样本点1和2进行合并(可以对两个向量取平均),生成代表这两个样本点的新结点。
此时将剩下的结点,重复上述的步骤再进行样本点合并,知道只剩下一个结点。
2、选取阈值
形象的说,就是在构造好的树上横着切一刀,相连的叶结点属于同一个类别。
下图中,不同颜色的横线和叶节点上不同颜色的方框对应着切法与类别的分法。
HCA和K均值最大的区别在于如何决定类别的数量,在K-means里,K的值是要直接决定的,而在HAC里,并不需要直接决定分多少类别,而是去决定这一刀切在树的哪个位置。
降维(Dimension Reduction)
聚类的缺点是以偏概全,它强迫每个对象都要属于某个类别。
但是实际上某个对象可能拥有多种属性,或者多个类别的特征,如果把它强制归为某个类别,就会失去很多信息;我们应该用一个向量描述该对象,这个向量的每一维都代表对象的某种属性,这种方式是分布式表示或是降维。
如果原来的对象是高维度的比如图像,那现在用它的属性来描述自身,就可以使之从高维空间转变为低维空间,这就是所谓的降维。
降维的效果:
假设data为下图左侧中的3D螺旋式分布,你会发现用3D的空间来描述这些data其实是很浪费的,因为我们完全可以把这个卷摊平,此时只需要用2D的空间就可以描述这个3D的信息。
如何进行降维:
在Dimension Reduction里,我们要找一个function,这个function的input是原始的x,output是经过降维之后的z
最简单的方法是Feature Selection(特征选择),即直接从原有的dimension里拿掉一些直观上就对结果没有影响的dimension,就做到了降维,比如下图中从
x
1
,
x
2
x_{1},x_{2}
x1,x2两个维度中直接拿掉x_{1};但这个方法不总是有用,因为很多情况下任何一个dimension其实都不能被拿掉,就像下图中的螺旋卷.
另一个常见的方法叫做PCA(Principe Component Analysis)
PCA认为降维就是一个很简单的linear function,它的input x和output z之间是linear transform,即 z = w x z = wx z=wx,PCA要做的,就是根据一大堆的x把W给找出来(现在还不知道z长什么样子)