CVXPY で SVM の二重問題を解決しようとしています。
以下は 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に非常に慣れていません。これを修正するのを手伝ってください。ありがとう。