活用西瓜書 sklearn包中的常用降維演算法

2021-10-01 22:37:04 字數 4143 閱讀 7475

最近在讀西瓜書,查閱了多方資料,惡補了數值代數、統計概率和線代,總算是勉強看懂了西瓜書中的公式推導。但是知道了公式以後還是要學會應用的,幾經摸索發現python下的sklearn包把機器學習中經典的演算法都封裝好了,因此,打算寫幾篇部落格記錄一下sklearn包下的常用學習演算法的使用,防止自己以後忘了,嘿嘿。(太忙了,拖拖拉拉幾個月只寫了六篇,但是還是要加油!)

降維實際上就是把高維空間的資料轉換對映到低維空間中,從而達到降低資料維度的目的,比如將1000維資料降維到200維,其實就是把1000維的空間資料通過降維演算法對映到乙個200維的空間的過程,需要注意的是降維前後特徵的數量是不變的。

在一開始學習的時候,我分不清特徵降維和特徵選擇的區別,因為降維和特徵選擇演算法的輸出都是維度數減少的資料,甚至一度以為只是叫法上有所不同,經過一番研究,我才意識到兩者是天差地別的:

特徵選擇:特徵選擇其實是乙個「丟棄不重要的屬性特徵」的過程,在我介紹特徵選擇的那篇博文中也講到,特徵選擇實際上是通過統計學方法檢驗每個屬性對於**結果的重要程度,甚至直接去檢驗去電某個屬性列後**結果的變化,由此對資料特徵的重要程度進行排序,在按照要求直接「丟棄」相應數量的特徵列,以達到減小運算規模的效果,特徵選擇後保留下的列的資料值是不變的,和特徵選擇前相同。

特徵降維:正如簡介中所說的,降維實際上是一種空間的轉換,即把高位空間資料對映到低維空間去,相當於進行了座標變換,資料點本身是不動的,相應地,降維後資料點的座標值會發生變化。西瓜書232頁和234頁的圖將降維描述的很形象。

pca降維:即主成分分析,也是最常用的一種降維演算法,其思想就是尋找乙個空間,使得各樣本點到投影座標軸上的距離(誤差)最小。

t-sne:西瓜書中介紹的流形學習方法就是這種降維演算法的主要思想,即在低維空間中找出高維資料的流形對映,可以使用降維+聚類的迭代來實現演算法。

lda:也叫線性判別式分析,lda是監督式的將為,需要傳入資料的結果標籤,主要思想就是設法把樣本投影到這樣一條直線上:同類樣本在直線上的距離最近,不同類樣本在直線上的距離最遠。

fa:即因子分析,因子分析其實就是認為高維樣本點實際上是由低維樣本點經過高斯分布、線性變換、誤差擾動生成的,由此思想來進行降維。

此外,還有一些降維演算法(如svd矩陣奇異值分解,實際上在sklearn的pca演算法中就用到了奇異值分解)

sklearn模組將上述常用的降維演算法都進行了封裝,函式的名字都很直觀(就是降維演算法的名字),用法都很統一,以下**使用iris資料集來測試這些函式,並進行視覺化:

'''

本**片演示sklearn模組下的常用資料降維演算法

並將結果視覺化比較各類降維演算法優劣

'''from sklearn import datasets

from sklearn.decomposition import pca

from sklearn.manifold import tsne

from sklearn.discriminant_analysis import lineardiscriminantanalysis

from sklearn.decomposition import factoranalysis

from matplotlib import pyplot as plt

import numpy as np

import pandas as pd

iris=datasets.load_iris(

)x=iris.data

y=iris.target

#pca降維演算法

pca=pca(n_components=2)

x_pca=pca.fit_transform(x)

# print(x_pca)

#t-sne降維演算法

tsne=tsne(n_components=2)

x_tsne=tsne.fit_transform(x)

#lda,注意此演算法是監督降維,需要傳入正確結果

lda=lineardiscriminantanalysis(n_components=2)

x_lda=lda.fit_transform(x,y)

#fa降維

fa=factoranalysis(n_components=2)

x_fa=fa.fit_transform(x)

#整理降維後的資料,把第一維和第二維都單抽成列表,方便繪圖

defmergedata

(data)

: x_list=

y_list=

for i in

range

(len

(data)):

[0])

[1])

return x_list,y_list

fig=plt.figure(

)ax1=fig.add_subplot(2,

2,1)

ax2=fig.add_subplot(2,

2,2)

ax3=fig.add_subplot(2,

2,3)

ax4=fig.add_subplot(2,

2,4)

(x_pca,y_pca)

=mergedata(x_pca)

(x_tsne,y_tsne)

=mergedata(x_tsne)

(x_lda,y_lda)

=mergedata(x_lda)

(x_fa,y_fa)

=mergedata(x_fa)

#把3類鳶尾花降維後的資料標成不同的顏色,方便比較降維效果

ax1.scatter(x_pca[0:

50],y_pca[0:

50],s=20

,color=

'red'

)ax1.scatter(x_pca[50:

100]

,y_pca[50:

100]

,s=20

,color=

'green'

)ax1.scatter(x_pca[

100:

],y_pca[

100:

],s=

20,color=

'blue'

)ax2.scatter(x_tsne[0:

50],y_tsne[0:

50],s=20

,color=

'red'

)ax2.scatter(x_tsne[50:

100]

,y_tsne[50:

100]

,s=20

,color=

'green'

)ax2.scatter(x_tsne[

100:

],y_tsne[

100:

],s=

20,color=

'blue'

)ax3.scatter(x_lda[0:

50],y_lda[0:

50],s=20

,color=

'red'

)ax3.scatter(x_lda[50:

100]

,y_lda[50:

100]

,s=20

,color=

'green'

)ax3.scatter(x_lda[

100:

],y_lda[

100:

],s=

20,color=

'blue'

)ax4.scatter(x_fa[0:

50],y_fa[0:

50],s=20

,color=

'red'

)ax4.scatter(x_fa[50:

100]

,y_fa[50:

100]

,s=20

,color=

'green'

)ax4.scatter(x_fa[

100:

],y_fa[

100:

],s=

20,color=

'blue'

)plt.show(

)

上述**的執行結果如下圖:

Anaconda中sklearn包不全

起因 一開始在一台伺服器上單獨安裝了sklearn,用於訓練模型,生成pkl檔案。後來由於發現anaconda中整合了包含sklearn在內測好多安裝包,於是打算將程式移植到anaconda上,並且保留原先的模型pkl檔案。結果在除錯的時候發現了錯誤。主要是在載入pkl檔案的時候,出現錯誤。排查過程...

Python中常用的包 sklearn

樸素貝葉斯 該方法的任務是還原訓練樣本資料的分布密度,在多分類中有很好的效果 樸素貝葉斯分類的優缺點 優點 1 演算法邏輯簡單,易於實現 演算法思路很簡單,只要使用貝葉斯公式轉化一下即可!2 分類過程中時空開銷小 假設特徵相互獨立,只會涉及到二維儲存 缺點 理論上,樸素貝葉斯模型與其他分類方法相比具...

sklearn包中的分析演算法對 資料進行處理

import xlrd import json import re 開啟excel檔案 excel xlrd.open workbook c data.xlsx 獲取第二個sheet sheet excel.sheets 3 arr r 0,0,0,0,0,0 arr all 0,0,0,0,0,0...