1. 程式人生 > 程式設計 >python實現PCA降維的示例詳解

python實現PCA降維的示例詳解

概述

本文主要介紹一種降維方法,PCA(Principal Component Analysis,主成分分析)。降維致力於解決三類問題。

1. 降維可以緩解維度災難問題;

2. 降維可以在壓縮資料的同時讓資訊損失最小化;

3. 理解幾百個維度的資料結構很困難,兩三個維度的資料通過視覺化更容易理解。

PCA簡介

在理解特徵提取與處理時,涉及高維特徵向量的問題往往容易陷入維度災難。隨著資料集維度的增加,演算法學習需要的樣本數量呈指數級增加。有些應用中,遇到這樣的大資料是非常不利的,而且從大資料集中學習需要更多的記憶體和處理能力。另外,隨著維度的增加,資料的稀疏性會越來越高。在高維向量空間中探索同樣的資料集比在同樣稀疏的資料集中探索更加困難。

主成分分析也稱為卡爾胡寧-勒夫變換(Karhunen-Loeve Transform),是一種用於探索高維資料結構的技術。PCA通常用於高維資料集的探索與視覺化。還可以用於資料壓縮,資料預處理等。PCA可以把可能具有相關性的高維變數合成線性無關的低維變數,稱為主成分( principal components)。新的低維資料集會盡可能的保留原始資料的變數。

PCA將資料投射到一個低維子空間實現降維。例如,二維資料集降維就是把點投射成一條線,資料集的每個樣本都可以用一個值表示,不需要兩個值。三維資料集可以降成二維,就是把變數對映成一個平面。一般情況下,nn維資料集可以通過對映降成kk維子空間,其中k≤nk≤n。

假如你是一本養花工具宣傳冊的攝影師,你正在拍攝一個水壺。水壺是三維的,但是照片是二維的,為了更全面的把水壺展示給客戶,你需要從不同角度拍幾張圖片。下圖是你從四個方向拍的照片:

python實現PCA降維的示例詳解

第一張圖裡水壺的背面可以看到,但是看不到前面。第二張圖是拍前面,可以看到壺嘴,這張圖可以提供了第一張圖缺失的資訊,但是壺把看不到了。從第三張俯視圖裡無法看出壺的高度。第四張圖是你真正想要的,水壺的高度,頂部,壺嘴和壺把都清晰可見。

PCA的設計理念與此類似,它可以將高維資料集對映到低維空間的同時,儘可能的保留更多變數。PCA旋轉資料集與其主成分對齊,將最多的變數保留到第一主成分中。假設我們有下圖所示的資料集:

python實現PCA降維的示例詳解

資料集看起來像一個從原點到右上角延伸的細長扁平的橢圓。要降低整個資料集的維度,我們必須把點對映成一條線。下圖中的兩條線都是資料集可以對映的,對映到哪條線樣本變化最大?

python實現PCA降維的示例詳解

顯然,樣本對映到黑色虛線的變化比對映到紅色點線的變化要大的多。實際上,這條黑色虛線就是第一主成分。第二主成分必須與第一主成分正交,也就是說第二主成分必須是在統計學上獨立的,會出現在與第一主成分垂直的方向,如下圖所示:

python實現PCA降維的示例詳解

後面的每個主成分也會盡量多的保留剩下的變數,唯一的要求就是每一個主成分需要和前面的主成分正交。

現在假設資料集是三維的,散點圖看起來像是沿著一個軸旋轉的圓盤。

python實現PCA降維的示例詳解

這些點可以通過旋轉和變換使圓盤完全變成二維的。現在這些點看著像一個橢圓,第三維上基本沒有變數,可以被忽略。

當資料集不同維度上的方差分佈不均勻的時候,PCA最有用。(如果是一個球殼形資料集,PCA不能有效的發揮作用,因為各個方向上的方差都相等;沒有丟失大量的資訊維度一個都不能忽略)。

python實現PCA降維程式碼

# coding=utf-8
from sklearn.decomposition import PCA 
from pandas.core.frame import DataFrame
import pandas as pd 
import numpy as np 
l=[]
with open('test.csv','r') as fd:
 
  line= fd.readline()
  while line:
    if line =="":
      continue
 
    line = line.strip()
    word = line.split(",")
    l.append(word)
    line= fd.readline()
 
data_l=DataFrame(l)
print (data_l)
dataMat = np.array(data_l) 
 
 
pca_sk = PCA(n_components=2) 
newMat = pca_sk.fit_transform(dataMat) 
 
 
data1 = DataFrame(newMat)
data1.to_csv('test_PCA.csv',index=False,header=False)

以上這篇python實現PCA降維的示例詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。