scipy.optimize.minimize形状不匹配求助:(2,)与(2,5)无法广播
解决scipy.optimize.minimize中的形状不匹配问题
错误根源
报错ValueError: operands could not be broadcast together with shapes (2,) (2,5)的原因是矩阵运算维度不匹配:
X是(2,5)的矩阵,w是(5,)的向量,使用@(矩阵乘法)得到的结果是(2,)的向量;- 而
y是(2,5)的矩阵,(2,)和(2,5)的形状无法直接进行减法运算,导致广播失败。
解决方案
根据你设置的初始参数(10,10,10,10,10,)(5维向量),推测你需要给每个特征分配一个权重,通过逐元素乘法让运算结果和y形状匹配。修改代码如下:
import numpy as np from scipy.spatial import distance_matrix from scipy.optimize import minimize # Create the matrices X = np.array([[1,2,3,4,5],[2,1,0,3,4]]) y = np.array([[0,0,0,0,1],[1,1,1,1,0]]) # Display the matrices print("matrix x:\n", X) print("matrix y:\n", y) # compute the distance matrix dist_mat = distance_matrix(X, y, p=2) # display distance matrix print("Distance Matrix:\n", dist_mat) loss_res = lambda z: 0.5 * z ** 2 * (np.abs(z) <= 1) + (np.abs(z) - 0.5) * (np.abs(z) > 1) # 核心修改:将矩阵乘法@改为逐元素乘法*,实现维度广播 f_to_optMin = lambda w: np.sum(loss_res(X * w.ravel() - y)) res= minimize(f_to_optMin, (10,10,10,10,10,)) print(res.x)
修改说明
X * w.ravel()中,(5,)的w会被numpy自动广播为(2,5)的形状,和X逐元素相乘后得到(2,5)的矩阵,与y形状一致,可正常执行减法运算。- 如果你的实际需求是矩阵乘法(比如
X乘w得到(2,5)的结果),则需要将w的维度调整为(5,5),同时修改初始参数和目标函数:# 目标函数调整为矩阵乘法 f_to_optMin = lambda w: np.sum(loss_res(X @ w.reshape(5,5) - y)) # 传入扁平化的5x5初始参数 res= minimize(f_to_optMin, np.ones((5,5)).ravel())
内容的提问来源于stack exchange,提问作者JeeyCi
相关产品推荐
相关产品推荐

