我目前正在尝试实现以下算法来查找最大边距决策边界(用于 SVM):
let D = {(x1, y1), (x2, y2), . . . , (xl, yl )} ⊂ Rn ×{+1,−1}
r ← max{|x| | (x, y) ∈ D}
q ← 1000
let w∗ and b∗ be undefined
Construct X according to (6.32) using D.
for each b ∈ [−q, q] do
Construct c according to (6.33) using b.
w ← solve(I, 0, X, c)
if (w is defined and w∗ is undefined) or (w is defined and |w| < |w∗|) then
w∗ ← w
b∗ ← b
end if
end for
if w∗ is undefined then
stop constraints not satisfiable
else if |w|∗ > q/r then
stop bounding assumption of |w| violated
end if
return (w∗, b∗)
我们关心的唯一变量是 w*,它应该是一个矩阵(来自 CVXOPT 包,而不是 numpy 数组——尽管 CVXOPT 矩阵可以从 numpy 数组创建)。当我检查是否定义了 w* 时,主要问题发生了。
如果我在第 4 行将它初始化为 None,那么它对于第 9 行的“w* is undefined”比较工作正常,但第二个比较“|w| < |w*|”,它比较 w 和 w 的范数*, 失败,因为您不能只在 None 变量上运行 np.linalg.norm() 。
如果我将 w* 初始化为某个垃圾矩阵(例如 [40,40])并记住它作为我未定义的占位符值,在我需要检查 w* 是否未定义的行下替换该垃圾矩阵,那么我也运行遇到问题——CVXOPT 不允许直接比较矩阵来查看它们是否相等。我可以循环浏览并比较每个元素,但这会严重影响性能(尤其是因为我可能将它用于大型数据集)。
这是我的错误代码的要点:http: //tinyurl.com/pr5j44w
请注意,wopt 是有问题的变量 w*。