吳恩達機器學習 程式設計練習7

2021-09-26 06:26:53 字數 4071 閱讀 1281

本練習的主題是k-means clustering and principal component analysis,即k均值聚類演算法和主要成分分析。因此這篇文章也分兩部分來討論,根據作業檔案的步驟來分別對k均值聚類演算法和pca進行討論原理以及如何實現。

k-means clustering algorithm(k均值聚類演算法)

首先需要說明的是,k均值聚類演算法與我們前面學習的線性回歸、邏輯回歸、神經網路、svm均是不同的,這四種演算法所處理的資料都是有標籤的,也就是label data,即對於資料x來說,一般會有對應的y與之相匹配,而不管是線性回歸或者是邏輯回歸,其實質都是x、y之間的關係去進行擬合、**或者分類等操作,這種我們稱之為監督學習演算法,而k均值聚類演算法是一種無監督學習演算法,也就是說其處理的資料集是沒有標籤的(unlabel data),資料集是單純的,而演算法的目的就是根據這些點之間存在的某些聯絡來講這些點進行分類。

由於資料沒有標籤,因此在進行分類時分類數目就需要我們自己來確定,如果是實際的應用問題,一般根據k值代表的意義來進行分類,而對於一般的資料,在後文將會介紹如何選取乙個合適的k值。我們先來看下面一張圖:

在這張圖中,我們根據目視情況大致決定將資料分為三類,因此我們在這裡隨機選取了三個點作為我們的初始聚類點,並根據資料點和聚類點距離的不同將資料點標以不同的顏色,接下來我們來執行演算法的第一步,計算每個資料點與聚類點的距離並將其分類(實質上圖上顯示的已經是分類結束了的情況):

distance = zeros(k,1);

[m,~] = size(x);

try for i = 1:m

for j = 1:k

% compute the distance

distance(j) = norm(x(i,:) - centroids(j,:));

endmin_dis = min(min(distance));

min_idx = find(min_dis == distance);

idx(i) = min_idx(1);

endcatch errorinfo

disp(i);

disp(distance);

disp(min_idx);

disp(idx(i));

其中,x是原資料集,centroids是我們初始化的聚類中心點,而idx則表示對應的x中的點距離幾號聚類點最近,例如idx(i) = 1,則表示x中第i個點距離1號聚類點最近,而後面我們就可以根據這個標號來進行資料集的分類和下一步的計算。

上面我們完成了根據點距離中心的距離關係對點進行分類的問題,下面我們就需要進行演算法的第二部,根據上面的分類情況,來重新更新中心點的位置,也就是通過上面分類後的資料點,來重新算出每一類資料的中心點,公式和說明如下:

也就是說,根據上一步我們把整個資料集分成了k類,∑xi是對其中第i類的所有資料求和,隨後除以這個類中包含的資料個數,求取這一類資料的中心點座標作為新的中心點,然後根據新的中心點來重複上一步的資料分類,再更新中心點,再分類…實質上,k均值演算法就是乙個迭代的過程,知道找到最後的中心點,下面是更新中心點的**實現和整個演算法迭代到最後的結果:

注:這裡是迭代次數為10次的結果。

現在,我們已經介紹了整個k均值聚類演算法的實現過程,實質上,整個演算法只有兩步:1)點分類 2)點更新,通過對這兩步的反覆迭代就可以實現最後的目標。實際上,在執行這個演算法時我們還應該注意到另外乙個問題,也就是中心點隨機初始化的問題,有些時候可能因為初始中心點選的不合適,最後會導致結果出現區域性最優解而不是全域性最優解,為了避免這種情況出現,我們對中心點的初始化執行隨機初始化操作,同時可能對k均值聚類演算法執行多次以求達到最優的結果。

principal component analysis(pca)主要成分分析

pca實質上是一種資料分析方法,旨在通過降維的思想,將多維資料轉換為低維度的資料。有時候我們要進行學習的資料可能很大,有很多變數,這樣的資料固然包含了很多的資訊,可以在最大程度上讓我們的結果準確,但是需要注意到的是,越是複雜的資料在進行處理時也會越麻煩,但是盲目的捨棄一部分資料顯然是不可取的,因為這可能會捨棄掉一部分關鍵的資訊,這時候,就需要一種合適的方法去對這些資料進行分析並預處理,好簡化我們下一步的操作,而pca就是這樣一種方法。本文主要講述pca的實現部分,關於更細節的原理講解,可以參考一下博文(侵刪):主成分分析(pca):原理詳解。

同k均值一樣,pca也是分為兩步,下面我們來分別說明:

一:計算協方差矩陣

首先計算協方差矩陣,公式如下:

要注意,在這裡,∑代表的不是求和,而是乙個nn的矩陣,x是乙個mn維的陣列,m是樣本數。

二:計算主要成分

計算了協方差矩陣後,我們可以直接計算主要成分,使用matlab自帶的svd函式可以完成這一步驟,公式如下:

其中,u中包含了主要成分,而u則是乙個對角矩陣,在我們選擇k時會用到s。

通過上面的兩個步驟,我們已經得到了乙個包含主要成分的矩陣,下面可以通過矩陣的變換來獲得變換後的資料:

u_reduce = u(:,1:k);

z = x * u_reduce;

例如這裡,z就是乙個將x變換為k為的資料集,當然,可以降維,自然可以「公升維」,也就是將資料還原:

u_reduce = u(:,1:k);

x_rec = z * u_reduce';

以上就是pca的全部內容。

在文中,有三個地方沒有交代清楚,第乙個是k均值聚類演算法中的k取值如何選取;第二個是這k個中心點在初始化時應該如何初始化;第三個地方是pca中選取k(也就是降維後的資料維度)如何選取,下面分別來談一下,其實都是吳老師課程中的內容。

一:中心點個數k如何選取?

在選取中心點個數時,除了我前面提到過的根據實際問題來分析,比如服裝廠家對衣服的尺寸市場需求進行分析,他可能會將衣服的尺寸分為s,m,l,xl,xxl,這樣,我們就可以取k=5,也就是將整個市場的資料分為五類,看哪一類的需求最大對應的來更改生產計畫之類,除此之外,對於一般的資料來說,我們可以執行乙個叫做elbow method(肘部準則)的選取方法,主要是利用代價函式j來選取,如圖所示:

簡單來說,就是選取j斜率變化最大的那個轉折點,目的就是用最小的k值來獲得最好的令j減小的效果,但是注意,這種方法也不是常常能奏效,如下面這種情況:

這種情況下顯然就不存在明顯的肘部,因此在選取k值時我們應該靈活應用上面的方法來選取合適的k值。

二:中心點如何初始化?

總的來說,中心點的初始化遵循一下三個準則一般能取得較好的效果:

1)k的個數應該小於m(樣本數);

2)中心點的選取應該從樣本中隨機選取;

3)令中心點的座標和樣本資料重合。

三:pca中的k值如何選取?

pca中的k值在選取時,應該遵循最大方差準則,一般來說,結果應該保留有99%的方差,用公式來表示,也就是

用實際的來表示就是:

1 - ∑k

i=1sii / ∑n

i=1sii

<= 0.01

其中,sii是前文提到的s矩陣中第i行、第i列上的元素。

吳恩達機器學習 程式設計練習8

假設特徵服從正態分佈,通過計算整體概率判斷是否小於某個值,從而判斷是不是正常的。estimategaussian.m estimate parameters mu sum x m m add zeros n 1,n mu tmp mu m add mu tmp ones m,n mu tmp sig...

吳恩達機器學習 程式設計練習 ex6 1

本節練習是為了應用svm演算法,並靈活運用c和gamma引數 首先load資料集並plot part1 讀取資料1,並將資料整理成可識別的格式 path c users huanuo pycharmprojects ml ex6 svm ex6 ex6data1.mat m loadmat path...

吳恩達機器學習ex7

這一部分實現k means聚類方法並用於影象壓縮。k mean演算法是一種自動將相似資料聚類到一起的方法。該演算法是乙個迭代的過程,開始時隨機設定乙個質心,之後重複地將資料點分配到離其最近的質心,再重新計算質心。演算法過程就是重複以下兩個步驟 1 將每個樣本點分配到最近的質心 2 重新計算每個類的均...