Week8:Unsupervised Learning非监督学习
Supervised learning & Unsupervised learning 监督学习与非监督学习
Supervised learning 监督学习:给出y值,已经为数据提供label了
Unsupervised learning 非监督学习:从未标记的数据中学习,要求算法替我们分析出数据的结构
Clustering 聚类算法
聚类算法是一种非监督学习算法,希望把数据分成有紧密关系的子集或者簇
K-means K均值算法
K-means是一种聚类算法,是一个迭代方法,要做的有两件事,一是Cluster Assignment簇分配,二是Move Centroid移动聚类中心
- 先随机选取K个点作为聚类中心(为了聚集出K个类),
- 计算到聚类中心的距离然后进行簇分配
- 计算类的均值并移动聚类中心到均值处
- 重复2、3步骤知道聚类中心位置不变
下面是个分为了两类的K-means算法的例子
先随机选取两个聚类中心
根据这两个聚类中心对靠近他们的点归为一类
移动这两个聚类中心到其同类点的均值处
再对这两个聚类中心对靠近他们的点归为一类
然后移动这两个聚类中心到其同类点的均值处
再对这两个聚类中心对靠近他们的点归为一类
然后移动这两个聚类中心到其同类点的均值处
重复迭代簇分类和移动两个步骤,发现聚类中心位置不变,K-means算法收敛了
具体步骤
* 簇分配:对1到m个训练集的点进行循环,
c(i)赋值为
K个聚类中心中最接近
x(i)
的那个聚类中心的下标(1~K)即
mink||x(i)−μk||2
* 移动聚类中心:对1到K个聚类中心进行循环,计算出同类点的平均值并赋值给聚类中心
μk
如果出现某一个聚类中心没有与其同类的点,那么我们可以移除该聚类中心(就是使得聚类中心总数由K变为K-1)或者是随机再选取该聚类中心的位置,当然第一种方式更为常见
K-means算法还可以用于分割没有很好隔离的簇,如上右图
Optimization Objective 优化目标函数即代价函数
在K-means算法中代价函数又称为Distortion Cost Function 失真代价函数
μc(i) :代表 x(i) 其所在类的ClusterCentroid聚类中心
在每次迭代中,先改变
c(1),c(2),...c(m)
的值来最小化J(…)(保持
μ1,μ2,...μK
不变),然后改变
μ1,μ2,...μK
的值最小化J(…)。即把
μ
和
c
两组变量分割开来最小化
因此正常情况下
J(c(1),...,c(m),μ1,...,μK)
的值应当是逐渐下降直到收敛的
Random Initialization 随机初始化
必须保证 K<m 即聚类中心数K比训练样本数m小
- 从整数 {1,...,m} 中随机选取K个整数 i1,...,iK (即从m个样本中随机选取k个训练样本)
- 令 μ1=x(i1),...μK=x(iK) (即让聚类中心位于刚刚随机选出的K个训练样本)
上图左下的两个情况是通过最小化
J(c(1),...,c(m),μ1,...,μK)
代价函数得到的,但仍然不能得到很好的结果,因为这个是个局部最优解,是由随机初始化的初始点不对导致的。
解决方法是尝试多次随机初始化,并运行K-means算法很多次,使其尽可能得到全局最优的结果
在这一百种聚类分类方法中选取lowest cost
J(c(1),...,c(m),μ1,...,μK)
如果K的值比较小(2~10)之间的话,就要多次随机初始化,因为随机初始化会对结果造成较大影响,做多次有利于找到更好的数据聚类结果;如果K的值很大,那么可能第一次随机初始化的结果就已经比较好了,做多次随机初始化的结果可能会更好但不会好太多
选择聚类数目 K
没有特别明确的方法,因为聚类的数目是模棱两可的,不同人看来有不同的聚类数目,非监督学习就是这样,没有确定的Label所以没有确定的答案
选择聚类数目有一个肘部法则(Elbow method)
上图中的左图中costfunction在K=3之后下降的没那么明显所以选择K=3
但上图中的右图就不明显了,因为曲线看起来像是连续的,肘点的位置并不明显
实际中右图的情况更多所以肘部法则并不是很常用,但是个值得尝试的方法
一般来说,K越大,J的值越小
决定K的值的方法可以结合实际,一般都是人工选择的K
Dimensionality Reduction 维数约简
这是与聚类不同的另一种非监督学习的问题
使用维数约简(降维)的一种应用是DataCompression 数据压缩,他可以节约计算机的内存和硬盘空间然后提高运行效率
例如有m个数据,下面的例子就是从二维到一维(2D to 1D)
在Data Compression的实际应用中(1000D to 100D)将会很常见
另一种应用是Data Visualization数据可视化
即用一个特定的函数表达式把多个特征变量集中到同一个特征变量上,最后只留下几个合成的特征变量(一般最后是是2个或3个,因为2D/3D图像有利于绘制),然后有利于绘制图像并理解数据
Principal Component Analysis 主成分分析(PCA)
这是一种非监督学习算法
PCA的数学原理
基变换的矩阵表示
⎛⎝⎜⎜⎜⎜p1p2⋮pR⎞⎠⎟⎟⎟⎟(a1a2⋯aM)=⎛⎝⎜⎜⎜⎜p1a1p2a1⋮pRa1p1a2p2a2⋮pRa2⋯⋯⋱⋯p1aMp2aM⋮pRaM⎞⎠⎟⎟⎟⎟
其中 pi 是一个行向量,表示第i个基, aj 是一个列向量,表示第j个原始数据记录。一般的,如果我们有M个N维向量,想将其变换为由R个N维向量表示的新空间中,那么首先将R个基按行组成矩阵A,然后将向量按列组成矩阵B,那么两矩阵的乘积AB就是变换结果,其中AB的第m列为A中第m列变换后的结果。
特别要注意的是,这里R可以小于N,而R决定了变换后数据的维数。也就是说,我们可以将一N维数据变换到更低维度的空间中去,变换后的维度取决于基的数量。因此这种矩阵相乘的表示也可以表示降维变换。但是这种变换不可避免会导致数据丢失,需要合理选择R维的基使得结果最优即最大程度保留原有信息。
最后,上述分析同时给矩阵相乘找到了一种物理解释:两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。
从这一段开始后面部分作者所写的东西都有助于理解
要在进行PCA之前先使用均值归一化和特征缩放
Andrew Ng的视频中对运用SVD降维讲的不够清楚,可以看下面这个链接的内容
SVD在推荐系统中的应用-
选择主成分的数量K
把N维特征变量降维到k维特征变量,k称为主成分的数量
平均平方映射误差 (Average Squared Projection Error) :
数据总变差(Total Variation in the Data):
选择K的准则是使得最后的结果有
即选择了k然后保留了99%的差异性( 99% of variance is retained)
0.05→5% 也是很常用,即选择了k然后保留了95%的差异性
左边为使用由K=1不断尝试直到上述值≤1%;右边为计算SVD中的
Σ
矩阵,找到符合要求的最小的k
[U,S,V]=svd(A)
记S矩阵(即
Σ
矩阵)的秩为n
即保留了99%的差异性
直接说10000维中保留了100维没有实际的意义,用保留了x%的差异性表示PCA的性能才有意义
即使在压缩很大比例的数据的情况下,也经常会发现PCA能够保留99%的差异性或者某些高百分比的差异性
使用PCA中需要注意的地方
由于数据维度比较高,学习算法运行效率比较低,使用PCA可以使我们降低数据的维数,从而使算法高效运行
PCA不是一个来解决过拟合的方法(虽然减少了特征向量的数目可能可以降低过拟合的概率但是PCA不应该被用来解决过拟合),因为PCA是在未知label标签Y的值的时候对数据进行降维,可能会舍弃对预测结果有用的一些信息。正则化对避免过拟合有更好的效果
在设计算法之前一般不要考虑直接使用PCA