python - 求解 SVM 对偶时 CVXPY 错误 "Cannot multiply two non-constants"

标签 python machine-learning svm convex-optimization cvxpy

我正在尝试使用 CVXPY 解决 SVM 对偶问题。

formula of the dual problem

Python代码如下:

import numpy as np
import cvxpy as cvx

# note: X and Y are numpy arrays generated for testing purpose
# calculating guassian kernal
def kg(a, b, theta=1):
    sim = np.exp( -0.5 * np.dot(a, b) / (theta ** 2))
    return sim

# generating kernal matrix
def k_mat(x, k_func=kg):
    m = x.shape[0]
    mat = np.zeros((m, m))
    for i in range(m):
        for j in range(m):
            mat[i, j] = k_func(x[i, :], x[j, :])
    return mat

k=k_mat(X)

# setup parameters
a = cvx.Variable(m)
C = cvx.Parameter(sign="positive")
C.value = 0.01

# start convex optimization
obj = cvx.Maximize(cvx.sum_entries(a) - \
      0.5 * cvx.mul_elemwise(Y, a).T * k * cvx.mul_elemwise(Y, a))
constraints = [a>=0, a<=C, cvx.sum_entries(Y, a)==0]
prob = cvx.Problem(obj, constraints)

prob.solve()
print(a.value)

我收到错误:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/IPython/core/interactiveshell.py", line 3066, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-44-d3b220364629>", line 4, in <module>
    obj = cvx.Maximize(cvx.sum_entries(a) - 0.5 * cvx.mul_elemwise(Y, a).T * k * cvx.mul_elemwise(Y, a))
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/cvxpy/expressions/expression.py", line 43, in cast_op
    return binary_op(self, other)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/cvxpy/expressions/expression.py", line 224, in __mul__
    raise DCPError("Cannot multiply two non-constants.")
cvxpy.error.DCPError: Cannot multiply two non-constants.

cvxpy 似乎不支持核矩阵的二次型优化。但是我看到人们在 Matlab 中使用 cvx 解决了本演示文稿第 13(35) 页上的相同问题:

http://users.isy.liu.se/en/rt/schon/CourseMLlund/le5.pdf

我是 cvx 的新手。请帮我纠正这个。谢谢。

最佳答案

找到解决方案。

问题 1

我犯了一个愚蠢的错误,错误的高斯核定义,应该是:

def kg(a, b, theta=1):
    sim = np.exp(np.dot((a - b), (a - b)) / (2 * theta ** 2))
    return sim

问题2

正确的二次型应该是。 (我真的希望 cvx 公式与 numpy 约定兼容)

cvx.quad_form(cvx.mul_elemwise(Y, a), k)

关于python - 求解 SVM 对偶时 CVXPY 错误 "Cannot multiply two non-constants",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33728518/

相关文章:

python - 从字典中打印随机范围 2-4 中的 K 和 V

python - Google colaboratory 在本地运行代码

Python,许多 3x3、奇异、对称、矩阵的同时伪反转

python - 线性回归 - 输出不正确

c++ - 如何在 OpenCV SVM 中获取分离超平面?

c++ - 是否有任何 SVM 库支持可与 Visual Studio C++ 一起使用的自定义内核?

python - 如何将流线从 matplotlib 导入 ArcGIS?

machine-learning - 单个网络 - 多个输出,还是多个网络 - 单输出?

python - 在 Tensorflow 中学习两个数字的和

opencv - 进行 Min-Max 归一化的正确方法