機器學習領域中所謂的降維就是指採用某種對映方法,將原高維空間中的資料點對映到低維度的空間中。降維的本質是學習乙個對映函式 f : x->y,其中x是原始資料點的表達,目前最多使用向量表達形式。 y是資料點對映後的低維向量表達,通常y的維度小於x的維度(當然提高維度也是可以的)。f可能是顯式的或隱式的、線性的或非線性的。
目前大部分降維演算法處理向量表達的資料,也有一些降維演算法處理高階張量表達的資料。之所以使用降維後的資料表示是因為在原始的高維空間中,包含有冗餘資訊以及噪音資訊,在實際應用例如影象識別中造成了誤差,降低了準確率;而通過降維,我們希望減少 冗餘資訊 所造成的誤差,提高識別(或其他應用)的精度。又或者希望通過降維演算法來尋找資料內部的本質結構特徵。
在很多演算法中,降維演算法成為了資料預處理的一部分,如pca。事實上,有一些演算法如果沒有降維預處理,其實是很難得到很好的效果的。
資料降維主要分為線性方法與非線性方法。其中線性方法主要有無監督pca、有監督lda。非線性方法有以保留區域性特徵為代表的基於重建權值的lle、基於鄰接圖的拉普拉斯特徵對映等。還有保留全域性特徵為代表的基於核kpca、基於距離保持的mds(歐式距離)極其擴充套件演算法isomap(測地線距離)。以及定義資料的區域性和全域性結構之間的軟邊界的t-sne。每種演算法都有其適用的應用領域,具體使用那種演算法極其引數設定都需要根據具體情況進行確認。
下面以digits數字影象集為例來對比一下各大降維演算法。不過也不能完全說明問題,因為有些演算法並不適合處理此類資料,
from time import time
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import offsetbox
from sklearn import manifold, datasets, decomposition, ensemble,discriminant_analysis, random_projection
from mpl_toolkits.mplot3d import axes3d
digits = datasets.load_digits(n_class=5)
x = digits.data
y = digits.target
print ('樣本個數: ',x.shape[0],'樣本維度: ',x.shape[1])
n_img_per_row = 20
img = np.zeros((10 * n_img_per_row, 10 * n_img_per_row))
for i in range(n_img_per_row):
ix = 10 * i + 1
for j in range(n_img_per_row):
iy = 10 * j + 1
img[ix:ix + 8, iy:iy + 8] = x[i * n_img_per_row + j].reshape((8, 8))
plt.imshow(img, cmap=plt.cm.binary)
plt.title('data')
algorithm_set=[
manifold.tsne(n_components=3),
manifold.locallylinearembedding(n_components=3),
manifold.isomap(n_components=3),
manifold.mds(n_components=3),
decomposition.pca(n_components=3),
decomposition.kernelpca(n_components=3,kernel='rbf'),
decomposition.kernelpca(n_components=3,kernel='poly'),
decomposition.kernelpca(n_components=3,kernel='sigmoid'),
discriminant_analysis.lineardiscriminantanalysis(n_components=3)
]name_set=[
'tsne',
'lle',
'isomap',
'mds',
'pca',
'kpca-rbf',
'kpca-poly',
'kpca-sigmoid',
'lda'
]
for i,algorithm in enumerate(algorithm_set):
t0 = time()
x = algorithm.fit_transform(x,y)
#座標縮放到[0,1]區間
x_min, x_max = np.min(x,axis=0), np.max(x,axis=0)
x = (x - x_min) / (x_max - x_min)
title = name_set[i]+": (time %.2fs)" %(time() - t0)
fig = plt.figure(name_set[i])
ax = axes3d(fig)
for j in range(x.shape[0]):
ax.text(x[j, 0], x[j, 1], x[j,2],str(y[j]),color=plt.cm.set1((y[j]+1) / 10.),fontdict=)
plt.title(title)
plt.show()
先看5個分類的:
再看10個分類的:
感覺除了時間複雜度炸裂的t_sne,其他的都彷彿失了智一樣。
至此,機器學習部分就先告一段落了,總體來說還是蠻難搞的,雖然強大的sklearn庫可以提供各種api以及測試資料,不過若想深入了解其中的原理,必須要自己一步一步的推導,一步一步的實現。比如這個:
接下來學習deep learning還會面臨更高的挑戰,我只能說,祝大家身體健康吧- -再見!
人工智障學習筆記 機器學習 13 LLE降維
一.概念 lle locally linear embedding 區域性線性嵌入演算法 是一種非線性降維演算法,它能夠使降維後的資料較好地保持原有流形結構。lle可以說是流形學習方法最經典的工作之一。和傳統的pca,lda等關注樣本方差的降維方法相比,lle關注於降維時保持樣本區域性的線性特徵,由...
人工智障學習筆記 深度學習 1 神經網路
一.神經網路 我們所說的深度學習,其最基礎最底層的模型稱之為 神經網路 neural network 因為我們希望機器能夠像我們人類大腦的神經網路處理事件一樣去解決問題,最終達到 人工智慧 的效果。二.神經元 神經網路的基本單位叫做神經元,是我們人類思考的基礎。機器模擬的神經元模型是乙個包含輸入,輸...
人工智障學習筆記 深度學習 4 生成對抗網路
概念 生成對抗網路 gan 是一種深度學習模型,是近年來複雜分布上無監督學習最具前景的方法之一。模型通過框架中 至少 兩個模組 生成模型 generative model 和判別模型 discriminative model 的互相博弈學習產生相當好的輸出。判別模型比較好理解,就像分類一樣,有乙個判...