输出标签为 3D 数组时如何使用 SVM?
Posted
技术标签:
【中文标题】输出标签为 3D 数组时如何使用 SVM?【英文标题】:How to use SVM when output label is a 3D array? 【发布时间】:2019-08-22 08:58:44 【问题描述】:问题很简单,我有一个 3D 图像,我想使用 SVM 对它们进行分割。所以我将输入和输出图像转换为 3D numpy 数组,现在我想使用 SVM。但似乎clf.fit()
不支持多维标签。那么如何训练标签为多维数组的模型呢?
一个简单的例子:
from sklearn import svm
x=[[0,0],[1,1]]
y=[[0,0],[1,1]]
clf=svm.SVC(gamma='scale')
clf.fit(x,y)
错误是:
Traceback (most recent call last):
File "basic.py", line 5, in <module>
clf.fit(x,y)
File "/usr/local/lib/python3.5/dist-packages/sklearn/svm/base.py", line 149, in fit
accept_large_sparse=False)
File "/usr/local/lib/python3.5/dist-packages/sklearn/utils/validation.py", line 761, in check_X_y
y = column_or_1d(y, warn=True)
File "/usr/local/lib/python3.5/dist-packages/sklearn/utils/validation.py", line 797, in column_or_1d
raise ValueError("bad input shape 0".format(shape))
ValueError: bad input shape (2, 2)
【问题讨论】:
scikit-learn.org/stable/tutorial/basic/tutorial.html ***.com/questions/17507165/… @ZF007 我在发布之前已经看到了上面的链接,但是输出数组只有 1D,在我的情况下它是 3D。 如果您通过编辑问题来发布一些代码,那么有人可能会为您指明正确的方向。 (在 scikit-learn 的这一部分没有专业知识)。您的问题似乎有效,但可能由于缺少代码而触发了分类审核。 @ZF007 已更新。 【参考方案1】:您正在添加不同的 y 类标签,这就是它不起作用的原因。请参阅下面的内联 cmets 解决方案。
from sklearn import svm
x=[[0,0],[1,1],[7,8]]
y=[0,1, 2] # class labels
clf=svm.SVC() # clf=svm.SVC(gamma='scale') > gamma is auto. no need to add this.
print (clf.fit(x,y))
q = clf.predict([[2., 2.]]) # simple example to test prediction.
print ('array : %s ' % q)
# use of multiple class labes for y
x=[[0,0],[1,1]]
y=[[0,1],[0,2]] # the value 2 is to show the difference in printed output.
# add here your `for item in x:` if both arrays are 3D. `for item in y:` needs
# indentation if you do.
for item in y: # iters through the labeling list.
print (item)
clf=svm.SVC()
print (clf.fit(x,item))
q = clf.predict([[2., 2.]])
print ('array : %s ' % q)
打印结果:
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
array : [1]
[0, 1]
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
array : [1]
[0, 2]
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
array : [2]
【讨论】:
我需要训练输入为 3D 数组且标签也是 3D 数组的模型。 使用示例并修改以适合您自己的 x-array。 Scikit-learn 不适合按照您希望的方式进行操作。你可以做for item in x: for item in y:
这允许你遍历你的 3D 数组 (x) 和 3d y。以上是关于输出标签为 3D 数组时如何使用 SVM?的主要内容,如果未能解决你的问题,请参考以下文章
如何在训练期间为 Scikit Learn SVM 中的每个标签分配概率?
如何在 scikit-learn 的 SVM 中使用非整数字符串标签? Python