我有以下代碼:
C = np.array([10 ** ((i-1)/(2-1)) for i in range(2)])
C = C *np.identity(2)
x = [1, 1]
J = (C.T C) @ x
theta = 1e-5
alpha = 0.1
X = []
while np.sum(np.linalg.norm(alpha * J, ord=2)) >= theta:
J = (C.T C) @ x
x -= alpha * J
X.append(x)
print("x = ", x)
print("X[i] = ", np.array(X))
如您所見,我想執行基本的梯度下降,但現在這并不重要。
問題是輸出(例如):
x = [0.98 0.8 ]
X[i] = [[0.98 0.8 ]]
x = [0.9604 0.64 ]
X[i] = [[0.9604 0.64 ]
[0.9604 0.64 ]]
x = [0.941192 0.512 ]
X[i] = [[0.941192 0.512 ]
[0.941192 0.512 ]
[0.941192 0.512 ]]
x = [0.92236816 0.4096 ]
X[i] = [[0.92236816 0.4096 ]
[0.92236816 0.4096 ]
[0.92236816 0.4096 ]
[0.92236816 0.4096 ]]
x = [0.9039208 0.32768 ]
X[i] = [[0.9039208 0.32768 ]
[0.9039208 0.32768 ]
[0.9039208 0.32768 ]
[0.9039208 0.32768 ]
[0.9039208 0.32768 ]]
x = [0.88584238 0.262144 ]
X[i] = [[0.88584238 0.262144 ]
[0.88584238 0.262144 ]
[0.88584238 0.262144 ]
[0.88584238 0.262144 ]
[0.88584238 0.262144 ]
[0.88584238 0.262144 ]]
append函式有問題,我找不到原因,你有idee嗎?
uj5u.com熱心網友回復:
Python 不是基于值的語言,而是基于參考的語言。如果我寫,l.append(x)那么我會添加一個對 object 的參考到xlist l。如果我后來修改x,這會改變l。遇到這個問題通常需要一段時間,因為 Python 初學者與之互動的許多物件都是不可變的。但不是所有的!
>>> x = [1, 1]
>>> l = [x]
>>> l
[[1, 1]]
>>> x[0] = 2
>>> l
[[2, 1]]
現在令人困惑的x -= alpha * J是,與x = x - alpha * J. 前者修改x就地,而后者創建一個新物件。
為了防止這種問題完全是我建議增加一個拷貝的x到串列:
X.append(np.copy(x))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/355119.html
上一篇:熊貓分組并找到最頻繁的值(模式)
