機器學習領域中所謂的降維就是指採用某種映射方法,將原高維空間中的數據點映射到低維度的空間中。降維的本質是學習一個映射函數 f : x->y,其中x是原始數據點的表達,目前最多使用向量表達形式。 y是數據點映射後的低維向量表達,一般y的維度小於x的維度(固然提升維度也是能夠的)。算法
降維有什麼做用呢?機器學習
PCA是不考慮樣本類別輸出的無監督降維技術。函數
總結一下PCA的算法步驟:學習
設有m條n維數據。spa
1)將原始數據按列組成n行m列矩陣X.net
2)將X的每一行(表明一個屬性字段)進行零均值化,即減去這一行的均值code
3)求出協方差矩陣component
4)求出協方差矩陣的特徵值及對應的特徵向量orm
5)將特徵向量按對應特徵值大小從上到下按行排列成矩陣,取前k行組成矩陣Pblog
6)即爲降維到k維後的數據
實例分析(以二維特徵舉例):
如今假設有一組數據以下:
行表明了樣例,列表明特徵,這裏有10個樣例,每一個樣例兩個特徵。
第一步,分別求x和y的平均值,而後對於全部的樣例,都減去對應的均值。這裏x的均值是1.81,y的均值是1.91,獲得
第二步,求特徵協方差矩陣,若是數據是3維,那麼協方差矩陣是
由於這裏只有x和y,因此協方差矩陣爲
對角線上分別是x和y的方差,非對角線上是協方差。協方差是衡量兩個變量同時變化的變化程度。協方差大於0表示x和y若一個增,另外一個也增;小於0表示一個增,一個減。若是x和y是統計獨立的,那麼兩者之間的協方差就是0;可是協方差是0,並不能說明x和y是獨立的。協方差絕對值越大,二者對彼此的影響越大,反之越小。協方差是沒有單位的量,所以,若是一樣的兩個變量所採用的量綱發生變化,它們的協方差也會產生樹枝上的變化。
第三步,求協方差的特徵值和特徵向量,獲得
上面是兩個特徵值,下面是對應的特徵向量,這裏的特徵向量都歸一化爲單位向量。
第四步,將特徵值按照從大到小的順序排序,選擇其中最大的k個,而後將其對應的k個特徵向量分別做爲列向量組成特徵向量矩陣。
這裏特徵值只有兩個,咱們選擇其中最大的那個,這裏是1.28402771,對應的特徵向量是(-0.677873399, -0.735178656)T。
第五步,將樣本點投影到選取的特徵向量上。
獲得的結果是
* (-0.677873399, -0.735178656)T=
這樣,就將原始樣例的n維特徵變成了k維,這k維就是原始特徵在k維上的投影。
代碼實現:
from sklearn.decomposition import PCA import numpy as np from sklearn.preprocessing import StandardScaler x=np.array([[10001,2,55], [16020,4,11], [12008,6,33], [13131,8,22]]) x_scaler = StandardScaler() x = X
x_scaler.fit_transform(x) pca = PCA(n_components=2) pca.fit(x) Z=pca.transform(x)
LDA是一種監督學習的降維技術,也就是說它的數據集的每一個樣本是有類別輸出的。這點和PCA不一樣。LDA的思想能夠用一句話歸納,就是「投影后類內方差最小,類間方差最大」。什麼意思呢? 咱們要將數據在低維度上進行投影,投影后但願每一種類別數據的投影點儘量的接近,而不一樣類別的數據的類別中心之間的距離儘量的大。
LDA算法步驟:
1) 計算類內散度矩陣
2) 計算類間散度矩陣
3) 計算矩陣
4)計算的最大的d個特徵值和對應的d個特徵向量,獲得投影矩陣[Math Processing Error]W
5) 對樣本集中的每個樣本特徵,轉化爲新的樣本
6) 獲得輸出樣本集
部分代碼實現:
# -*- coding: utf-8 -*- """ Created on Fri Dec 1 10:49:37 2017 LDA_learning @author: BruceWong """ import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn import datasets from sklearn.discriminant_analysis import LinearDiscriminantAnalysis import numpy as np def main(): iris = datasets.load_iris() #典型分類數據模型 #這裏咱們數據統一用pandas處理 data = pd.DataFrame(iris.data, columns=iris.feature_names) data['class'] = iris.target #這裏只取兩類 # data = data[data['class']!=2] #爲了可視化方便,這裏取兩個屬性爲例 X = data[data.columns.drop('class')] Y = data['class'] #劃分數據集 x_train, x_test, y_train, y_test =train_test_split(X, Y) lda = LinearDiscriminantAnalysis(n_components=2) lda.fit(x_train, y_train) #顯示訓練結果 print(lda.means_) #中心點 print(lda.score(x_test, y_test)) #score是指分類的正確率 print(lda.scalings_)#score是指分類的正確率 x_2d = lda.transform(X) #如今已經降到二維X_2d=np.dot(X-lda.xbar_,lda.scalings_) #對於二維數據,咱們作個可視化 #區域劃分 lda.fit(x_2d,Y) h = 0.02 x_min, x_max = x_2d[:, 0].min() - 1, x_2d[:, 0].max() + 1 y_min, y_max = x_2d[:, 1].min() - 1, x_2d[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h)) Z = lda.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) plt.contourf(xx, yy, Z, cmap=plt.cm.Paired) #作出原來的散點圖 class1_x = x_2d[Y==0,0] class1_y = x_2d[Y==0,1] l1 = plt.scatter(class1_x,class1_y,color='b',label=iris.target_names[0]) class1_x = x_2d[Y==1,0] class1_y = x_2d[Y==1,1] l2 = plt.scatter(class1_x,class1_y,color='y',label=iris.target_names[1]) class1_x = x_2d[Y==2,0] class1_y = x_2d[Y==2,1] l3 = plt.scatter(class1_x,class1_y,color='r',label=iris.target_names[2]) plt.legend(handles = [l1, l2, l3], loc = 'best') plt.grid(True) plt.show() if __name__ == '__main__': main()
一、相同點
(1)二者的做用是用來降維的
(2)二者都假設符合高斯分佈
二、不一樣點
(1)LDA是有監督的降維方法,PCA是無監督的。
(2)LDA降維最多降到類別數K-1的維數,PCA沒有這個限制。
(3)LDA更依賴均值,若是樣本信息更依賴方差的話,效果將沒有PCA好。
(4)LDA可能會過擬合數據。
參考博客:https://blog.csdn.net/Chenzhi_2016/article/details/79451201