使用Python進行數據降維|線性降維


前言

為什么要進行數據降維?直觀地好處是維度降低了,便於計算和可視化,其深層次的意義在於有效信息的提取綜合及無用信息的擯棄,並且數據降維保留了原始數據的信息,我們就可以用降維的數據進行機器學習模型的訓練和預測,但將有效提高訓練和預測的時間與效率。

降維方法分為線性非線性降維,非線性降維又分為基於核函數和基於特征值的方法(流形學習),代表算法有

  • 線性降維方法:PCA ICA LDA LFA
  • 基於核的非線性降維方法KPCA KFDA
  • 流形學習:ISOMAP LLE LE LPP

本文主要對線性降維方法中的PCA、ICA、LDA的Python實現進行講解。

請注意本文將不對各種數據降維方法的原理與理論推導過程做過多的講解,旨在用盡可能少的語言說清楚以及如何用Python實現,先實現再理解,並在讀完代碼之后自行查閱相關文獻理解其不同的思想。但讀者應具有一定的統計學、代數學、機器學習的基礎。

 

主成分分析PCA

主成分分析(Principal Component Analysis),是一種常用的數據降維方法。通過正交變換將一組可能存在相關性的變量轉換為一組線性不相關的變量,轉換后的這組變量就叫主成分。關於主成分分析的思想與理論推導過程在互聯網上很容易找到完美的證明,用人話說來就是找到一個軸,將你的數據映射到這個軸上之后所計算的方差最大,再換句人話說就是從原始數據的一堆變量中提取出一部分變量,而這部分變量能完美解釋原始數據中包含的信息(或保留原始的數據特性)

 

 

注意:

  • 進行主成分分析前需對數據進行歸一化處理

PCA流程:

  • 對數據行歸一化處理
  • 計算歸一化后的數據集的協方差矩陣與其特征值、特征向量
  • 對特征值從大到小排序並保留最大的個特征向量
  • 將數據轉換到個特征向量構建的新空間中

優點:

  • 無參數限制
  • 提取了主要信息並且結果容易理解

缺點:

  • 方差小的主成分可能含有對樣本差異的重要信息
  • 在某些情況下,PCA方法得出的主元可能並不是最優的

相關Python代碼

sklearn.decomposition.PCA

Python實現示例(已注釋)

#來看個官網最簡單的例子
>>> import numpy as np
>>> from sklearn.decomposition import PCA
#創建數據 矩陣形式
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
#設定兩個主成分
>>> pca = PCA(n_components=2)
#用X訓練
>>> pca.fit(X)
PCA(n_components=2)
#查看每個主成分解釋程度
>>> print(pca.explained_variance_ratio_)
[0.9924... 0.0075...]
>>> print(pca.singular_values_)
[6.30061... 0.54980...]
#降維
>>> pca = PCA(n_components=1, svd_solver='arpack')
>>> pca.fit(X)
PCA(n_components=1, svd_solver='arpack')
>>> print(pca.explained_variance_ratio_)
[0.99244...]
>>> print(pca.singular_values_)
[6.30061...]

 

線性判別分析LDA

線性判別分析(Linear Discriminant Analysis)是一種有監督的(supervised)線性降維算法。與PCA保持數據信息不同,LDA的核心思想:往線性判別超平面的法向量上投影,使得區分度最大(高內聚,低耦合)。LDA是為了使得降維后的數據點盡可能地容易被區分!

 

 

與PCA比較

  • PCA為無監督降維,LDA為有監督降維
  • LDA降維最多降到類別數K-1的維數,PCA沒有這個限制。
  • PCA希望投影后的數據方差盡可能的大(最大可分性),而LDA則希望投影后相同類別的組內方差小,而組間方差大。

相關Python代碼

sklearn.discriminant_analysis.LinearDiscriminantAnalysis

Python實現示例(已注釋)

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline
from sklearn.datasets.samples_generator import make_classification
#生成數據
X, y = make_classification(n_samples=1000, n_features=3, n_redundant=0, n_classes=3, n_informative=2,
                           n_clusters_per_class=1,class_sep =0.5, random_state =10)
#LDA降維
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda = LinearDiscriminantAnalysis(n_components=2)
lda.fit(X,y)
X_new = lda.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=y)
plt.show()

獨立成分分析ICA

獨立成分分析(Independent component analysis)是一種利用統計原理進行計算的方法,它是一個線性變換,這個變換把數據或信號分離成統計獨立的非高斯的信號源的線性組合。之前介紹的PCA、LDA都是以觀測數據點呈高斯分布模型為基本假設前提的,而ICA將適用於非高斯分析數據集,是PCA的一種有效擴展。

 

與PCA比較

  • ICA尋找的是最能使數據的相互獨立的方向,而PCA僅要求方向是不相關的
  • PCA認為主元之間彼此正交,樣本呈高斯分布;ICA則不要求樣本呈高斯分布

相關Python代碼

sklearn.decomposition.FastICA

Python實現示例(已注釋)

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
from sklearn.decomposition import FastICA, PCA
# 生成觀測模擬數據
np.random.seed(0)
n_samples = 2000
time = np.linspace(0, 8, n_samples)
s1 = np.sin(2 * time) # 信號源 1 : 正弦信號
s2 = np.sign(np.sin(3 * time)) # 信號源 2 : 方形信號
s3 = signal.sawtooth(2 * np.pi * time) # 信號源 3: 鋸齒波信號
S = np.c_[s1, s2, s3]
S += 0.2 * np.random.normal(size=S.shape) # 增加噪音數據
S /= S.std(axis=0) # 標准化
# 混合數據
A = np.array([[1, 1, 1], [0.5, 2, 1.0], [1.5, 1.0, 2.0]]) # 混合矩陣
X = np.dot(S, A.T) # 生成觀測信號源
# ICA模型
ica = FastICA(n_components=3)
S_ = ica.fit_transform(X) # 重構信號
A_ = ica.mixing_ # 獲得估計混合后的矩陣
# PCA模型
pca = PCA(n_components=3)
H = pca.fit_transform(X) # 基於PCA的成分正交重構信號源
# 圖形展示
plt.figure()
models = [X, S, S_, H]
names = ['Observations (mixed signal)',
         'True Sources',
         'ICA recovered signals',
         'PCA recovered signals']
colors = ['red', 'steelblue', 'orange']
for ii, (model, name) in enumerate(zip(models, names), 1):
    plt.subplot(4, 1, ii)
    plt.title(name)
    for sig, color in zip(model.T, colors):
        plt.plot(sig, color=color)
plt.subplots_adjust(0.09, 0.04, 0.94, 0.94, 0.26, 0.46)
plt.show()

以上就是早起的統計工具箱第二期的內容,當然想要完全學會還需要自行查閱更多文獻,而更多的數據降維方法、還有上一期未介紹完的python統計檢驗我們之后再聊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM