运行优化求极小值代码报错unhashable type: 'numpy.ndarray'求解决
错误根因
报错unhashable type: 'numpy.ndarray'是因为符号变量被意外覆盖导致的:
- 代码开头
x1,x2=sp.symbols('x1 x2')定义了sympy符号类型变量,用于符号求导和代入计算 - 后续生成等高线网格时执行的
[x1, x2] = np.meshgrid(X1, X2),直接将x1、x2的类型从sympy符号覆盖为了numpy数组 - 调用
f(x)、gradf(x)时,subs参数的字典需要用可哈希的符号变量做键,但此时x1、x2已经是不可哈希的numpy数组,直接触发类型错误。
修复方案
只需修改两处代码即可解决问题:
- 补充matplotlib导入,避免后续调用plt时报错,在导入代码块新增一行:
import matplotlib.pyplot as plt
- 修改网格相关变量名,避免覆盖符号变量,将原有网格生成代码:
[x1, x2] = np.meshgrid(X1, X2) ff =x1**2/5+x2**2 plt.contour(x1, x2, ff, 20) # contour plot
替换为:
X1_grid, X2_grid = np.meshgrid(X1, X2) ff = X1_grid**2/5 + X2_grid**2 plt.contour(X1_grid, X2_grid, ff, 20) # contour plot
补充说明
你代码中Momentum函数的参数名alphi为拼写失误,应为alpha;另外动量法的超参数beta通常取0.9左右的小于1的值,你当前传入的1会导致动量项无限累加,会影响收敛效果,可根据你的优化需求调整。
内容的提问来源于stack exchange,提问作者Gucy
相关产品推荐
相关产品推荐

