由於論文需要,開始逐漸的學習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列數據
- X = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11],[12,13,14],[15,16,17],[18,19,20]])
- 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]])