使用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