定义变量:程序逻辑流程的问题

时间:2013-12-28 10:57:36

标签: python numpy convex-optimization cvxopt

我目前正在尝试实施以下算法来查找最大边距决策边界(用于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,则它适用于&#34; w *未定义&#34;第9行比较,但第二次比较&#34; | w | &LT; | w * |&#34;,它比较了w和w *的范数,因为你不能在None变量上运行np.linalg.norm()。

如果我将w *初始化为某个垃圾矩阵(比如说[40,40])并记住作为我的占位符值未定义,在我需要检查w *未定义的行的那一行中替换该垃圾矩阵,那么我也遇到了问题 - CVXOPT不允许直接比较矩阵,看看它们是否相等。我可以循环并比较每个元素,但这会显着损害性能(特别是因为我可以将它用于大型数据集)。

这是我的错误代码的要点: http://tinyurl.com/pr5j44w

请注意,wopt是有问题的变量w *。

1 个答案:

答案 0 :(得分:0)

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

您当前的var_defined功能无用;如果实际上还没有分配名称,当您尝试在该名称上调用函数时,将获得NameError 函数中,如果它被调用而没有错误,var 总是定义(因为它是参数),所以它总是{{1} }。您实际上没有检查参数return 1

此外,类似的功能应该is None returnTrue而不是False0,并且可以直接测试:

1