0

我目前正在尝试实现以下算法来查找最大边距决策边界(用于 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*。

4

1 回答 1

0

改变你的测试;而不是var_defined(wopt),使用wopt is not None. 然后, Python 的惰性and/or评估将意味着仅在已定义np.linalg时才应用。wopt

您当前的var_defined功能没用;如果一个名字实际上没有被分配,NameError 当你尝试调用这个名字的函数时,你会得到一个。函数内,如果它确实被正确调用,var总是被定义(因为它是参数),所以它总是return 1. 您实际上并没有检查参数是否is None.

此外,这样的函数应该return TrueFalse而不是0and 1,并且可以直接测试:

if not bool_func(x): # no == 0
于 2013-12-28T11:08:02.330 回答