输出标签为 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

Unity3D如何检查与标记为“标签”的对象的碰撞

在训练 SVM 对图像进行分类时设置具有序列错误的数组元素

Scikit Learn:如何在回归中设置 SVM 输出范围?

从线性 SVM 绘制 3D 决策边界