2013-02-26 53 views
2

PyML具有绘制决策曲面图形的功能。PyML:绘制决策曲面图形

首先你需要告诉PyML使用哪些数据。在这里,我用我的特征向量使用sparsevectordata。这是我用来训练我的SVM的一个。

demo2d.setData(training_vector) 

然后你需要告诉它你想使用哪个分类器。我给它一个训练有素的SVM。

demo2d.decisionSurface(best_svm, fileName = "dec.pdf") 

不过,我得到这个错误信息:

Traceback (most recent call last): 
**deleted by The Unfun Cat** 
    demo2d.decisionSurface(best_svm, fileName = "dec.pdf") 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PyML/demo/demo2d.py", line 140, in decisionSurface 
    results = classifier.test(gridData) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PyML/evaluators/assess.py", line 45, in test 
    classifier.verifyData(data) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PyML/classifiers/baseClassifiers.py", line 55, in verifyData 
    if len(misc.intersect(self.featureID, data.featureID)) != len(self.featureID) : 
AttributeError: 'SVM' object has no attribute 'featureID' 

回答

3

我要深入到源,因为我从来没有使用PyML。试图在网上找到它,但我无法追踪在线的PyML 0.7.2中的verifyData方法,所以我不得不搜索下载的源代码。

一个分类的featureID仅在baseClassifier类的train方法(线77-78)设置:

if data.__class__.__name__ == 'VectorDataSet' : 
     self.featureID = data.featureID[:] 

在你的代码,data.__class__.__name__正在评估对"SparseDataSet"(或曾经其它类,你使用的是什么)和该表达式评估为False(从不设置featureID)。

然后在demo2d.decisionSurface

gridData = VectorDataSet(gridX) 
gridData.attachKernel(data.kernel) 
results = classifier.test(gridData) 

它试图用VectorDataSet您的分类进行测试。在这种情况下classifier.test相当于给assess.test方法的调用它试图验证该数据具有训练数据必须通过使用baseClassifier.verifyData相同的特性:

def verifyData(self, data) : 
    if data.__class__.__name__ != 'VectorDataSet' : 
     return 
    if len(misc.intersect(self.featureID, data.featureID)) != len(self.featureID) : 
     raise ValueError, 'missing features in test data' 

然后测试类中传递的数据,这现在是"VectorDataSet",然后继续尝试访问从未创建的featureID属性。

基本上,它可能是错误或隐藏功能。

长话短说,您必须将您的数据转换为VectorDataSet,因为SVM.featureID未另行设置。

此外,您不需要传递它一个训练的数据集,该功能为您训练分类器。

编辑:

我也想提请注意setData方法:

def setData(data_) : 
    global data 
    data = data_ 

没有类型检查在所有。因此,有人可能设置data任何东西,例如,整数,字符串等,这将在decisionSurface中导致错误。

如果您打算使用setData,您必须谨慎使用它(仅适用于VectorDataSet),因为代码没有您想要的那么灵活。

+0

感谢您为这样一个可怕的总和做出优秀的代码检测工作。 – 2013-03-06 09:44:16

+0

将尝试添加一些例子,当我有时间看看你的答案时。 – 2013-03-06 10:05:40