我正在嘗試為以下示例寫出協方差計算,并且我知道必須有比 for 回圈更好的方法。我已經研究過 np.dot、np.einsum,我覺得 np.einsum 有這個能力,但我只是缺少一些實作它的東西。
import numpy as np
# this is mx3
a = np.array([[1,2,3],[4,5,6]])
# this is x3
mean = a.mean(axis=0)
# result should be 3x3
b = np.zeros((3,3))
for i in range(a.shape[0]):
b = b (a[i]-mean).reshape(3,1) * (a[i]-mean)
b
array([[4.5, 4.5, 4.5],
[4.5, 4.5, 4.5],
[4.5, 4.5, 4.5]])
所以這對于 2 個資料點樣本很好,但對于 am=large 數字,這非常慢。一定有更好的方法。有什么建議?
uj5u.com熱心網友回復:
In [108]: a = np.array([[1,2,3],[4,5,6]])
...: # this is x3
...: mean = a.mean(axis=0)
...:
...: # result should be 3x3
...: b = np.zeros((3,3))
...: for i in range(a.shape[0]):
...: b = b (a[i]-mean).reshape(3,1) * (a[i]-mean)
...:
In [109]: b
Out[109]:
array([[4.5, 4.5, 4.5],
[4.5, 4.5, 4.5],
[4.5, 4.5, 4.5]])
In [110]: a.mean(axis=0)
Out[110]: array([2.5, 3.5, 4.5])
由于平均值被減去兩次,讓我們定義一個新變數。在這種情況下,二維和一維維度廣播,所以我們可以簡單地:
In [111]: a1= a - a.mean(axis=0)
In [112]: a1
Out[112]:
array([[-1.5, -1.5, -1.5],
[ 1.5, 1.5, 1.5]])
其余為正常dot產品:
In [113]: a1.T@a1
Out[113]:
array([[4.5, 4.5, 4.5],
[4.5, 4.5, 4.5],
[4.5, 4.5, 4.5]])
np.einsum也np.dot可以做這個矩陣乘法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/352623.html
