吳恩達機器學習筆記-非監督學習

聚類

以前的課程中咱們學習的都是監督學習相關的算法,如今來開始看非監督學習。非監督學習相對於監督非學習來看,其使用的是未標記的訓練集而監督學習的是標記的訓練集。換句話說,咱們不知道向量y的預期結果,僅僅只是擁有一個能夠找到結構的特徵的集合。
其中一種可能的結構是,全部的數據能夠大體地劃分紅兩組,這種劃分的算法稱爲聚類算法。 這是咱們第一種 無監督學習算法。在不少場景下咱們會使用聚類的方式來解決非監督學習問題,好比市場分割,社會網絡分析等等。算法

K-means

K-Means算法是最流行和普遍使用的自動將數據分組到相干子集的算法,其算法的步驟主要是:網絡

  1. 首先選擇 K 個隨機的點,稱爲聚類中心(cluster centroids);
  2. 對於數據集中的每個數據,按照距離K箇中心點的距離,將其與距離最近的中心點關聯起來,與同一個中心點關聯的全部點聚成一類。
  3. 計算每個組的平均值,將該組所關聯的中心點移動到平均值的位置。
  4. 重複步驟2-4直至中心點再也不變化。

下圖展現了對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

  1. 咱們應該選擇 K<m,即聚類中心點的個數要小於全部訓練集實例的數量
  2. 隨機選擇 K 個訓練實例。
  3. 令 K 個聚類中心分別與這 K個訓練實例相等

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和線性迴歸是不一樣的:

  1. 計算loss的方式不一樣(垂直)。
  2. PCA沒有標籤Y(非監督)。

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也被稱做主成分的數量或者說是咱們保留的主成分的數量。咱們先來思考兩個值:

  1. 第一個是:PCA所作的是儘可能最小化平均平方映射偏差(Average Squared Projection Error)。
  2. 第二個是:我還要定義一下數據的總變差(Total Variation)。它的意思是 「平均來看個人訓練樣本距離零向量多遠?

咱們把兩個數的比值做爲衡量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

相關文章
相關標籤/搜索