我目前正在尝试实施以下算法来查找最大边距决策边界(用于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 *。
答案 0 :(得分:0)
改变你的考试;而不是var_defined(wopt)
,请使用wopt is not None
。 Python的惰性and
/ or
评估意味着np.linalg
仅在wopt
被定义时才会应用。
您当前的var_defined
功能无用;如果实际上还没有分配名称,当您尝试在该名称上调用函数时,将获得NameError
。 在函数中,如果它被调用而没有错误,var
总是定义(因为它是参数),所以它总是{{1} }。您实际上没有检查参数return 1
。
此外,类似的功能应该is None
return
或True
而不是False
和0
,并且可以直接测试:
1