主成分分析PCA數據降維原理及python應用(葡萄酒案例分析)

目錄html

主成分分析(PCA)——以葡萄酒數據集分類爲例python

  一、認識PCA服務器

    (1)簡介dom

    (2)方法步驟ide

  二、提取主成分學習

  三、主成分方差可視化spa

  四、特徵變換.net

  五、數據分類結果3d

  六、完整代碼code

  總結:


 

一、認識PCA

(1)簡介

數據降維的一種方法是經過特徵提取實現,主成分分析PCA就是一種無監督數據壓縮技術,普遍應用於特徵提取和降維。

換言之,PCA技術就是在高維數據中尋找最大方差的方向,將這個方向投影到維度更小的新子空間。例如,將原數據向量x,經過構建 d\times k 維變換矩陣 W,映射到新的k維子空間,一般(k< < d)。

原數據d維向量空間 \large x=[x_{1},x_{2},...,x_{d}],x\in R^{d} 通過 xW,W\in R^{d\times k},獲得新的k維向量空間 \large z=[z_{1},z_{2},...,z_{k}],z\in R^{k}.

第一主成分有最大的方差,在PCA以前須要對特徵進行標準化,保證全部特徵在相同尺度下均衡。

(2)方法步驟

  1. 標準化d維數據集
  2. 構建協方差矩陣。
  3. 將協方差矩陣分解爲特徵向量和特徵值。
  4. 對特徵值進行降序排列,相應的特徵向量做爲總體降序。
  5. 選擇k個最大特徵值的特徵向量,k< < d
  6. 根據提取的k個特徵向量構造投影矩陣\large W
  7. d維數據通過\large W變換得到k維。

 

下面使用python逐步完成葡萄酒的PCA案例。

二、提取主成分

下載葡萄酒數據集wine.data到本地,或者到時在加載數據代碼是從遠程服務器獲取,爲了不加載超時推薦下載本地數據集。

來看看數據集長什麼樣子!一共有3類,標籤爲1,2,3 。每一行爲一組數據,由13個維度的值表示,咱們將它當作一個向量。

開始加載數據集。

import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt # load data
df_wine = pd.read_csv('D:\\PyCharm_Project\\maching_learning\\wine_data\\wine.data', header=None)  # 本地加載,路徑爲本地數據集存放位置 # df_wine=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data',header=None)#服務器加載

下一步將數據按7:3劃分爲training-data和testing-data,並進行標準化處理。

# split the data,train:test=7:3
x, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, stratify=y, random_state=0) # standardize the feature 標準化
sc = StandardScaler() x_train_std = sc.fit_transform(x_train) x_test_std = sc.fit_transform(x_test)

這個過程能夠自行打印出數據進行觀察研究。

接下來構造協方差矩陣。\large d\times d 維協方差對稱矩陣,實際操做就是計算不一樣特徵列之間的協方差。公式以下:

\LARGE \sigma _{jk}=\frac{1}{n}\sum_{i=1}^{n}(x_{j}^{(i)}-\mu _{j})(x_{k}^{(i)}-\mu _{k})

公式中,jk就是在矩陣中的行列下標,i表示第i行數據,\mu_{j},\mu_{k}分別爲特徵列 j,k的均值。最後獲得的協方差矩陣是13*13,這裏以3*3爲例,以下:

\sum =\begin{bmatrix} \sigma _{1}^{2} \sigma _{12} \sigma _{13}\\ \sigma _{21} \sigma _{2}^{2} \sigma _{23}\\ \sigma _{31} \sigma _{32} \sigma _{3}^{2} \end{bmatrix}

下面使用numpy實現計算協方差並提取特徵值和特徵向量。

# 構造協方差矩陣,獲得特徵向量和特徵值
cov_matrix = np.cov(x_train_std.T) eigen_val, eigen_vec = np.linalg.eig(cov_matrix) # print("values\n ", eigen_val, "\nvector\n ", eigen_vec)# 能夠打印看看

三、主成分方差可視化

首先,計算主成分方差比率,每一個特徵值方差與特徵值方差總和之比:

\LARGE \frac{\lambda _{j}}{\sum_{j=1}^{d}\lambda _{j}}

代碼實現:

# 解釋方差比
tot = sum(eigen_val)  # 總特徵值和
var_exp = [(i / tot) for i in sorted(eigen_val, reverse=True)]  # 計算解釋方差比,降序 # print(var_exp)
cum_var_exp = np.cumsum(var_exp)  # 累加方差比率
plt.rcParams['font.sans-serif'] = ['SimHei']  # 顯示中文
plt.bar(range(1, 14), var_exp, alpha=0.5, align='center', label='獨立解釋方差')  # 柱狀 Individual_explained_variance
plt.step(range(1, 14), cum_var_exp, where='mid', label='累加解釋方差')  # Cumulative_explained_variance
plt.ylabel("解釋方差率") plt.xlabel("主成分索引") plt.legend(loc='right') plt.show()

可視化結果看出,第一二主成分佔據大部分方差,接近60%。

四、特徵變換

這一步須要構造以前講到的投影矩陣\large W,從高維d變換到低維空間k。

先將提取的特徵對進行降序排列:

# 特徵變換
eigen_pairs = [(np.abs(eigen_val[i]), eigen_vec[:, i]) for i in range(len(eigen_val))] eigen_pairs.sort(key=lambda k: k[0], reverse=True)  # (特徵值,特徵向量)降序排列

從上步驟可視化,選取第一二主成分做爲最大特徵向量進行構造投影矩陣。

w = np.hstack((eigen_pairs[0][1][:, np.newaxis], eigen_pairs[1][1][:, np.newaxis]))  # 降維投影矩陣W

13*2維矩陣以下:

這時,將原數據矩陣與投影矩陣相乘,轉化爲只有兩個最大的特徵主成分。

x_train_pca = x_train_std.dot(w)

五、數據分類結果

使用 matplotlib進行畫圖可視化,可見得,數據分佈更多在x軸方向(第一主成分),這與以前方差佔比解釋一致,這時能夠很直觀區別3種不一樣類別。

代碼實現:

color = ['r', 'g', 'b'] marker = ['s', 'x', 'o'] for l, c, m in zip(np.unique(y_train), color, marker): plt.scatter(x_train_pca[y_train == l, 0], x_train_pca[y_train == l, 1], c=c, label=l, marker=m) plt.title('Result') plt.xlabel('PC1') plt.ylabel('PC2') plt.legend(loc='lower left') plt.show()

本案例介紹PCA單個步驟和實現過程,一點很重要,PCA是無監督學習技術,它的分類沒有使用到樣本標籤,上面之因此看出3類不一樣標籤,是後來畫圖時候自行添加的類別區分標籤。

六、完整代碼

import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt def main(): # load data
    df_wine = pd.read_csv('D:\\PyCharm_Project\\maching_learning\\wine_data\\wine.data', header=None)  # 本地加載
    # df_wine=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data',header=None)#服務器加載
 
    # split the data,train:test=7:3
    x, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, stratify=y, random_state=0) # standardize the feature 標準化單位方差
    sc = StandardScaler() x_train_std = sc.fit_transform(x_train) x_test_std = sc.fit_transform(x_test) # print(x_train_std)
 
    # 構造協方差矩陣,獲得特徵向量和特徵值
    cov_matrix = np.cov(x_train_std.T) eigen_val, eigen_vec = np.linalg.eig(cov_matrix) # print("values\n ", eigen_val, "\nvector\n ", eigen_vec)
 
    # 解釋方差比
    tot = sum(eigen_val)  # 總特徵值和
    var_exp = [(i / tot) for i in sorted(eigen_val, reverse=True)]  # 計算解釋方差比,降序
    # print(var_exp)
    # cum_var_exp = np.cumsum(var_exp) # 累加方差比率
    # plt.rcParams['font.sans-serif'] = ['SimHei'] # 顯示中文
    # plt.bar(range(1, 14), var_exp, alpha=0.5, align='center', label='獨立解釋方差') # 柱狀 Individual_explained_variance
    # plt.step(range(1, 14), cum_var_exp, where='mid', label='累加解釋方差') # Cumulative_explained_variance
    # plt.ylabel("解釋方差率")
    # plt.xlabel("主成分索引")
    # plt.legend(loc='right')
    # plt.show()
 
    # 特徵變換
    eigen_pairs = [(np.abs(eigen_val[i]), eigen_vec[:, i]) for i in range(len(eigen_val))] eigen_pairs.sort(key=lambda k: k[0], reverse=True)  # (特徵值,特徵向量)降序排列
    # print(eigen_pairs)
    w = np.hstack((eigen_pairs[0][1][:, np.newaxis], eigen_pairs[1][1][:, np.newaxis]))  # 降維投影矩陣W
    # print(w)
    x_train_pca = x_train_std.dot(w) # print(x_train_pca)
    color = ['r', 'g', 'b'] marker = ['s', 'x', 'o'] for l, c, m in zip(np.unique(y_train), color, marker): plt.scatter(x_train_pca[y_train == l, 0], x_train_pca[y_train == l, 1], c=c, label=l, marker=m) plt.title('Result') plt.xlabel('PC1') plt.ylabel('PC2') plt.legend(loc='lower left') plt.show() if __name__ == '__main__': main()
View Code

總結:

本案例介紹PCA步驟和實現過程,單步進行是我更理解PCA內部實行的過程,主成分分析PCA做爲一種無監督數據壓縮技術,學習以後更好掌握數據特徵提取和降維的實現方法。記錄學習過程,不只能讓本身更好的理解知識,並且能與你們共勉,但願咱們都能有所幫助!

 

個人博客園:http://www.javashuo.com/article/p-hrboijii-mo.html

個人CSDN:原創 PCA數據降維原理及python應用(葡萄酒案例分析)

 


 

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。
本文連接:https://blog.csdn.net/Charzous/article/details/107883679
相關文章
相關標籤/搜索