主成分分析及其matlab實現

卢宇博發表於2024-07-10

本講將介紹主成分分析(Principal Component Analysis,PCA),它能將多個指標轉換為少數幾個主成分,這些主成分是原始變數的線性組合,且彼此之間互不相關。一般來說,當研究的問題涉及到多變數且變數之間存在很強的相關性時,我們可考慮使用主成分分析的方法來對資料進行簡化。

目錄
  • 一、問題提出
  • 二、主成分分析思想
  • 三、PCA的計算步驟
    • 1.標準化處理
    • 2.計算標準化樣本的協方差矩陣
    • 3.將前兩步驟合為一步————計算相關係數矩陣
    • 4.計算R的特徵值和特徵向量
    • 5.計算主成分貢獻率以及累計貢獻率
    • 6.寫出主成分
    • 7.根據係數分析主成分代表的意義(困難且關鍵)
    • 8.利用主成分的結果進行後續的分析
    • 9.主成分分析的說明
  • 三、主成分分析matlab程式碼詳解
    • 1.計算樣本相關係數矩陣
    • 2.計算R的特徵值和特徵向量
    • 3.計算主成分貢獻率和累計貢獻率
    • 4.處理特徵向量矩陣
    • 5.計算我們所需要的主成分的值
  • 四、主成分聚類
    • 1.進行系統聚類
    • 2.圖表構建器創造聚類圖
  • 五、主成分迴歸

一、問題提出

某人要做一件上衣要測量很多尺寸,如身長、袖長、胸圍、腰圍、肩寬、肩厚等十幾項指標,但某服裝廠要生產一批新型服裝絕不可能把尺寸的型號分得過多?而是從多種指標中綜合成幾個少數的綜合指標,做為分類的型號,利用主成分分析將十幾項指標綜合成3項指標,一項是反映長度的指標,一項是反映胖瘦的指標,一項是反映特殊體型的指標
主成分分析是把原來多個變數劃為少數幾個綜合指標的一種統計分析方法。

二、主成分分析思想

將多個指標轉換為少數幾個主成分,這些主成分是原始變數的線性組合,且主成分之間無相關性

三、PCA的計算步驟

1.標準化處理

2.計算標準化樣本的協方差矩陣

3.將前兩步驟合為一步————計算相關係數矩陣

4.計算R的特徵值和特徵向量

5.計算主成分貢獻率以及累計貢獻率

6.寫出主成分

7.根據係數分析主成分代表的意義(困難且關鍵)

對於某個主成分而言,指標前面的係數越大,代表該指標對於該主成分的影響越大。透過這一原則,我們需要分析出我們得到的主成分到底代表著什麼,不然將毫無意義

8.利用主成分的結果進行後續的分析

主成分分析可以用於聚類,其最大的好處就是能夠將多個指標轉化成兩個指標,畫出聚類圖。
而主成分分析用於迴歸則是可以有效避免多重共線性的問題,畢竟提取主成分的前提就是主成分之間無相關性

9.主成分分析的說明

主成分的解釋其含義一般多少帶有點模糊性,不像原始變數的含義那麼清楚、確切,這是變數降維過程中不得不付出的代價。
主成分分析的困難之處主要在於要能夠給出主成分的較好解釋,所提取的主成分中如有一個主成分解釋不了,整個主成分分析也就失敗了。

三、主成分分析matlab程式碼詳解

我們以31個省份在各個領域內的平均消費資料為例,此處有31個個案,8個指標

1.計算樣本相關係數矩陣

x是一個31行,8列的資料,計算相關係數矩陣後得到一個8行8列的矩陣
R = corrcoef(x)

2.計算R的特徵值和特徵向量

得到特徵向量vector與一個特徵值在對角線上的對角矩陣
[V,D] = eig(R)

3.計算主成分貢獻率和累計貢獻率

lambda = diag(D);  % diag函式用於得到一個矩陣的主對角線元素值(返回的是列向量)
lambda = lambda(end:-1:1);  % 因為lambda向量是從小大到排序的,我們將其調個頭
contribution_rate = lambda / sum(lambda);  % 計算貢獻率
cum_contribution_rate = cumsum(lambda)/ sum(lambda);   % 計算累計貢獻率  cumsum是求累加值的函式
disp('特徵值為:')
disp(lambda')  % 轉置為行向量,方便展示
disp('貢獻率為:')
disp(contribution_rate')
disp('累計貢獻率為:')
disp(cum_contribution_rate')

4.處理特徵向量矩陣

由於matlab內建的計算特徵值與特徵向量的函式返回的值是從小到大排序的,這裡我們需要將特徵值與特徵向量從大到小排序(優先選用貢獻率大的主成分)

disp('與特徵值對應的特徵向量矩陣為:')
% 注意:這裡的特徵向量要和特徵值一一對應,之前特徵值相當於顛倒過來了,因此特徵向量的各列需要顛倒過來
%  rot90函式可以使一個矩陣逆時針旋轉90度,然後再轉置,就可以實現將矩陣的列顛倒的效果
V=rot90(V)';
disp(V)

5.計算我們所需要的主成分的值

在上一步我們已經計算出了累積貢獻率,那麼在這可以由使用者從累積貢獻率判斷選取m個主成分,然後進行一個m次的迴圈,得出主成分的值
返回的F矩陣是一個31行,2列的矩陣。其意義是31個個案對應的兩個主成分的指標

m =input('請輸入需要儲存的主成分的個數:  ');
F = zeros(n,m);  %初始化儲存主成分的矩陣(每一列是一個主成分)
for i = 1:m
    ai = V(:,i)';   % 將第i個特徵向量取出,並轉置為行向量
    Ai = repmat(ai,n,1);   % 將這個行向量重複n次,構成一個n*p的矩陣
    F(:, i) = sum(Ai .* X, 2);  % 注意,對標準化的資料求了權重後要計算每一行的和
end

四、主成分聚類

我們得到了由31個個案,2個指標組成的矩陣,這樣我們可以根據這兩個指標對這31個個案進行聚類,並且能夠方便畫出其聚類圖

1.進行系統聚類

這裡我們使用系統聚類,透過譜系圖判斷聚三類,把聚三類的結果儲存到我們的資料集中

2.圖表構建器創造聚類圖

這裡我們利用圖表構建器創造聚類圖,設定如圖所示,把顏色依據設定為聚類結果,點ID標籤設定為省份,這樣圖上就會顯示出省份的名稱

五、主成分迴歸

主成分迴歸:將x使用主成分得到主成分指標,並將y標準化,接著匯出到Excel,然後再使用spss迴歸
Y = zscore(y); % 一定要將y進行標準化哦~
在Excel第一行輸入指標名稱(Y,F1, F2, ..., Fm)
分別雙擊Matlab工作區的Y和F,進入變數編輯中,然後複製裡面的資料到Excel表格
匯出資料之後,我們後續的分析就可以在Stata中進行。

相關文章