PCA學習過程遇到的問題

2021-10-05 06:28:51 字數 2157 閱讀 7035

pca學習過程遇到的問題

目錄

1、遇到的問題。

2、解決方法。

1、遇到的問題。

在學習pca時遇到這個公式

s是樣本協方差矩陣,於是打算用**測試一下。

資料如下

x=np.array([[

1,5,

6],[

4,3,

9],[

4,2,

9],[

4,7,

2]])

樣本的協方差矩陣s用np求出。

x2 = np.cov(x.t)

print

(x2)

得出如下結果

[[ 2.25 -0.75 0.5 ]

[-0.75 4.91666667 -7.16666667]

[ 0.5 -7.16666667 11. ]]

用(x_t*x)/(n-1)方法求解

y = np.dot(x.t,x)/(

3)print

(y)

結果如下

[[16.33333333 17.66666667 28.66666667]

[17.66666667 29. 29.66666667]

[28.66666667 29.66666667 67.33333333]]

發現兩種方法求出的結果並不相同。

2、解決方法

重新思考協方差矩陣的求解過程發現問題,採用如下**就可實現結果一致。

def

norm_

(x):

xmean = np.mean(x,0)

return

(x-xmean)

data_ = norm_(x)

x3 = np.dot(data_.t,data_)/(

3)print

('另一種方式的協方差'

)print

(x3)

結果如下:

另一種方式的協方差

[[ 2.25 -0.75 0.5 ]

[-0.75 4.91666667 -7.16666667]

[ 0.5 -7.16666667 11. ]]

和直接用 x2 = np.cov(x.t)結果相同。

剛開始出現問題是因為原始資料如果單純矩陣相乘的話資料並沒有去均值化。

進一步思考,在pca用於資料降維時,一般都會對資料進行標準化預處理,**如下:

# normalization

defnorm_

(x):

xmean = np.mean(x,0)

std = np.std(x,0)

return

(x-xmean)

/std

data_ = norm_(x)

x4 = np.dot(data_.t,data_)/(

3)print

('方差'

)print

(x4)

x5 = np.cov(data_.t)

print

('另一種方式的協方差'

)print

(x5)

方差

[[ 1.33333333 -0.30065841 0.13400504]

[-0.30065841 1.33333333 -1.29934421]

[ 0.13400504 -1.29934421 1.33333333]]

另一種方式的協方差

[[ 1.33333333 -0.30065841 0.13400504]

[-0.30065841 1.33333333 -1.29934421]

[ 0.13400504 -1.29934421 1.33333333]]

發現兩者結果相同,顧資料預處理之後就不會出現剛開始存在的疑惑了。

C 學習過程中遇到的問題

string sqlcmd1 select table name from user tables where table name like tablename oracleparameter op new oracleparameter tablename this.loadkey.text.t...

學習loadrunner過程中遇到的問題

1.win7系統,loadrunner11使用ie9進行錄製的過程中,錄製的時候瀏覽器打不開,設定下就好了,如下圖 注意,program to record 不要選擇c program files internet explorer iexplore.exe,而要選擇c program files ...

Nginx 學習過程中遇到的問題

1 啟動報錯 nginx error while loading shared libraries libpcre.so.1 cannot open shared object file no such file or directory 解決 前提是已經安裝好了pcre root server2 ...