我对机器学习相对来说还是个新手,决定先研究一些理论,然后再用代码进行实践。在这个过程中,我遇到了很多错误信息,大多数我都设法解决了,但这个错误让我迷茫。我对Python也相对比较新手,所以我确定这是一个与语法相关的错误,但这次我没能找出具体问题(Python 2.7.15)。以下是完整的代码:
但我一直收到以下错误信息:
Traceback (most recent call last): File “C:\Users…\Support Vector Machine (from scratch).py”, line 134, in x2=[ w[0],w[1],-w[1],w[0] ] NameError: name ‘w’ is not defined
希望有更有经验的人能帮我解决。谢谢。
回答:
首先,你在方法svm_sgd_plot
中定义了w
,但该方法在你明确调用它之前不会执行任何操作。
你可以通过添加一行w = svm_sgd_plot(X,Y)
来调用它,例如在绘制测试数据之后,这样你的代码就会变成
#绘制训练数据for d, sample in enumerate(X): # 绘制负样本if d < 2: plt.scatter(sample[0], sample[1], s=120, marker='_', linewidths=2) # 绘制正样本else: plt.scatter(sample[0], sample[1], s=120, marker='+', linewidths=2)#绘制测试数据# 添加我们的测试样本plt.scatter(2,2, s=120, marker='_', linewidths=2, color='yellow')plt.scatter(4,3, s=120, marker='+', linewidths=2, color='blue')plt.show()#调用你的方法w = svm_sgd_plot(X,Y)
然后你只需要可视化你的方法提供的分类。我添加了你的两个测试数据观察点,以便你可以看到你的SVM方法如何正确地对它们进行分类。注意,黄色点和蓝色点被你的SVM方法生成的线分隔开来。
# 打印由svm_sgd()计算出的超平面x2=[ w[0],w[1],-w[1],w[0] ]x3=[ w[0],w[1],w[1],-w[0] ]x2x3 = np.array([x2,x3])X,Y,U,V = zip(*x2x3)ax = plt.gca()ax.quiver(X,Y,U,V,scale=1, color='blue')#我添加了以下三行,以便你可以看到你的SVM方法如何对测试数据进行分类plt.scatter(2,2, s=120, marker='_', linewidths=2, color='yellow')plt.scatter(4,3, s=120, marker='+', linewidths=2, color='blue')plt.show()