我在numpy
的python中写了一个口袋算法,发现如果我改变了
w += (x[:, col_idx] * y[col_idx, 0]).transpose()
(错误答案)
要
w = w + (x[:, col_idx] * y[col_idx, 0]).transpose()
(正确答案)
算法将打印出不同的结果。
我已经打印了w,x,y和两个版本是相同的。
w只是在上面的陈述的左侧,并已初始化。
我也检查了算法并确保它是正确的。
我无法理解的是,为什么只将w+=()
更改为w=w+()
更改整个结果?(error_rate)
我测试过它的w值会打印出来。
功能部分是
def pocket(x, y, update=50):
w = np.zeros(shape=(1, 5))
w_pocket = np.zeros(shape=(1, 5))
update_idx = 0
col_idx = 0
col_number = x.shape[1]
error_pocket = error_rate(x, y, w_pocket)
for update_idx in range(update):
col_range = random.sample(range(col_number), col_number)
for col_idx in col_range:
perceptron_score = w * x[:, col_idx]
if label(perceptron_score) != y[col_idx, 0]:
print "1:", col_idx, ":", x[:, col_idx].transpose(), y[col_idx, 0], w
w = w + (x[:, col_idx] * y[col_idx, 0]).transpose()
# w += (x[:, col_idx] * y[col_idx, 0]).transpose()
print "2:", col_idx, ":", x[:, col_idx].transpose(), y[col_idx, 0], w
error = error_rate(x, y, w)
if error < error_pocket:
w_pocket = w
error_pocket = error
break
return w_pocket
如果你想测试它
你需要文件
https://github.com/lypan/Machine_Learning_Foundations
214976eed5abc4514832daa9e6adf6d0250d3371
只需解压缩并运行脚本