【机器学习】降维代码练习
本課程是中國大學慕課《機器學習》的“降維”章節的課后代碼。
課程地址:
https://www.icourse163.org/course/WZU-1464096179
課程完整代碼:
https://github.com/fengdu78/WZU-machine-learning-course
代碼修改并注釋:黃海廣,haiguang2000@wzu.edu.cn
Principal component analysis(主成分分析)
PCA是在數據集中找到“主成分”或最大方差方向的線性變換。它可以用于降維。在本練習中,我們首先負責實現PCA并將其應用于一個簡單的二維數據集,以了解它是如何工作的。我們從加載和可視化數據集開始。
import?numpy?as?np import?pandas?as?pd import?matplotlib.pyplot?as?plt import?seaborn?as?sb from?scipy.io?import?loadmatdata?=?pd.read_csv('data/pcadata.csv') data.head()| 3.381563 | 3.389113 |
| 4.527875 | 5.854178 |
| 2.655682 | 4.411995 |
| 2.765235 | 3.715414 |
| 2.846560 | 4.175506 |
PCA的算法相當簡單。在確保數據被歸一化之后,輸出僅僅是原始數據的協方差矩陣的奇異值分解。
def?pca(X):#?normalize?the?featuresX?=?(X?-?X.mean())?/?X.std()#?compute?the?covariance?matrixX?=?np.matrix(X)cov?=?(X.T?*?X)?/?X.shape[0]#?perform?SVDU,?S,?V?=?np.linalg.svd(cov)return?U,?S,?VU,?S,?V?=?pca(X) U,?S,?V(matrix([[-0.79241747, -0.60997914],[-0.60997914, 0.79241747]]),array([1.43584536, 0.56415464]),matrix([[-0.79241747, -0.60997914],[-0.60997914, 0.79241747]]))現在我們有主成分(矩陣U),我們可以用這些來將原始數據投影到一個較低維的空間中。對于這個任務,我們將實現一個計算投影并且僅選擇頂部K個分量的函數,有效地減少了維數。
def?project_data(X,?U,?k):U_reduced?=?U[:,:k]return?np.dot(X,?U_reduced)Z?=?project_data(X,?U,?1)我們也可以通過反向轉換步驟來恢復原始數據。
def?recover_data(Z,?U,?k):U_reduced?=?U[:,:k]return?np.dot(Z,?U_reduced.T)X_recovered?=?recover_data(Z,?U,?1)fig,?ax?=?plt.subplots(figsize=(12,8)) ax.scatter(list(X_recovered[:,?0]),?list(X_recovered[:,?1])) plt.show()請注意,第一主成分的投影軸基本上是數據集中的對角線。當我們將數據減少到一個維度時,我們失去了該對角線周圍的變化,所以在我們的再現中,一切都沿著該對角線。
我們在此練習中的最后一個任務是將PCA應用于臉部圖像。通過使用相同的降維技術,我們可以使用比原始圖像少得多的數據來捕獲圖像的“本質”。
faces?=?loadmat('data/ex7faces.mat') X?=?faces['X'] X.shape(5000, 1024)def?plot_n_image(X,?n):"""?plot?first?n?imagesn?has?to?be?a?square?number"""pic_size?=?int(np.sqrt(X.shape[1]))grid_size?=?int(np.sqrt(n))first_n_images?=?X[:n,?:]fig,?ax_array?=?plt.subplots(nrows=grid_size,ncols=grid_size,sharey=True,sharex=True,figsize=(8,?8))for?r?in?range(grid_size):for?c?in?range(grid_size):ax_array[r,?c].imshow(first_n_images[grid_size?*?r?+?c].reshape((pic_size,?pic_size)))plt.xticks(np.array([]))plt.yticks(np.array([]))練習代碼包括一個將渲染數據集中的前100張臉的函數。而不是嘗試在這里重新生成,您可以在練習文本中查看他們的樣子。我們至少可以很容易地渲染一個圖像。
face?=?np.reshape(X[3,:],?(32,?32))plt.imshow(face) plt.show()看起來很糟糕。這些只有32 x 32灰度的圖像(它也是側面渲染,但我們現在可以忽略)。我們的下一步是在面數據集上運行PCA,并取得前100個主要特征。
U,?S,?V?=?pca(X) Z?=?project_data(X,?U,?100)現在我們可以嘗試恢復原來的結構并再次渲染。
X_recovered?=?recover_data(Z,?U,?100) face?=?np.reshape(X_recovered[3,:],?(32,?32)) plt.imshow(face) plt.show()我們可以看到:數據維度減少,但細節并沒有怎么損失。
參考
Prof. Andrew Ng. Machine Learning. Stanford University
總結
以上是生活随笔為你收集整理的【机器学习】降维代码练习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GB28181心跳机制探讨和技术实现
- 下一篇: jeecg框架alert消息样式