1. 程式人生 > 其它 >07無監督學習-降維PCA

07無監督學習-降維PCA

PCA方法及其應用

主成分分析(PCA)

  • 主成分分析(Principal Component Analysis, PCA)是最常用的一種降維方法,通常用於高維資料集的探索與視覺化,還可以用作資料壓縮和預處理等。
  • PCA可以把具有相關性的高維變數合成為線性無關的低維變數,稱為主成分。主成分能夠儘可能保留原始資料的資訊。

在介紹PCA的原理之前需要回顧涉及到的相關術語

  • 方差

    是各個樣本和樣本均值的差的平方和的均值,用來度量一組資料的分散程度。

  • 協方差

    用於度量兩個變數之間的線性相關性程度,若兩個變數的協方差為0,則可認為二者線性無關。協方差矩陣則是由變數的協方差值構成的矩陣(對稱陣)。

  • 協方差矩陣

    矩陣的特徵向量是描述資料集結構的非零向量並滿足如下公式

    A是方陣,v是徵向量,A是特徵值。

  • 特徵向量和特徵值

原理

矩陣的主成分就是其協方差矩陣對應的特徵向量,按照對應的特徵值大小進行排序,最大的特徵值就是第一主成分,其次是第二主成分,以此類推。

演算法過程

1、對所有樣本進行中心化:xi-(x1+x2…xm)/m

2、計算樣本的協方差矩陣X(X.T)

3、對協方差矩陣X(X.T)做特徵值分解

4、取最大的d個特徵值所對應的特徵向量w1,w2…wd

輸出投影矩陣W=(w1,w2,…,wd)

PCA演算法的原理《機器學習周志華》

sklearn中主成分分析

在sklearn庫中,可以使用sklearn.decomposition.PCA載入PCA進行降維,主要引數有:

  • n_components:指定主成分的個數,即降維後資料的維度
  • svd_solver :設定特徵值分解的方法,預設為‘auto',其他可選有‘full', ‘arpack', 'randomized'。
  • 其他可檢視官網API學習

PCA實現高維資料視覺化

目標:已知鳶尾花資料是4維的,共三類樣本。使用PCA實現對鳶尾花資料進行降維,實現在二維平面上的視覺化。由4維轉變為2維。

例項程式編寫:

具體程式碼:

1、建立工程,導人sklearn相關工具包:

# 1、建立工程,導人sklearn相關工具包
import matplotlib.pyplot as plt
# 載入matplotlib用於資料的視覺化
from sklearn.decomposition import PCA
# 載入PCA演算法包
from sklearn.datasets import load_iris

2、載入資料並進行降維:

# 2、載入鳶尾花資料集匯入函式
# 載入資料並進行降維
data = load_iris()
# 以字典形式載入鳶尾花資料集
# y表示資料集中的標籤,X表示資料集中的屬性資料
y = data.target
X = data.data
# 載入PCA演算法,設定降維後主成分數目為2
pca = PCA(n_components=2)
# 對元資料進行降維,儲存在reduced_X中
reduced_X = pca.fit_transform(X)

3、按類別將降維後的資料進行儲存:

# 3、按類別將降維後的資料進行儲存
# 第一二三類據點
red_x, red_y = [], []
blue_x, blue_y = [], []
green_x, green_y = [], []
for i in range(len(reduced_X)):
    if y[i] == 0:
        red_x.append(reduced_X[i][0])
        red_y.append(reduced_X[i][1])
    elif y[i] == 1:
        blue_x.append(reduced_X[i][0])
        blue_y.append(reduced_X[i][1])
    else:
        green_x.append(reduced_X[i][0])
        green_y.append(reduced_X[i][1])

4、降維後資料點的視覺化:

# 4、降維後資料點的視覺化
# 第一二三類據點的視覺化,呼叫scatter()函式
plt.scatter(red_x, red_y, c='r', marker='x')
plt.scatter(blue_x, blue_y, c='b', marker='D')
plt.scatter(green_x, green_y, c='g', marker='.')
plt.show()

結果展示:

紅色:第一類資料點的散點圖

藍色:第二類資料點的散點圖

綠色:第綠類資料點的散點圖

可以看出,降維後的資料仍能夠清晰地分成三類。這樣不僅能削減資料的維度,降低分類任務的工作量,還能保證分類的質量。

最後的思考

感覺這次程式碼不是很複雜,可以理解,用到了一個plt.scatter()函式

plt.scatter()用法:

# plt.scatter()函式的原型:
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, *, data=None, **kwargs)

引數的解釋:

  • x,y:表示的是大小為(n)的陣列,也就是我們即將繪製散點圖的資料點

  • s:是一個實數或者是一個數組大小為(n),這個是一個可選的引數。

  • c:表示的是顏色,也是一個可選項。預設是藍色’b’,表示的是標記的顏色,或者可以是一個表示顏色的字元,或者是一個長度為n的表示顏色的序列等等,感覺還沒用到過現在不解釋了。但是c不可以是一個單獨的RGB數字,也不可以是一個RGBA的序列。可以是他們的2維陣列(只有一行)。

  • marker:表示的是標記的樣式,預設的是’o’。

Typora插入數學公式的一些用法:https://www.cnblogs.com/wreng/articles/13514391.html
我也不知道為什麼,部落格園沒法上傳Typora公式,就只能截圖了