在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

機器學習基礎與實踐:PCA的目的

lviY_AI_shequ ? 來源:未知 ? 作者:李倩 ? 2018-08-30 17:47 ? 次閱讀

寫在前面:本來想參考PRML來寫,但是發(fā)現里面涉及到比較多的數學知識,寫出來可能不好理解,我決定還是用最通俗的方法解釋PCA,并舉一個實例一步步計算,然后再進行數學推導,最后再介紹一些變種以及相應的程序。

正文:

在數據處理中,經常會遇到特征維度比樣本數量多得多的情況,如果拿到實際工程中去跑,效果不一定好。一是因為冗余的特征會帶來一些噪音,影響計算的結果;二是因為無關的特征會加大計算量,耗費時間和資源。所以我們通常會對數據重新變換一下,再跑模型。數據變換的目的不僅僅是降維,還可以消除特征之間的相關性,并發(fā)現一些潛在的特征變量。

一、PCA的目的

PCA是一種在盡可能減少信息損失的情況下找到某種方式降低數據的維度的方法。通常來說,我們期望得到的結果,是把原始數據的特征空間(n個d維樣本)投影到一個小一點的子空間里去,并盡可能表達的很好(就是說損失信息最少)。常見的應用在于模式識別中,我們可以通過減少特征空間的維度,抽取子空間的數據來最好的表達我們的數據,從而減少參數估計的誤差。注意,主成分分析通常會得到協(xié)方差矩陣和相關矩陣。這些矩陣可以通過原始數據計算出來。協(xié)方差矩陣包含平方和與向量積的和。相關矩陣與協(xié)方差矩陣類似,但是第一個變量,也就是第一列,是標準化后的數據。如果變量之間的方差很大,或者變量的量綱不統(tǒng)一,我們必須先標準化再進行主成分分析。

二、PCA VS MDA

提到PCA,可能有些人會想到MDA(Multiple Discriminate Analysis,多元判別分析法),這兩者都是線性變換,而且很相似。只不過在PCA中,我們是找到一個成分(方向)來把我們的數據最大化方差,而在MDA中,我們的目標是最大化不同類別之間的差異(比如說,在模式識別問題中,我們的數據包含多個類別,與兩個主成分的PCA相比,這就忽略了類別標簽)。

換句話說,通過PCA,我們把整個數據集(不含類別標簽)投射到一個不同的子空間中,在MDA中,我們試圖決定一個合適的子空間來區(qū)分不同類別。再換種方式說,PCA是找到數據傳播最廣的時候的最大方差的軸axis,MDA是最大化類別與類別之間的區(qū)別。

上文我們提到了子空間,那么怎么樣去尋找“好的”子空間呢?

假設我們的目標是減少d維的數據集,將其投影到k維的子空間上(看k

下文中我們會計算數據中的特征向量(主成分),然后計算散布矩陣(scatter_matrix)中(也可以從協(xié)方差矩陣中計算)。每個特征向量與特征值相關,即特征向量的“長度”或“大小”。如果發(fā)現每個特征值都很小,那就可以說明我們的原始數據就已經是一個“好的”空間了。但是,如果有些特征值比其他值要大得多,我們只需要關注那些特別大的特征值,因為這些值包含了數據分布情況的絕大部分信息。反之,那些接近于0的特征值包含的信息幾乎沒有,在新的特征空間里我們可以忽略不計。

三、PCA的過程

通常來說有以下六步:

1.去掉數據的類別特征(label),將去掉后的d維數據作為樣本

2.計算d維的均值向量(即所有數據的每一維向量的均值)

3.計算所有數據的散布矩陣(或者協(xié)方差矩陣)

4.計算特征值(e1,e2,...,ed)以及相應的特征向量(lambda1,lambda2,...,lambdad

5.按照特征值的大小對特征向量降序排序,選擇前k個最大的特征向量,組成d*k維的矩陣W(其中每一列代表一個特征向量)

6.運用d*K的特征向量矩陣W將樣本數據變換成新的子空間。(用數學式子表達就是,其中x是d*1維的向量,代表一個樣本,y是K*1維的在新的子空間里的向量)

1.數據準備----生成三維樣本向量

首先隨機生成40*3維的數據,符合多元高斯分布。假設數據被分為兩類,其中一半類別為w1,另一半類別為w2

#coding:utf-8 import numpy as np np.random.seed(4294967295) mu_vec1 = np.array([0,0,0]) cov_mat1 = np.array([[1,0,0],[0,1,0],[0,0,1]]) class1_sample = np.random.multivariate_normal(mu_vec1, cov_mat1, 20).T assert class1_sample.shape == (3,20)#檢驗數據的維度是否為3*20,若不為3*20,則拋出異常 mu_vec2 = np.array([1,1,1]) cov_mat2 = np.array([[1,0,0],[0,1,0],[0,0,1]]) class2_sample = np.random.multivariate_normal(mu_vec2, cov_mat2, 20).T assert class1_sample.shape == (3,20)#檢驗數據的維度是否為3*20,若不為3*20,則拋出異常

運行這段代碼后,我們就生成了包含兩個類別的樣本數據,其中每一列都是一個三維的向量,所有數據是這樣的矩陣:

結果:

2.作圖查看原始數據的分布

from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D from mpl_toolkits.mplot3d import proj3d fig = plt.figure(figsize=(8,8)) ax = fig.add_subplot(111, projection='3d') plt.rcParams['legend.fontsize'] = 10 ax.plot(class1_sample[0,:], class1_sample[1,:], class1_sample[2,:], 'o', markersize=8, color='blue', alpha=0.5, label='class1') ax.plot(class2_sample[0,:], class2_sample[1,:], class2_sample[2,:], '^', markersize=8, alpha=0.5, color='red', label='class2') plt.title('Samples for class 1 and class 2') ax.legend(loc='upper right') plt.show()

結果:

3.去掉數據的類別特征

1 all_samples = np.concatenate((class1_sample, class2_sample), axis=1) 2 assert all_samples.shape == (3,40)#檢驗數據的維度是否為3*20,若不為3*20,則拋出異常

4.計算d維向量均值

mean_x = np.mean(all_samples[0,:]) mean_y = np.mean(all_samples[1,:]) mean_z = np.mean(all_samples[2,:]) mean_vector = np.array([[mean_x],[mean_y],[mean_z]]) print('Mean Vector: ', mean_vector)

結果:

1 print('Mean Vector: ', mean_vector) 2 Mean Vector:, 3 array([[ 0.68047077], 4 [ 0.52975093], 5 [ 0.43787182]]))

5.計算散步矩陣或者協(xié)方差矩陣

a.計算散步矩陣

散布矩陣公式:

其中m是向量的均值:(第4步已經算出來是mean_vector)

1 scatter_matrix = np.zeros((3,3)) 2 for i in range(all_samples.shape[1]): 3 scatter_matrix += (all_samples[:,i].reshape(3,1) - mean_vector).dot((all_samples[:,i].reshape(3,1) - mean_vector).T) 4 print('Scatter Matrix: ', scatter_matrix)

結果:

1 print('Scatter Matrix: ', scatter_matrix) 2 ('Scatter Matrix:, 3 array([[ 46.81069724, 13.95578062, 27.08660175], 4 [ 13.95578062, 48.28401947, 11.32856266], 5 [ 27.08660175, 11.32856266, 50.51724488]]))

b.計算協(xié)方差矩陣

如果不計算散布矩陣的話,也可以用python里內置的numpy.cov()函數直接計算協(xié)方差矩陣。因為散步矩陣和協(xié)方差矩陣非常類似,散布矩陣乘以(1/N-1)就是協(xié)方差,所以他們的特征空間是完全等價的(特征向量相同,特征值用一個常數(1/N-1,這里是1/39)等價縮放了)。協(xié)方差矩陣如下所示:

1 cov_mat = np.cov([all_samples[0,:],all_samples[1,:],all_samples[2,:]]) 2 print('Covariance Matrix: ', cov_mat)

結果:

1 >>> print('Covariance Matrix: ', cov_mat) 2 Covariance Matrix:, 3 array([[ 1.20027429, 0.35784053, 0.69452825], 4 [ 0.35784053, 1.23805178, 0.29047597], 5 [ 0.69452825, 0.29047597, 1.29531397]]))

6.計算相應的特征向量和特征值

# 通過散布矩陣計算特征值和特征向量 eig_val_sc, eig_vec_sc = np.linalg.eig(scatter_matrix) # 通過協(xié)方差矩陣計算特征值和特征向量 eig_val_cov, eig_vec_cov = np.linalg.eig(cov_mat) for i in range(len(eig_val_sc)): eigvec_sc = eig_vec_sc[:,i].reshape(1,3).T eigvec_cov = eig_vec_cov[:,i].reshape(1,3).T assert eigvec_sc.all() == eigvec_cov.all() print('Eigenvector {}: {}'.format(i+1, eigvec_sc)) print('Eigenvalue {} from scatter matrix: {}'.format(i+1, eig_val_sc[i])) print('Eigenvalue {} from covariance matrix: {}'.format(i+1, eig_val_cov[i])) print('Scaling factor: ', eig_val_sc[i]/eig_val_cov[i]) print(40 * '-')

結果:

Eigenvector 1: [[-0.84190486] [-0.39978877] [-0.36244329]] Eigenvalue 1 from scatter matrix: 55.398855957302445 Eigenvalue 1 from covariance matrix: 1.4204834860846791 Scaling factor: 39.0 ---------------------------------------- Eigenvector 2: [[-0.44565232] [ 0.13637858] [ 0.88475697]] Eigenvalue 2 from scatter matrix: 32.42754801292286 Eigenvalue 2 from covariance matrix: 0.8314755900749456 Scaling factor: 39.0 ---------------------------------------- Eigenvector 3: [[ 0.30428639] [-0.90640489] [ 0.29298458]] Eigenvalue 3 from scatter matrix: 34.65493432806495 Eigenvalue 3 from covariance matrix: 0.8885880596939733 Scaling factor: 39.0 ----------------------------------------

其實從上面的結果就可以發(fā)現,通過散布矩陣和協(xié)方差矩陣計算的特征空間相同,協(xié)方差矩陣的特征值*39 = 散布矩陣的特征值

當然,我們也可以快速驗證一下特征值-特征向量的計算是否正確,是不是滿足方程(其中為協(xié)方差矩陣,v為特征向量,lambda為特征值)

1 for i in range(len(eig_val_sc)): 2 eigv = eig_vec_sc[:,i].reshape(1,3).T 3 np.testing.assert_array_almost_equal(scatter_matrix.dot(eigv), eig_val_sc[i] * eigv,decimal=6, err_msg='', verbose=True)

得出結果未返回異常,證明計算正確

注:np.testing.assert_array_almost_equal計算得出的結果不一樣會返回一下結果:

>>> np.testing.assert_array_almost_equal([1.0,2.33333,np.nan], ... [1.0,2.33339,np.nan], decimal=5) ... : AssertionError: Arrays are not almost equal (mismatch 50.0%) x: array([ 1. , 2.33333, NaN]) y: array([ 1. , 2.33339, NaN])

可視化特征向量

from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D from mpl_toolkits.mplot3d import proj3d from matplotlib.patches import FancyArrowPatch class Arrow3D(FancyArrowPatch): def __init__(self, xs, ys, zs, *args, **kwargs): FancyArrowPatch.__init__(self, (0,0), (0,0), *args, **kwargs) self._verts3d = xs, ys, zs def draw(self, renderer): xs3d, ys3d, zs3d = self._verts3d xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M) self.set_positions((xs[0],ys[0]),(xs[1],ys[1])) FancyArrowPatch.draw(self, renderer) fig = plt.figure(figsize=(7,7)) ax = fig.add_subplot(111, projection='3d') ax.plot(all_samples[0,:], all_samples[1,:], all_samples[2,:], 'o', markersize=8, color='green', alpha=0.2) ax.plot([mean_x], [mean_y], [mean_z], 'o', markersize=10, color='red', alpha=0.5) for v in eig_vec_sc.T: a = Arrow3D([mean_x, v[0]], [mean_y, v[1]], [mean_z, v[2]], mutation_scale=20, lw=3, arrowstyle="-|>", color="r") ax.add_artist(a) ax.set_xlabel('x_values') ax.set_ylabel('y_values') ax.set_zlabel('z_values') plt.title('Eigenvectors') plt.show()

結果:

7.根據特征值對特征向量降序排列

我們的目標是減少特征空間的維度,即通過PCA方法將特征空間投影到一個小一點的子空間里,其中特征向量將會構成新的特征空間的軸。然而,特征向量只會決定軸的方向,他們的單位長度都為1,可以用代碼檢驗一下:

1 for ev in eig_vec_sc: 2 numpy.testing.assert_array_almost_equal(1.0, np.linalg.norm(ev))

因此,對于低維的子空間來說,決定丟掉哪個特征向量,就必須參考特征向量相應的特征值。通俗來說,如果一個特征向量的特征值特別小,那它所包含的數據分布的信息也很少,那么這個特征向量就可以忽略不計了。常用的方法是根據特征值對特征向量進行降序排列,選出前k個特征向量

# 生成(特征向量,特征值)元祖 eig_pairs = [(np.abs(eig_val_sc[i]), eig_vec_sc[:,i]) for i in range(len(eig_val_sc))] #對(特征向量,特征值)元祖按照降序排列 eig_pairs.sort(key=lambda x: x[0], reverse=True) #輸出值 for i in eig_pairs: print(i[0])

結果:

1 84.5729942896 2 39.811391232 3 21.2275760682

8.選出前k個特征值最大的特征向量

本文的例子是想把三維的空間降維成二維空間,現在我們把前兩個最大特征值的特征向量組合起來,生成d*k維的特征向量矩陣W

1 matrix_w = np.hstack((eig_pairs[0][1].reshape(3,1), eig_pairs[1][1].reshape(3,1))) 2 print('Matrix W: ', matrix_w)

結果:

1 >>> print('Matrix W: ', matrix_w) 2 Matrix W:, 3 array([[-0.62497663, 0.2126888 ], 4 [-0.44135959, -0.88989795], 5 [-0.643899 , 0.40354071]]))

9.將樣本轉化為新的特征空間

最后一步,把2*3維的特征向量矩陣W帶到公式中,將樣本數據轉化為新的特征空間

matrix_w = np.hstack((eig_pairs[0][1].reshape(3,1), eig_pairs[1][1].reshape(3,1))) print('Matrix W: ', matrix_w) transformed = matrix_w.T.dot(all_samples) assert transformed.shape == (2,40), "The matrix is not 2x40 dimensional." plt.plot(transformed[0,0:20], transformed[1,0:20], 'o', markersize=7, color='blue', alpha=0.5, label='class1') plt.plot(transformed[0,20:40], transformed[1,20:40], '^', markersize=7, color='red', alpha=0.5, label='class2') plt.xlim([-4,4]) plt.ylim([-4,4]) plt.xlabel('x_values') plt.ylabel('y_values') plt.legend() plt.title('Transformed samples with class labels') plt.show()

到這一步,PCA的過程就結束了。其實python里有已經寫好的模塊,可以直接拿來用,但是我覺得不管什么模塊,都要懂得它的原理是什么。matplotlib有matplotlib.mlab.PCA(),sklearn也有專門一個模塊Dimensionality reduction專門講PCA,包括傳統(tǒng)的PCA,以及增量PCA,核PCA等等,除了PCA以外,還有ZCA白化等等,在圖像處理中也經常會用到。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • PCA
    PCA
    +關注

    關注

    0

    文章

    89

    瀏覽量

    29695
  • 機器學習
    +關注

    關注

    66

    文章

    8439

    瀏覽量

    133087

原文標題:機器學習基礎與實踐(三)----數據降維之PCA

文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區(qū)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    全面解析機器學習的應用場景及算法

    在本篇文章中,我將對機器學習做個概要的介紹。本文的目的是能讓即便完全不了解機器學習的人也能了解機器
    發(fā)表于 09-21 09:47 ?1993次閱讀

    斯坦福公開課 - 吳恩達 機器學習 | 應用PCA建議 #機器學習

    PCA
    AI苦行僧
    發(fā)布于 :2022年01月05日 16:20:53

    #機器學習 降維之PCA

    編程語言PCApython
    電子技術那些事兒
    發(fā)布于 :2022年09月18日 17:17:32

    機器學習實踐指南——案例應用解析

    機器學習實踐指南——案例應用解析
    發(fā)表于 04-13 16:40

    機器學習對中文的理解

    機器學習基礎教程實踐(一)——中文的向量化
    發(fā)表于 08-27 14:19

    決策樹在機器學習的理論學習實踐

    決策樹在機器學習的理論學習實踐
    發(fā)表于 09-20 12:48

    自學機器學習的誤區(qū)和陷阱

    /數據科學工具包,上文介紹的Python Machine Learning書中就大量使用Sklearn的API。和使用Kaggle的目的一致,學習的Sklearn的文檔也是一種實踐過程。比較推薦的方法是把主流
    的頭像 發(fā)表于 05-14 15:54 ?4814次閱讀
    自學<b class='flag-5'>機器</b><b class='flag-5'>學習</b>的誤區(qū)和陷阱

    關于機器學習PCA算法的主成分分析

    人工智能機器學習有關算法內容,人工智能之機器學習主要有三大類:1)分類;2)回歸;3)聚類。今天我們重點探討一下PCA算法。
    發(fā)表于 06-27 17:23 ?3206次閱讀

    詳解機器學習算法流形學習

    流形學習是一類借鑒了拓撲流形概念的降維方法,與核PCA目的一樣,它想要在低維空間中盡量保持在高維空間中的結構。
    的頭像 發(fā)表于 02-02 15:40 ?7098次閱讀

    什么是機器學習機器學習到底有什么重要性詳細資料說明

    在本篇文章中,我將對機器學習做個概要的介紹。本文的目的是能讓即便完全不了解機器學習的人也能了解機器
    的頭像 發(fā)表于 03-03 10:13 ?7870次閱讀

    機器學習模型部署到ML項目的過程

    在構建一個大的機器學習系統(tǒng)時,有很多事情需要考慮。但作為數據科學家,我們常常只擔心項目的某些部分。
    的頭像 發(fā)表于 05-04 11:56 ?2177次閱讀

    阿里云機器學習研究員對大規(guī)模機器學習實踐的見解

    場景是什么?InfoQ 希望通過該選題解決這些問題,并推動企業(yè)在大規(guī)模機器學習方面的實踐。本文,InfoQ 有幸采訪了阿里云機器學習研究員林
    發(fā)表于 07-31 16:22 ?782次閱讀

    云端機器學習平臺PAI最新的創(chuàng)新實踐

    在今年 3 月的 GTC 2022 大會上,阿里云帶來了推理優(yōu)化/部署、深度學習編譯器、大模型部署、訓練優(yōu)化等主題的內容,分享云端機器學習平臺 PAI (Machine Learning
    的頭像 發(fā)表于 06-09 09:52 ?1114次閱讀

    FreeWheel基于機器學習的業(yè)務異常檢測實踐

    本文介紹了 FreeWheel 基于機器學習的業(yè)務異常檢測實踐,提煉了從零開始構建業(yè)務異常檢測系統(tǒng)面臨的問題和解決方案,文章介紹了常用的異常檢測算法,比較了不同算法模型的優(yōu)劣,介紹了可擴展的異常檢測系統(tǒng)是如何搭建的,希望對于從事
    的頭像 發(fā)表于 10-28 14:35 ?963次閱讀

    機器學習構建ML模型實踐

    實踐中的機器學習:構建 ML 模型
    的頭像 發(fā)表于 07-05 16:30 ?758次閱讀
    主站蜘蛛池模板: 怡红院亚洲怡红院首页 | 亚洲第一精品夜夜躁人人爽 | 成人在线观看网站 | 伊人天天操 | 夜夜操天天爽 | 国产美女精品三级在线观看 | 午夜毛片免费观看视频 | 美女张开大腿让男人桶 | 久草免费色站 | 香港三级理论在线影院 | 久久99热久久精品 | 免费一级毛片在线播放不收费 | 免费人成年短视频在线观看免费网站 | 天天爱天天做天天爽天天躁 | 成人影院在线观看 | 在线97| free性欧美高清另类 | 亚洲狠狠综合久久 | 9299yy看片淫黄大片在线 | swag系列国产精品 | 欧美影院一区二区三区 | 四虎影院免费网址 | 国外免费一级 | 欧洲综合网 | 宅男666在线永久免费观看 | 国产亚洲人成a在线v网站 | 日韩a视频 | 色综合久久天天综合绕观看 | 精品久久久久久久免费加勒比 | 国产综合在线观看视频 | 天天在线天天在线天天影视 | 久久男人的天堂色偷偷 | 中文字幕视频二区 | www.黄视频| 日本欧美一区二区三区视频 | 五月亭亭免费高清在线 | 亚洲线精品一区二区三区 | 免费国产在线视频 | 国产午夜三级 | 又粗又大又爽又色又过瘾视频 | 丁香亚洲综合五月天婷婷 |