如何用SymPy在Python中编写SVM对偶拉格朗日方程?报错求解
问题解决:SVM对偶拉格朗日函数的SymPy实现修正
错误原因
你遇到的TypeError: 'Symbol' object is not subscriptable是因为alpha = symbols('alpha')仅创建了单个符号对象,而非可通过下标访问的符号序列,因此无法用alpha[i]、alpha[k]来访问不同的拉格朗日乘子。
修正后的代码
以下代码适配任意数量的样本数据,正确生成对偶拉格朗日函数:
from sympy import symbols import numpy as np # 示例数据 x = np.array([ [0.466,0,0,0,0,-0.466,0,0,0,0,0.466,0,0,0,0,0.590], [0.377,0,0,0,0,-0.377,0,0,0,0,0.377,0,0,0,0,0.755], [0.18,0,0,0,0,-0.18,0,0,0,0,0.18,0,0,0,0,0.949] ]) y = np.array([-1, -1, 1]) def lagrange_dual(x, t): result = 0 n = x.shape[0] # 获取样本数量,适配任意n # 创建n个拉格朗日乘子符号:alpha0, alpha1, ..., alpha(n-1) alpha = symbols('alpha0:%d' % n) for i in range(n): for k in range(n): # 计算核函数项(这里用线性核,即点积) kernel = np.dot(x[i, :], x[k, :]) # 累加对偶问题的二次项 result += alpha[i] * alpha[k] * t[i] * t[k] * kernel # 完成对偶拉格朗日函数的构造:0.5*二次项 - 求和项 result = 0.5 * result - sum(alpha) return result # 输出结果 print(lagrange_dual(x, y))
代码说明
- 动态生成符号:通过
symbols('alpha0:%d' % n)根据样本数量n生成对应数量的符号,确保适配任意样本量。 - 线性核计算:使用
np.dot计算样本间的点积(线性SVM的核函数),数值会自动与SymPy符号结合为符号表达式。 - 求和修正:
sum(alpha)直接对符号元组求和,符合对偶拉格朗日函数中Σα_i的定义。
运行结果
执行代码后,会输出完整的对偶拉格朗日符号表达式,针对你的示例数据,输出会包含alpha0、alpha1、alpha2的二次项与一次项组合。
内容的提问来源于stack exchange,提问作者blue_m
相关产品推荐
相关产品推荐

