1 Unsupervised Learning
1.1 k-means clustering algorithm
1.1.1 算法思想
1.1.2 k-means的不足之處
1.1.3 如何選擇K值
1.1.4 Spark MLlib 實現 k-means 算法
1.2 Mixture of Gaussians and the EM algorithm
1.3 The EM Algorithm
1.4 Principal Components Analysis
1.4.1 算法原理
1.4.2 奇異值與主成分分析(PCA)
1.4.3 Spark MLlib 實現PCA
參考文獻
附 錄
Andrew Ng 在斯坦福大學的CS229機器學習課程內容
中英文詞語對照
1. Unsupervised Learning
1.1 k-means clustering algorithm
1.1.1 算法思想
聚類其核心任務是:將一組目標object划分為若干個簇,每個簇之間的object盡可能的相似,簇與簇之間的object盡可能的相異。聚類算法是機器學習(或者說是數據挖掘更合適)中重要的一部分,除了最為簡單的K-Means聚類算法外,較常見的還有:層次法(CURE、CHAMELEON等)、網格算法(STING、WaveCluster等)等等。
較權威的聚類問題定義:所謂聚類問題,就是給定一個元素集合D,其中每個元素具有n個可觀察屬性,使用某種算法將D划分成k個子集,要求每個子集內部的元素之間相異度盡可能低,而不同子集的元素相異度盡可能高。其中每個子集叫做一個簇。
聚類屬於無監督學習,k-means 算法是聚類中最簡單的一種,但其思想卻不簡單。監督學習比如邏輯回歸、朴素貝葉斯和 SVM 等的訓練數據中已經包含了類別的標簽Y,而聚類的標簽中只包含特征X。
圖 無監督學習
在聚類問題中,給我們的訓練樣本是,每個。
K-means算法是將樣本聚類成k個簇(cluster),具體算法描述如下:
對於每一個類j,重新計算該類的質心
} |
即,
K是我們事先給定的聚類數,代表樣例i與k個類中距離最近的那個類,的值是1到k中的一個。質心代表我們對屬於同一個類的樣本中心點的猜測。
下圖展示了對n個樣本點進行K-means聚類的效果,這里k取2。
K-means面對的第一個問題是如何保證收斂,前面的算法中強調結束條件就是收斂,可以證明的是K-means完全可以保證收斂性。下面我們定性的描述一下收斂性,我們定義畸變函數(distortion function)如下:
J函數表示每個樣本點到其質心的距離平方和。K-means是要將J調整到最小。假設當前J沒有達到最小值,那么首先可以固定每個類的質心,調整每個樣例的所屬的類別來讓J函數減少,同樣,固定,調整每個類的質心也可以使J減小。這兩個過程就是內循環中使J單調遞減的過程。當J遞減到最小時,和c也同時收斂。(在理論上,可以有多組不同的和c值能夠使得J取得最小值,但這種現象實際上很少見)。
由於畸變函數J是非凸函數,意味着我們不能保證取得的最小值是全局最小值,也就是說k-means對質心初始位置的選取比較感冒,但一般情況下k-means達到的局部最優已經滿足需求。但如果你怕陷入局部最優,那么可以選取不同的初始值跑多遍k-means,然后取其中最小的J對應的和c輸出。
1.1.2 k-means的不足之處
首先對初值敏感,由於只能收斂到局部最優,初值很大程度上決定它收斂到哪里;
從算法的過程可以看出,k-means對橢球形狀的簇效果最好,不能發現任意形狀的簇;
對孤立點干擾的魯棒性差,孤立點,是異質的,可以說是均值殺手,k-means又是圍繞着均值展開的,原離簇的孤立點對簇的均值的拉動作用是非常大的。
針對這些問題后來又有了基於密度的DBSCAN算法,最近Science上發了另一篇基於密度的方法:Clustering by fast search and find of density peaks。基於密度的方法無論對clustering還是outliers detection效果都不錯,和 k-means不同,這些算法已經沒有了目標函數,但魯棒性強,可以發現任意形狀的簇。 另外如何自動確定k-means的k是目前研究較多的一個問題。
1.1.3 如何選擇K值
《大數據——互聯網大規模數據挖掘與分布式處理》中提到:給定一個合適的類簇指標,比如平均半徑或直徑,只要我們假設的類簇的數目等於或者高於真實的類簇的數目時,該指標上升會很緩慢,而一旦試圖得到少於真實數目的類簇時,該指標會急劇上升。
類簇的直徑是指類簇內任意兩點之間的最大距離。
類簇的半徑是指類簇內所有點到類簇中心距離的最大值。
下圖是當K的取值從2到9時,聚類效果和類簇指標的效果圖:
左圖是K取值從2到7時的聚類效果,右圖是K取值從2到9時的類簇指標的變化曲線,此處我選擇類簇指標是K個類簇的平均質心距離的加權平均值。從上圖中可以明顯看到,當K取值5時,類簇指標的下降趨勢最快,所以K的正確取值應該是5。
Andrew Ng 如是說:
1.1.4 Spark MLlib 實現 k-means 算法
測試數據
0.0 0.0 0.0 0.1 0.1 0.1 0.2 0.2 0.2 9.0 9.0 9.0 9.1 9.1 9.1 9.2 9.2 9.2 15.1 16.1 17.0 18.0 17.0 19.0 20.0 21.0 22.0 |
測試數據不用帶標簽,數據分為3個維度。
代碼示例
Java code
private static final Pattern SPACE = Pattern.compile(" ");
public static void main(String[] args) { SparkConf sparkConf = new SparkConf() .setAppName("K-Means") .setMaster("local[2]"); JavaSparkContext sc = new JavaSparkContext(sparkConf); JavaRDD<String> data = sc.textFile("/home/yurnom/data/kmeans_data.txt"); JavaRDD<Vector> parsedData = data.map(s -> { double[] values = Arrays.asList(SPACE.split(s)) .stream() .mapToDouble(Double::parseDouble) .toArray(); return Vectors.dense(values); });
int numClusters = 3; //預測分為3個簇類 int numIterations = 20; //迭代20次 int runs = 10; //運行10次,選出最優解 KMeansModel clusters = KMeans.train(parsedData.rdd(), numClusters, numIterations, runs);
//計算測試數據分別屬於那個簇類 print(parsedData.map(v -> v.toString() + " belong to cluster :" + clusters.predict(v)).collect()); //計算cost double wssse = clusters.computeCost(parsedData.rdd()); System.out.println("Within Set Sum of Squared Errors = " + wssse);
//打印出中心點 System.out.println("Cluster centers:"); for (Vector center : clusters.clusterCenters()) { System.out.println(" " + center); } //進行一些預測 System.out.println("Prediction of (1.1, 2.1, 3.1): " + clusters.predict(Vectors.dense(new double[]{1.1, 2.1, 3.1}))); System.out.println("Prediction of (10.1, 9.1, 11.1): " + clusters.predict(Vectors.dense(new double[]{10.1, 9.1, 11.1}))); System.out.println("Prediction of (21.1, 17.1, 16.1): " + clusters.predict(Vectors.dense(new double[]{21.1, 17.1, 16.1}))); }
public static <T> void print(Collection<T> c) { for(T t : c) { System.out.println(t.toString()); } } |
結果
[0.0,0.0,0.0] belong to cluster :0 [0.1,0.1,0.1] belong to cluster :0 [0.2,0.2,0.2] belong to cluster :0 [9.0,9.0,9.0] belong to cluster :1 [9.1,9.1,9.1] belong to cluster :1 [9.2,9.2,9.2] belong to cluster :1 [15.1,16.1,17.0] belong to cluster :2 [18.0,17.0,19.0] belong to cluster :2 [20.0,21.0,22.0] belong to cluster :2
Within Set Sum of Squared Errors = 38.533333333333815 Cluster centers: [0.10000000000000002,0.10000000000000002,0.10000000000000002] [9.1,9.1,9.1] [17.7,18.033333333333335,19.333333333333332] Prediction of (1.1, 2.1, 3.1): 0 Prediction of (10.1, 9.1, 11.1): 1 Prediction of (21.1, 17.1, 16.1): 2 |
1.2 Mixture of Gaussians and the EM algorithm
本節討論使用期望最大化算法(Exception-Maximization)進行密度估計(density-estimation)。
高斯模型有單高斯模型(SGM)和混合高斯模型(GMM)兩種。
單高斯模型
為簡單起見,閾值t的選取一般靠經驗值來設定。通常意義下,我們一般取t=0.7-0.75之間。
二維情況如下所示:
混合高斯模型
對於(b)圖所示的情況,很明顯,單高斯模型是無法解決的。為了解決這個問題,人們提出了高斯混合模型(GMM),顧名思義,就是數據可以看作是從數個高斯分布中生成出來的。雖然我們可以用不同的分布來隨意地構造 XX Mixture Model ,但是 GMM是 最為流行。另外,Mixture Model 本身其實也是可以變得任意復雜的,通過增加 Model 的個數,我們可以任意地逼近任何連續的概率密分布。
每個 GMM 由 K 個 Gaussian 分布組成,每個 Gaussian 稱為一個"Component",這些 Component 線性加成在一起就組成了 GMM 的概率密度函數:
其中,表示選中這個component部分的概率,我們也稱其為加權系數。
根據上面的式子,如果我們要從 GMM 的分布中隨機地取一個點的話,
首先隨機地在這 K 個 Component 之中選一個,每個 Component 被選中的概率實際上就是它的系數 πk,選中了 Component 之后,再單獨地考慮從這個 Component 的分布中選取一個點就可以了──這里已經回到了普通的 Gaussian 分布,轉化為了已知的問題。假設現在有 N 個數據點,我們認為這些數據點由某個GMM模型產生,現在我們要需要確定 πk,μk,σk 這些參數。很自然的,我們想到利用最大似然估計來確定這些參數,GMM的似然函數如下:
在最大似然估計里面,我們的目的是把乘積的形式分解為求和的形式,即在等式的左右兩邊加上一個log函數。
具體來說,與k-means一樣,給定的訓練樣本是,我們將隱含類別標簽用表示。與k-means的硬指定不同,我們首先認為是滿足一定的概率分布的,這里我們認為滿足多項式分布,,其中,有k個值{1,…,k}可以選取。而且我們認為在給定后,滿足多值高斯分布,即。由此可以得到聯合分布。
整個模型簡單描述為對於每個樣例,我們先從k個類別中按多項式分布抽取一個,然后根據所對應的k個多值高斯分布中的一個生成樣例,。整個過程稱作混合高斯模型。注意的是這里的仍然是隱含隨機變量。模型中還有三個變量和。最大似然估計為。對數化后如下:
這個式子的最大值是不能通過前面使用的求導數為0的方法解決的,因為求的結果不是close form。但是假設我們知道了每個樣例的,那么上式可以簡化為:
這時候我們再來對和進行求導得到:
就是樣本類別中的比率。是類別為j的樣本特征均值,是類別為j的樣例的特征的協方差矩陣。
實際上,當知道后,最大似然估計就近似於高斯判別分析模型(Gaussian discriminant analysis model)了。所不同的是GDA中類別y是伯努利分布,而這里的z是多項式分布,還有這里的每個樣例都有不同的協方差矩陣,而GDA中認為只有一個。
之前我們是假設給定了,實際上是不知道的。那么怎么辦呢?考慮之前提到的EM的思想,第一步是猜測隱含類別變量z,第二步是更新其他參數,以獲得最大的最大似然估計。用到這里就是:
循環下面步驟,直到收斂: { (E步)對於每一個i和j,計算
(M步),更新參數:
} |
在E步中,我們將其他參數看作常量,計算的后驗概率,也就是估計隱含類別變量。估計好后,利用上面的公式重新計算其他參數,計算好后發現最大化最大似然估計時,值又不對了,需要重新計算,周而復始,直至收斂。
的具體計算公式如下:
這個式子利用了貝葉斯公式。
這里我們使用代替了前面的,由簡單的0/1值變成了概率值。
1.3 The EM Algorithm
給定的訓練樣本是,樣例間獨立,我們想找到每個樣例隱含的類別z,能使得p(x,z)最大。p(x,z)的最大似然估計如下:
第一步是對極大似然取對數,第二步是對每個樣例的每個可能類別z求聯合分布概率和。但是直接求一般比較困難,因為有隱藏變量z存在,但是一般確定了z后,求解就容易了。
EM是一種解決存在隱含變量優化問題的有效方法。竟然不能直接最大化,我們可以不斷地建立的下界(E步),然后優化下界(M步)。這句話比較抽象,看下面的。
對於每一個樣例i,讓表示該樣例隱含變量z的某種分布,滿足的條件是。(如果z是連續性的,那么是概率密度函數,需要將求和符號換做積分符號)。如果隱藏變量連續的,那么使用高斯分布,如果隱藏變量是離散的,那么就使用伯努利分布了。
可以由前面闡述的內容得到下面的公式:
(1)到(2)比較直接,就是分子分母同乘以一個相等的函數。(2)到(3)利用了Jensen不等式,考慮到是凹函數(二階導數小於0),而且
就是
的期望(回想期望公式中的Lazy Statistician規則)
設Y是隨機變量X的函數(g是連續函數),那么 X是離散型隨機變量,它的分布律為,k=1,2,…。若絕對收斂,則有
X是連續型隨機變量,它的概率密度為,若絕對收斂,則有
|
對應於上述問題,Y是,X是,是,g是到
的映射。這樣解釋了式子(2)中的期望,再根據凹函數時的Jensen不等式:
可以得到(3)。
這個過程可以看作是對求了下界。對於的選擇,有多種可能,那種更好的?假設已經給定,那么的值就決定於和了。我們可以通過調整這兩個概率使下界不斷上升,以逼近的真實值,那么什么時候算是調整好了呢?當不等式變成等式時,說明我們調整后的概率能夠等價於了。按照這個思路,我們要找到等式成立的條件。根據Jensen不等式,要想讓等式成立,需要讓隨機變量變成常數值,這里得到:
c為常數,不依賴於。對此式子做進一步推導,我們知道,那么也就有,(多個等式分子分母相加不變,這個認為每個樣例的兩個概率比值都是c),那么有下式:
至此,我們推出了在固定其他參數后,的計算公式就是后驗概率,解決了如何選擇的問題。這一步就是E步,建立的下界。接下來的M步,就是在給定后,調整,去極大化的下界(在固定后,下界還可以調整的更大)。那么一般的EM算法的步驟如下:
循環重復直到收斂 {
|
那么究竟怎么確保EM收斂?假定和是EM第t次和t+1次迭代后的結果。如果我們證明了,也就是說極大似然估計單調增加,那么最終我們會到達最大似然估計的最大值。下面來證明,選定后,我們得到E步
這一步保證了在給定時,Jensen不等式中的等式成立,也就是
然后進行M步,固定,並將視作變量,對上面的求導后,得到,這樣經過一些推導會有以下式子成立:
解釋第(4)步,得到時,只是最大化,也就是的下界,而沒有使等式成立,等式成立只有是在固定,並按E步得到時才能成立。
況且根據我們前面得到的下式,對於所有的和都成立
第(5)步利用了M步的定義,M步就是將調整到,使得下界最大化。因此(5)成立,(6)是之前的等式結果。
這樣就證明了會單調增加。一種收斂方法是不再變化,還有一種就是變化幅度很小。
再次解釋一下(4)、(5)、(6)。首先(4)對所有的參數都滿足,而其等式成立條件只是在固定,並調整好Q時成立,而第(4)步只是固定Q,調整,不能保證等式一定成立。(4)到(5)就是M步的定義,(5)到(6)是前面E步所保證等式成立條件。也就是說E步會將下界拉到與一個特定值(這里)一樣的高度,而此時發現下界仍然可以上升,因此經過M步后,下界又被拉升,但達不到與另外一個特定值一樣的高度,之后E步又將下界拉到與這個特定值一樣的高度,重復下去,直到最大值。
如果我們定義
從前面的推導中我們知道,EM可以看作是J的坐標上升法,E步固定,優化,M步固定優化。
1.4.1 算法原理
主成分分析(Principal Components Analysis -- PCA)與線性判別分析(Linear Discriminant Analysis -- LDA)有着非常近似的意思,LDA的輸入數據是帶標簽的,而PCA的輸入數據是不帶標簽的,所以PCA是一種unsupervised learning。LDA通常來說是作為一個獨立的算法存在,給定了訓練數據后,將會得到一系列的判別函數(discriminate function),之后對於新的輸入,就可以進行預測了。而PCA更像是一個預處理的方法,它可以將原本的數據降低維度,而使得降低了維度的數據之間的方差最大(也可以說投影誤差最小)。
PCA的計算過程:
其中是樣例,共m個,每個樣例n個特征,也就是說是n維向量。是第i個樣例的第j個特征。是樣例均值。是第j個特征的標准差。
整個PCA過程貌似及其簡單,就是求協方差的特征值和特征向量,然后做數據轉換。但是有沒有覺得很神奇,為什么求協方差的特征向量就是最理想的k維向量?其背后隱藏的意義是什么?整個PCA的意義是什么?
推導公式可以幫助我們理解。我下面將用兩種思路來推導出一個同樣的表達式。首先是最大化投影后的方差,其次是最小化投影后的損失(投影產生的損失最小)。
1) 最大方差法
在信號處理中認為信號具有較大的方差,噪聲有較小的方差,信噪比就是信號與噪聲的方差比,越大越好。如前面的圖,樣本在橫軸上的投影方差較大,在縱軸上的投影方差較小,那么認為縱軸上的投影是由噪聲引起的。
因此我們認為,最好的k維特征是將n維樣本點轉換為k維后,每一維上的樣本方差都很大。
比如下圖有5個樣本點:(已經做過預處理,均值為0,特征方差歸一)
下面將樣本投影到某一維上,這里用一條過原點的直線表示(前處理的過程實質是將原點移到樣本點的中心點)。
假設我們選擇兩條不同的直線做投影,那么左右兩條中哪個好呢?根據我們之前的方差最大化理論,左邊的好,因為投影后的樣本點之間方差最大。
這里先解釋一下投影的概念:
紅色點表示樣例,藍色點表示在u上的投影,u是直線的斜率也是直線的方向向量,而且是單位向量。藍色點是在u上的投影點,離原點的距離是(即或者)由於這些樣本點(樣例)的每一維特征均值都為0,因此投影到u上的樣本點(只有一個到原點的距離值)的均值仍然是0。
回到上面左右圖中的左圖,我們要求的是最佳的u,使得投影后的樣本點方差最大。
由於投影后均值為0,因此方差為:
中間那部分很熟悉啊,不就是樣本特征的協方差矩陣么(的均值為0,一般協方差矩陣都除以m-1,這里用m)。
用來表示,表示,那么上式寫作
由於u是單位向量,即,上式兩邊都左乘u得,
即
就是的特征值,u是特征向量。最佳的投影直線是特征值最大時對應的特征向量,其次是第二大對應的特征向量,依次類推。
因此,我們只需要對協方差矩陣進行特征值分解,得到的前k大特征值對應的特征向量就是最佳的k維新特征,而且這k維新特征是正交的。得到前k個u以后,樣例通過以下變換可以得到新的樣本。
其中的第j維就是在上的投影。
通過選取最大的k個u,使得方差較小的特征(如噪聲)被丟棄。
2) 最小平方誤差理論
假設有這樣的二維樣本點(紅色點),回顧我們前面探討的是求一條直線,使得樣本點投影到直線上的點的方差最大。本質是求直線,那么度量直線求的好不好,不僅僅只有方差最大化的方法。再回想我們最開始學習的線性回歸等,目的也是求一個線性函數使得直線能夠最佳擬合樣本點,那么我們能不能認為最佳的直線就是回歸后的直線呢?回歸時我們的最小二乘法度量的是樣本點到直線的坐標軸距離。比如這個問題中,特征是x,類標簽是y。回歸時最小二乘法度量的是距離d。如果使用回歸方法來度量最佳直線,那么就是直接在原始樣本上做回歸了,跟特征選擇就沒什么關系了。
因此,我們打算選用另外一種評價直線好壞的方法,使用點到直線的距離d'來度量。
現在有n個樣本點,每個樣本點為m維(這節內容中使用的符號與上面的不太一致,需要重新理解符號的意義)。將樣本點在直線上的投影記為,那么我們就是要最小化
這個公式稱作最小平方誤差(Least Squared Error)。
而確定一條直線,一般只需要確定一個點,並且確定方向即可。
第一步確定點:
假設要在空間中找一點來代表這n個樣本點,"代表"這個詞不是量化的,因此要量化的話,我們就是要找一個m維的點,使得
最小。其中是平方錯誤評價函數(squared-error criterion function),假設m為n個樣本點的均值:
那么平方錯誤可以寫作:
后項與無關,看做常量,而,因此最小化時,
是樣本點均值。
第一步確定方向:
我們從拉出要求的直線(這條直線要過點m),假設直線的方向是單位向量e。那么直線上任意一點,比如就可以用點m和e來表示
其中是到點m的距離。
我們重新定義最小平方誤差:
這里的k只是相當於i。就是最小平方誤差函數,其中的未知參數是和e。
實際上是求的最小值。首先將上式展開:
我們首先固定e,將其看做是常量,,然后對進行求導,得
這個結果意思是說,如果知道了e,那么將與e做內積,就可以知道了在e上的投影離m的長度距離,不過這個結果不用求都知道。
然后是固定,對e求偏導數,我們先將公式(8)代入,得
其中 與協方差矩陣類似,只是缺少個分母n-1,我們稱之為散列矩陣(scatter matrix)。
然后可以對e求偏導數,但是e需要首先滿足,引入拉格朗日乘子,來使最大(最小),令
求偏導
這里存在對向量求導數的技巧,方法這里不多做介紹。可以去看一些關於矩陣微積分的資料,這里求導時可以將看作是,將看做是。
導數等於0時,得
兩邊除以n-1就變成了,對協方差矩陣求特征值向量了。
從不同的思路出發,最后得到同一個結果,對協方差矩陣求特征向量,求得后特征向量上就成為了新的坐標,如下圖:
這時候點都聚集在新的坐標軸周圍,因為我們使用的最小平方誤差的意義就在此。
1.4.2 奇異值與主成分分析(PCA)
這里主要談談如何用SVD去解PCA的問題。PCA的問題其實是一個基的變換,使得變換后的數據有着最大的方差。方差的大小描述的是一個變量的信息量,我們在講一個東西的穩定性的時候,往往說要減小方差,如果一個模型的方差很大,那就說明模型不穩定了。但是對於我們用於機器學習的數據(主要是訓練數據),方差大才有意義,不然輸入的數據都是同一個點,那方差就為0了,這樣輸入的多個數據就等同於一個數據了。以下面這張圖為例子:
這個假設是一個攝像機采集一個物體運動得到的圖片,上面的點表示物體運動的位置,假如我們想要用一條直線去擬合這些點,那我們會選擇什么方向的線呢?當然是圖上標有signal的那條線。如果我們把這些點單純的投影到x軸或者y軸上,最后在x軸與y軸上得到的方差是相似的(因為這些點的趨勢是在45度左右的方向,所以投影到x軸或者y軸上都是類似的),如果我們使用原來的xy坐標系去看這些點,容易看不出來這些點真正的方向是什么。但是如果我們進行坐標系的變化,橫軸變成了signal的方向,縱軸變成了noise的方向,則就很容易發現什么方向的方差大,什么方向的方差小了。
一般來說,方差大的方向是信號的方向,方差小的方向是噪聲的方向,我們在數據挖掘中或者數字信號處理中,往往要提高信號與噪聲的比例,也就是信噪比。對上圖來說,如果我們只保留signal方向的數據,也可以對原數據進行不錯的近似了。
PCA的全部工作簡單點說,就是對原始的空間中順序地找一組相互正交的坐標軸,第一個軸是使得方差最大的,第二個軸是在與第一個軸正交的平面中使得方差最大的,第三個軸是在與第1、2個軸正交的平面中方差最大的,這樣假設在N維空間中,我們可以找到N個這樣的坐標軸,我們取前r個去近似這個空間,這樣就從一個N維的空間壓縮到r維的空間了,但是我們選擇的r個坐標軸能夠使得空間的壓縮使得數據的損失最小。
還是假設我們矩陣每一行表示一個樣本,每一列表示一個feature,用矩陣的語言來表示,將一個m * n的矩陣A的進行坐標軸的變化,P就是一個變換的矩陣從一個N維的空間變換到另一個N維的空間,在空間中就會進行一些類似於旋轉、拉伸的變化。
而將一個m * n的矩陣A變換成一個m * r的矩陣,這樣就會使得本來有n個feature的,變成了有r個feature了(r < n),這r個其實就是對n個feature的一種提煉,我們就把這個稱為feature的壓縮。用數學語言表示就是:
但是這個怎么和SVD扯上關系呢?之前談到,SVD得出的奇異向量也是從奇異值由大到小排列的,按PCA的觀點來看,就是方差最大的坐標軸就是第一個奇異向量,方差次大的坐標軸就是第二個奇異向量…我們回憶一下之前得到的SVD式子:
在矩陣的兩邊同時乘上一個矩陣V,由於V是一個正交的矩陣,所以V轉置乘以V得到單位陣I,所以可以化成后面的式子
將后面的式子與A * P那個m * n的矩陣變換為m * r的矩陣的式子對照看看,在這里,其實V就是P,也就是一個變化的向量。這里是將一個m * n 的矩陣壓縮到一個m * r的矩陣,也就是對列進行壓縮,如果我們想對行進行壓縮(在PCA的觀點下,對行進行壓縮可以理解為,將一些相似的sample合並在一起,或者將一些沒有太大價值的sample去掉)怎么辦呢?同樣我們寫出一個通用的行壓縮例子:
這樣就從一個m行的矩陣壓縮到一個r行的矩陣了,對SVD來說也是一樣的,我們對SVD分解的式子兩邊乘以U的轉置
這樣我們就得到了對行進行壓縮的式子。可以看出,其實PCA幾乎可以說是對SVD的一個包裝,如果我們實現了SVD,那也就實現了PCA了。
1.4.3 Spark MLlib 實現PCA
Scala code
import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.mllib.linalg.Matrix
import org.apache.spark.mllib.linalg.distributed.RowMatrix
val rows: RDD[Vector] = ... // an RDD of local vectors
// Create a RowMatrix from an RDD[Vector].
val mat: RowMatrix = new RowMatrix(rows)
// Get its size.
val m = mat.numRows()
val n = mat.numCols()
// Compute the top 10 principal components.
val pc: Matrix = mat.computePrincipalComponents(10) // Principal components are stored in a local dense matrix.
// Project the rows to the linear space spanned by the top 10 principal components.
val projected: RowMatrix = mat.multiply(pc)
參考文獻
[1] Machine Learning Open Class by Andrew Ng in Stanford http://openclassroom.stanford.edu/MainFolder/CoursePage.php?course=MachineLearning
[2] Yu Zheng, Licia Capra, Ouri Wolfson, Hai Yang. Urban Computing: concepts, methodologies, and applications. ACM Transaction on Intelligent Systems and Technology. 5(3), 2014
[3] Jerry Lead http://www.cnblogs.com/jerrylead/
[3]《大數據-互聯網大規模數據挖掘與分布式處理》 Anand Rajaraman,Jeffrey David Ullman著,王斌譯
[4] UFLDL Tutorial http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial
[5] Spark MLlib之朴素貝葉斯分類算法 http://selfup.cn/683.html
[6] MLlib - Dimensionality Reduction http://spark.apache.org/docs/latest/mllib-dimensionality-reduction.html
[7] 機器學習中的數學(5)-強大的矩陣奇異值分解(SVD)及其應用 http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html
[8] 淺談 mllib 中線性回歸的算法實現 http://www.cnblogs.com/hseagle/p/3664933.html
[9] 最大似然估計 http://zh.wikipedia.org/zh-cn/%E6%9C%80%E5%A4%A7%E4%BC%BC%E7%84%B6%E4%BC%B0%E8%AE%A1
[10] Deep Learning Tutorial http://deeplearning.net/tutorial/
附 錄
Andrew Ng 在斯坦福大學的CS229機器學習課程內容
Andrew Ng -- Stanford University CS 229 Machine Learning
This course provides a broad introduction to machine learning and statistical pattern recognition.
Topics include:
supervised learning (generative/discriminative learning, parametric/non-parametric learning, neural networks, support vector machines);
learning theory (bias/variance tradeoffs; VC theory; large margins);
unsupervised learning (clustering, dimensionality reduction, kernel methods);
reinforcement learning and adaptive control. The course will also discuss recent applications of machine learning, such as to robotic control, data mining, autonomous navigation, bioinformatics, speech recognition, and text and web data processing.
中英文詞語對照
neural networks 神經網絡
activation function 激活函數
hyperbolic tangent 雙曲正切函數
bias units 偏置項
activation 激活值
forward propagation 前向傳播
feedforward neural network 前饋神經網絡(參照Mitchell的《機器學習》的翻譯)
Softmax回歸 Softmax Regression
有監督學習 supervised learning
無監督學習 unsupervised learning
深度學習 deep learning
logistic回歸 logistic regression
截距項 intercept term
二元分類 binary classification
類型標記 class labels
估值函數/估計值 hypothesis
代價函數 cost function
多元分類 multi-class classification
權重衰減 weight decay
深度網絡 Deep Networks
深度神經網絡 deep neural networks
非線性變換 non-linear transformation
激活函數 activation function
簡潔地表達 represent compactly
"部分-整體"的分解 part-whole decompositions
目標的部件 parts of objects
高度非凸的優化問題 highly non-convex optimization problem
共軛梯度 conjugate gradient
梯度的彌散 diffusion of gradients
逐層貪婪訓練方法 Greedy layer-wise training
自動編碼器 autoencoder
微調 fine-tuned
自學習方法 self-taught learning
@雪松Cedro
Microsoft MVP, Windows Platform Development