Python學習數據降維方法


使用sklearn庫初次嘗試PCA和T-SNE,原理還不太理解,寫錯了請一定指出,或者等我自己發現hhhh

1. PCA

首先讀入sklearn里自帶的鳶尾花數據庫,並調用相關的包,再查看一下這些數據都是些啥:

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
from sklearn.manifold import TSNE
from sklearn.cluster import KMeans
data1 = load_iris()
print type(data1)
x = data1.data
y = data1.target
print type(x)
print x.shape

結果:
data1是個對象,調用.data和.target可以查看變量的值和已經知道的鳶尾花種類分類,x和y都是數組類型,里面存放數據。
樣本總數是150個,種類用012表示,有三類。

<class 'sklearn.utils.Bunch'>
<type 'numpy.ndarray'>
(150L, 4L)
(150L,)

函數原型為sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False),具體參數設置:

參數 解釋 數據類型
n_components: PCA算法中所要保留的主成分個數n,也即保留下來的特征個數n int 或者 string,缺省時默認為None,所有成分被保留。賦值為int,比如n_components=1,將把原始數據降到一個維度。賦值為string,比如n_components='mle',將自動選取特征個數n,使得滿足所要求的方差百分比。
copy 表示是否在運行算法時,將原始訓練數據復制一份。若為True,則運行PCA算法后,原始訓練數據的值不會有任何改變,因為是在原始數據的副本上進行運算;若為False,則運行PCA算法后,原始訓練數據的值會改,因為是在原始數據上進行降維計算 bool,True或者False,缺省時默認為True
whiten 白化,使得每個特征具有相同的方差 bool,缺省時默認為False

PCA對象的方法:

對象名稱 解釋 返回值
fit(X,y=None) 表示對X數據進行訓練。每個需要訓練的算法都會有fit()方法,就是實現算法中“訓練”的過程,y=groundtruth,PCA是無監督學習,故等於none。 調用fit方法的對象本身。比如y=pca.fit(X),表示用X對pca這個對象進行訓練,得到的y是個PCA對象?里面仍然具有其他方法?
fit_transform(X) 用X來訓練PCA模型,同時返回降維后的數據。 newX=pca.fit_transform(X),newX就是降維后的數據,array格式
inverse_transform() 將降維后的數據轉換成原始數據 X=pca.inverse_transform(newX),X是原始4維數據?
transform(X) 將數據X轉換成降維后的數據。當模型訓練好后,對於新輸入的數據,都可以用transform方法來降維。我不太明白,這個模型訓練好指的是什么?投影矩陣嗎?會存在哪里?還是作為一個返回值? 降維后的數據
get_covariance()
get_precision()
get_params(deep=True)
score(X,y=None)

采用fit_transform(x)函數對x這個四維數據進行訓練,並且得到返回后的二維值。注意!不要覺得x和y都寫在一個表格里就是二維數據,要理解為y是由4個x1、x2、x3、x4共同確定,表示在一個四維空間里的。

pca = PCA(n_components=2) #
#print pca
# PCA(copy=True, iterated_power='auto', n_components=2, random_state=None,
           # svd_solver='auto', tol=0.0, whiten=False)
reduce_X = pca.fit_transform(x)
# 查看降維后的數據分布
plt.scatter(reduce_X[:,0], reduce_X[:,1],c = y)
plt.show()

也可以分開畫圖,采用不同的顏色和形狀表示:

for i in range(len(reduce_X)):
    if y[i]==0:
        rx.append(reduce_X[i, 0])
        ry.append(reduce_X[i, 1])
    else:
        if y[i]==1:
            bx.append(reduce_X[i, 0])
            by.append(reduce_X[i, 1])
        else:
            gx.append(reduce_X[i, 0])
            gy.append(reduce_X[i, 1])

plt.scatter(rx, ry, marker='o')
plt.scatter(bx, by, marker='D')
plt.scatter(gx, gy, marker='s')
plt.title('iris after pca')
plt.savefig('./iris_after_pca.jpg')
plt.show()

結果:

也就是說,現在這3種鳶尾花可以只用2個變量表示就可以區分

  • 我想看一下變量之間的相關性?待補充…… 對於dataframe格式的數據可以直接調用.corr()查看相關性。
  • 解釋PCA降維之后的數據?我記得是可以解釋的…… 不可以!聚類之后是可以解釋的,但是矩陣分解和降維結果實際上是不可以解釋的!

2.T-SNE

tnse = TSNE(learning_rate=100)
reduce_X = tnse.fit_transform(x)
print reduce_X.shape

很神奇,它自己降到2維了……,可視化一下

plt.scatter(reduce_X[:,0], reduce_X[:,1],c = y)
plt.title('iris after tnse ')
plt.savefig('./iris_after_tnse.jpg')
plt.show()

結果:

關於fit_transform和transform函數的區別:

馬住可能會看的文章:
關於mle的參數設置問題:
http://www.cnblogs.com/bambipai/p/7787854.html

參考:

https://blog.csdn.net/u012162613/article/details/42192293


免責聲明!

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



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