以前的課程中咱們學習的都是監督學習相關的算法,如今來開始看非監督學習。非監督學習相對於監督非學習來看,其使用的是未標記的訓練集而監督學習的是標記的訓練集。換句話說,咱們不知道向量y的預期結果,僅僅只是擁有一個能夠找到結構的特徵的集合。
其中一種可能的結構是,全部的數據能夠大體地劃分紅兩組,這種劃分的算法稱爲聚類算法。 這是咱們第一種 無監督學習算法。在不少場景下咱們會使用聚類的方式來解決非監督學習問題,好比市場分割,社會網絡分析等等。算法
K-Means算法是最流行和普遍使用的自動將數據分組到相干子集的算法,其算法的步驟主要是:網絡
下圖展現了對n個樣本點進行K-means聚類的效果,這裏k取2。dom
用 $μ^1,μ^2,...,μ^k$ , 來表示聚類中心,用 $c^{(1)},c^{(2)},...,c^{(m)}$ ,來存儲與第 i 個實例數據最近的聚類中心的索引,K-均值算法的僞代碼以下:機器學習
Randomly initialize K cluster centroids mu(1), mu(2), ..., mu(K) Repeat: for i = 1 to m: c(i):= index (from 1 to K) of cluster centroid closest to x(i) for k = 1 to K: mu(k):= average (mean) of points assigned to cluster k
算法分爲兩個步驟,第一個for循環是賦值步驟,即:對於每個樣例i,計算其應該屬於的類。第二個for循環是聚類中心的移動,即:對於每個類 K從新計算該類的質心。
在K-means算法中的變量有下面幾個:函數
用這些變量咱們能夠定義代價函數爲:學習
$$ J(c^{(1)},...,c^{(m)},μ_1,...,μ_K)=\dfrac {1}{m}\sum^{m}_{i=1}\left\| X^{\left( i\right) }-\mu_{c^{(i)}}\right\| ^{2} $$優化
咱們的的優化目標即是找出使得代價函數最小的$c^{(1)},c^{(2)},...,c^{(m)} ,和 μ^1,μ^2,...,μ^k $。回顧剛纔給出的: K-均值迭代算法,咱們知道,第一個循環是用於減少$c^{(i)}$引發的代價,而第二個循環則是用於減少${{\mu }_{i}}$引發的代價。迭代的過程必定會是每一次迭代都在減少代價函數,否則即是出現了錯誤。spa
在運行K-均值算法的以前,咱們首先要隨機初始化全部的聚類中心點,下面介紹怎樣作:.net
K-均值的一個問題在於它有可能會停留在一個局部最小值處,而這取決於初始化的狀況。爲了解決這個問題,咱們一般須要屢次運行K-均值算法,每一次都從新進行隨機初始化,最後再比較屢次運行K-均值的結果,選擇代價函數最小的結果。這種方法在K較小的時候(2--10)仍是可行的,可是K若是較大,這麼作也可能不會有明顯地改善。code
for i = 1 to 100: randomly initialize k-means run k-means to get 'c' and 'm' compute the cost function (distortion) J(c,m) pick the clustering that gave us the lowest cost
K的選擇每每是任意的或者說是模糊不清的,一般是須要根據不一樣的問題人工進行選擇的。選擇的時候咱們須要思考運用K-均值算法聚類的動機是什麼,而後選擇能最好服務於該目的標聚類數。
當人們在討論,選擇聚類數目的方法時,有一個可能會談及的方法叫做「肘部法則」。將代價J和聚類K畫在圖中。代價函數會隨着K的增長而下降而後趨於平緩,咱們要作的就是找到J開始趨於平緩時的K。然而不少時候,曲線常常是很平緩的,這時的肘部就很不明顯。(note:J通常都是隨着K的增長而下降,但若是K出現了錯誤的局部最優則會致使不同的結果)。
有幾個不一樣的的緣由使你可能想要作降維。一是數據壓縮,若是咱們有大量多餘的數據時,咱們可能想下降特徵的維度,爲此能夠找到兩個高度相關的特徵,將其畫出圖像而後作一條直線來同時描述這兩個特徵。二是數據可視化,由於數據超過三維就很難可視化了,所以有時候須要將維度降低到3或者如下來達到可視化的目的。
主成分分析(PCA)是最多見的降維算法。其定義是想把數據從n維降到k維(k小於n),就在這個空間裏面找k個單位向量來表示數據,使得數據點投影到這個面上的偏差最小。以下例子:2到1和3到2:
雖然同是一條直線擬合,但PCA和線性迴歸是不一樣的:
PCA 減小 n 維到 k 維:
第一步是均值歸一化。咱們須要計算出全部特徵的均值,而後令$x_j=x_j-μ_j$。若是特徵是在不一樣的數量級上,咱們還須要將其除以標準差$σ^2$。
第二步是計算協方差矩陣(covariance matrix) Σ :$\sum=\frac {1}{m}\sum^{n}_{i=1}\left( x^{(i)}\right) \left( x^{(i)}\right) ^{T}$
第三步是計算協方差矩陣Σ的特徵向量(eigenvectors):
在 Octave 裏咱們能夠利用奇異值分解(singular value decomposition)來求解,[U, S, V]= svd(sigma)。
$\Sigma=\frac {1}{m}\sum^{n}_{i=1}\left( x^{(i)}\right) \left( x^{(i)}\right) ^{T}$
對於一個 n×n 維度的矩陣,上式中的 U 是一個具備與數據之間最小投射偏差的方向向量構成的矩陣。若是咱們但願將數據從 n 維降至 k 維,咱們只須要從U中選取前k個向量,得到一個n×k維度的矩陣,咱們用$U_{reduce}$表示,而後經過以下計算得到要求的新特徵向量 $z^{(i)}=U^{T}_{reduce}*x^{(i)}$。
其中x是n×1維的,所以結果爲 k×1 維度。咱們不對方差特徵進行處理。
在PCA算法中咱們把n維特徵變量降維到k維特徵變量。這個數字k也被稱做主成分的數量或者說是咱們保留的主成分的數量。咱們先來思考兩個值:
咱們把兩個數的比值做爲衡量PCA算法的有效性
定義一個閾值而後實驗k,看看那個最小的k合適。計算步驟以下:
這裏有個技巧:svd函數會返回一個對角矩陣S,他的元素能夠很快的計算這個閾值。
PCA算法主要有如下用途:
壓縮:
可視化:
有些人覺的PCA也能夠用來防止過擬合,可是這是不對的。應該用正則化。正則化使用y標籤最小化損失函數,使用了y標籤信息。而PCA只單純的看x的分部就刪除了一些特徵,損失率不少信息。另外一個常見的錯誤是,默認地將主要成分分析做爲學習過程當中的一部分,這雖然不少時候有效果,最好仍是從全部原始特徵開始,只在有必要的時候(算法運行太慢或者佔用太多內存)才考慮採用主要成分分析。
以上爲吳恩達機器學習非監督學習這一章節的內容。
參考連接
https://zhuanlan.zhihu.com/p/43488853
https://blog.csdn.net/u012052268/article/details/78847915#3維度約簡-主成分分析法pca