這是我在stackoverlow的第一個問題,我的英文真的很差,所以感謝所有看過我拙劣英文并幫助我的人^_^
我的問題是關于廣播。enter image description here 我想要做的是將X的每一行乘以B的同一行中的數字……
X 是 (100,3) 陣列,XW 是列向量 (100,)。為什么他們不能廣播?
我加上“XW = XW.reshape((X.shape[0],1))”后,就可以廣播了。為什么…… (100,1) 和 (100,) 有區別嗎?
我覺得我的圖片已經清楚地描述了我的問題...我的代碼真的很長....我覺得看我的代碼不方便...
這是代碼..
import numpy as np
import matplotlib.pyplot as plt
class MyFirstMachineLeaningAlgorithm():
def StochasticGradientDescent(self, W, X, count=100, a=0.1):
n = X.shape[0]
for i in range(count): # 學習count次
gradient = np.zeros(3)
for j in range(n):
gradient = X[j, :] * (1 - 2 * (X[j, :] @ W))
W = W a * gradient
# 修復模長
W = W / np.sqrt((W @ W))
return W
def BatchGraidentDescent(self, W, X, count=100, a=0.1):
for i in range(count):
XW = X @ W
XW = 1 - 2 * XW
#XW = XW.reshape((X.shape[0],1))
gradient = X*XW
gradient = np.sum(gradient,axis = 0)
W = W a * gradient
# 修復模長
W = W / np.sqrt((W @ W))
def train(self, count=100):
self.W = self.BatchGraidentDescent(self.W, self.X, count)
def draw(self):
draw_x = np.arange(-120, 120, 0.01)
draw_y = -self.W[0] / self.W[1] * draw_x
draw_y = [-self.W[2] / self.W[1] draw_y[i] for i in range(len(draw_y))]
plt.plot(draw_x, draw_y)
plt.show()
def __init__(self):
array_size = (50, 2)
array1 = np.random.randint(50, 100, size=array_size)
array2 = np.random.randint(-100, -50, size=array_size)
array = np.vstack((array1, array2))
column = np.ones(100)
self.X = np.column_stack((array, column))
plt.scatter(array[:, 0], array[0:, 1])
self.W = np.array([1, 2, 3])
self.W = self.W / np.sqrt((self.W @ self.W))
g = MyFirstMachineLeaningAlgorithm()
g.train()
g.draw()
uj5u.com熱心網友回復:
最好使用 copy-n-paste 發布錯誤資訊,而不是影像。盡管如此,影像總比沒有好。
所以錯誤出現在這個剪輯的最后一行:
XW = X @ W
XW = 1 - 2 * XW
#XW = XW.reshape((X.shape[0],1))
gradient = X*XW
僅從函式定義中我無法判斷Xand的形狀W。顯然X是 2d (100,n)。如果W是 (n,),XW則將是 (100,),具有n維度上的乘積和。np.matmul如果不清楚,請閱讀檔案。
根據broadcasting(查找它們)的規則,如果一個陣列的維數沒有另一個陣列多,它將根據需要添加前導維數。因此 (100,) 可以變成 (1,100)。但為了避免歧義,它不會添加尾隨維度。你必須自己提供。所以最后一行應該變成
gradient = X * XW[:,None]
或等效使用XW.reshape(-1,1)或您的版本。
因為陣列可以是 1d(甚至 0d),所以像row vector或column vector這樣的術語價值有限。在某些情況下,一維陣列可以被認為是一個行向量——在這種情況下,這個自動前導維度適用。
在init,
self.X = np.column_stack((array, column))
self.W = np.array([1, 2, 3])
X是 (100,3) 和W(3,)。 X@W然后是 (100,)。
In [45]: X=np.ones((100,3)); W=np.array([1,2,3])
In [46]: (X@W).shape
Out[46]: (100,)
In [47]: X * (1 (X@W)[:,None]);
uj5u.com熱心網友回復:
我在發布之前已經解決了這個問題。但我認為這可能對其他人有幫助,所以我仍然發布它。
XW 是從 X@W 派生出來的,應該是一個 100x1 的矩陣吧?但是當結果可以看作是一個向量(nx1 或 1xn)時,結果將是一個向量。向量的形狀是(n,)或(,n),矩陣的形狀是(n,1)或(1,n),這就是它們的區別。
在python中,向量默認為行向量。所以XW不能和X一起廣播。但是經過整形后,變成了(100,1)矩陣,然后就可以廣播了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/389399.html
