簡體   English   中英

StatsModels的Numpy.dot點乘積函數

[英]Numpy.dot dot product function for statsmodels

我正在學習statsmodels.api模塊以使用python進行回歸分析。 因此,我從簡單的OLS模型開始。

在計量經濟學中,該函數類似於:y = Xb + e其中X是NxK維度,b是Kx1,e是Nx1,因此將y加在一起是Nx1。 從線性代數的角度來看,這是完全可以的。

但是我遵循了Statsmodels的教程,內容如下:

import numpy as np
nsample = 100 # total obs is 100
x = np.linspace(0, 10, 100) # using np.linspace(start, stop, number)

X = np.column_stack((x, x**2))
beta = np.array([1, 0.1, 10])

e = np.random.normal(size = nsample) # draw numbers from normal distribution 
default at mu = 0, and std.dev = 1, size = set by user
# e is n x 1
# Now, we add the constant/intercept term to X
X = sm.add_constant(X)
# Now, we compute the y
y = np.dot(X, beta) + e

因此,這將產生正確的答案。 但是我對beta = np.array([1,0.1,10])的生成有疑問。 如果使用此Beta,請執行以下操作:

beta.shape
(3,)

它的尺寸為(3,),除了X以外,y和e也是如此:

X.shape
(100,3)
e.shape
(100,)
y.shape
(100,)

所以我猜想使用以下三種方式來初始化數組

o = array([1,2,3])
o1 = array([[1],[2],[3]])
o2 = array([[1,2,3]])
print(o.shape)
print(o1.shape)
print(o2.shape)
----------------
(3,)
(3, 1)
(1, 3)

如果我使用beta = array([[1],[2],[3]]),它是(3,1),而np.dot(X,beta)給我一個錯誤的答案,盡管尺寸似乎上班。 如果我使用array([[1,2,3]])(這是行向量),則該尺寸與numpy中的點積不匹配,在線性代數中也不匹配。

因此,我想知道為什么對於NxK點Kx1 numpy點乘積,我們必須使用(N,K)點(K,)而不是(N,K)點(K,1)矩陣。 什么操作只能使np.array([1,0.1,10])對numpy.dot()有效,而np.array([[1],[0.1],[10]])無效。

非常感謝你。


一些更新

很抱歉,Statsmodels中的代碼是隨機生成的,因此我嘗試修復X並獲得以下輸入:

f = array([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]])
o = array([1,2,3])
o1 = array([[1],[2],[3]])
o2 = array([[1,2,3]])
print(o.shape)
print(o1.shape)
print(o2.shape)
print("---------")
print(np.dot(f,o))
print(np.dot(f,o1))
r1 = np.dot(f,o)
r2 = np.dot(f,o1)
type1 = type(np.dot(f,o))
type2 = type(np.dot(f,o1))
tf = type1 is type2
tf2 = type1 == type2
print(type1)
print(type2)
print(tf)
print(tf2)
-------------------------
(3,)
(3, 1)
(1, 3)
---------
[14 32 50 68 86]
[[14]
 [32]
 [50]
 [68]
 [86]]
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
True
True

再次造成不便之處,敬請原諒。

python / numpy不是基於矩陣的語言,因為它是Matlab或Octave或Scilab。 這些嚴格遵循矩陣乘法的規則。 所以

np.dot(f,o)  ---------> f*o  in Matlab/Octave/Scilab
np.dot(f,o1) ---------> f*o1 does not work in Matlab/Octave/Scilab

python / numpy具有“廣播”功能,這些規則是不同數據類型和操作如何將結果匯總在一起的規則。 為何np.dot(f,o1)甚至應該工作還np.dot(f,o1) ,但是廣播定義了一些有用的結果。 您將必須為此查閱文檔。

在python / numpy中, *不是矩陣運算符。 您可以找出廣播的目的

print(f*o)
print(f*o1)
print(f*o2)

相反,最近python / numpy引入了矩陣運算符@ 您可能會發現發生了什么

print(f@o)
print(f@o1)
print(f@o2)

這會給人留下一些印象嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM