關於PCA降維中遇到的python問題小結

hezzzzzzz發表於2019-05-29

由於論文需要,開始逐漸的學習CNN關於文字抽取的問題,由於語言功底不好,所以在學習中難免會有很多函式不會用的情況..... ̄へ ̄

主要是我自己的原因,但是我更多的把語言當成是一個工具,需要的時候查詢就行~~~~但是這也僅限於搬磚的時候,大多數時候如果要自己寫程式碼,這個還是行不通的。

簡單的說一下在PCA,第一次接觸這個名詞還是在學習有關CNN演算法時,一篇部落格提到的資料輸入層中,資料簡單處理的幾種方法之一,有提到PCA降維,因為論文需要CNN做一些相關的工作,想做一篇綜述類文章,所以思路大概是這樣:CNN處理文字歷史,CNN處理文字的概述,基本方法,常用框架,具體方法,方法優劣確定,未來研究趨勢。

在檢視相關常用框架的時候,才發現還有很多沒有學過,(キ`゚Д゚´)!!,於是乎,抓緊吧~

 

PCA(Principal Component Analysis)主成分分析法

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

目的:

PCA是一種在儘可能減少資訊損失的情況下找到某種方式降低資料的維度的方法。通常來說,我們期望得到的結果,是把原始資料的特徵空間(n個d維樣本)投影到一個小一點的子空間裡去,並儘可能表達的很好(就是說損失資訊最少)。常見的應用在於模式識別中,我們可以通過減少特徵空間的維度,抽取子空間的資料來最好的表達我們的資料,從而減少引數估計的誤差。注意,主成分分析通常會得到協方差矩陣和相關矩陣。這些矩陣可以通過原始資料計算出來。協方差矩陣包含平方和與向量積的和。相關矩陣與協方差矩陣類似,但是第一個變數,也就是第一列,是標準化後的資料。如果變數之間的方差很大,或者變數的量綱不統一,我們必須先標準化再進行主成分分析。(這裡引用了一個大哥的文件,寫的真的很漂亮,https://www.cnblogs.com/charlotte77/p/5625984.html)

簡單介紹一下,詳細的可以看這篇部落格,關於PCA降維的方法什麼的都在裡面,我主要在學習這篇的時候關於語言方面有些小障礙,所以能看懂上面,我這也就基本不用看了~

在第一個問題中

mu_vec1 = np.array([0,0,0])
cov_mat1 = np.array([[1,0,0],[0,1,0],[0,0,1]])

np.random.multivariate_normal(mu_vec1, cov_mat1, 20).T
#def multivariate_normal(mean, cov, size=None, check_valid=None, tol=None)

這段程式碼中,開始的時候對語法掌握不熟悉,定義部分在註釋展示出了,主要的目的是生成隨機陣列,mean和cov是必須填寫的引數,mean為一維陣列,cov為協方差矩陣,size為生成隨機陣列的時候,具體的長度,比如size=20,則第一行元素就一共有20個;check_valid主要是為了檢驗是否為協方差矩陣,有三種寫法:

warn,raise以及ignore。當使用warn作為傳入的引數時,如果cov不是半正定的程式會輸出警告但仍舊會得到結果;當使用raise作為傳入的引數時,如果cov不是半正定的程式會報錯且不會計算出結果;當使用ignore時忽略這個問題即無論cov是否為半正定的都會計算出結果。3種情況的console列印結果如下:

使用warn時:

使用raise時:

使用ignore時:

 tol:檢查協方差矩陣奇異值時的公差,float型別。

 

這個問題算是解決了~下一個:

class1_sample[0,:]和class1_sample[:,0]

    
X[:,0]是numpy中陣列的一種寫法,表示對一個二維陣列,取該二維陣列第一維中的所有資料,第二維中取第0個資料,直觀來說,X[:,0]就是取所有行的第0個資料, X[:,1] 就是取所有行的第1個資料。

import numpy as np

X = np.array([[0, 1], [2, 3], [4, 5], [6, 7], [8, 9], [10, 11], [12, 13], [14, 15], [16, 17], [18, 19]])

print(X[:, 0])

為例

X[:, 0]輸出則為,[0,2,4,6,8,10,12,14,16,18]

X[:, 1]輸出則為,[1,3,5,7,9,11,13,15,17,19]

X[0, :]輸出則為,[0,1]

X[1, :]輸出則為,[2,3]

 

其中還有一個為X[:,  m:n],即取所有資料的第m到n-1列資料,含左不含右

例:輸出X陣列中所有行第1到2列資料

  1. X = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11],[12,13,14],[15,16,17],[18,19,20]])  
  2. print X[:,1:3]  

結果為:

 

 

 第三個:

 np.concatenate((class1_sample, class2_sample), axis=1)

其中主要對axis=0和axis=1的問題做一下筆記:

axis=0時:陣列的拼接方式為首尾相連線

a = np.array([[1, 2], [3, 4]])

b = np.array([[5, 6]])

c = np.concatenate((a, b), axis=0)
輸出為:
array([[1, 2],
[3, 4],
[5, 6]])

axis=1時:陣列的拼接方式為在a的每行元素末尾新增b對應行元素。

a = np.array([[1, 2], [3, 4]])

b = np.array([[5, 6]])

c = np.concatenate((a, b), axis=1)
輸出為:
array([[1, 2,3],
[4,5, 6]])

 

相關文章