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公式,就只能截圖了