You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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))

代码说明

  1. 动态生成符号:通过symbols('alpha0:%d' % n)根据样本数量n生成对应数量的符号,确保适配任意样本量。
  2. 线性核计算:使用np.dot计算样本间的点积(线性SVM的核函数),数值会自动与SymPy符号结合为符号表达式。
  3. 求和修正:sum(alpha)直接对符号元组求和,符合对偶拉格朗日函数中Σα_i的定义。

运行结果

执行代码后,会输出完整的对偶拉格朗日符号表达式,针对你的示例数据,输出会包含alpha0、alpha1、alpha2的二次项与一次项组合。

内容的提问来源于stack exchange,提问作者blue_m

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:09:26