Python 3.x 当输出标签为3D阵列时,如何使用SVM?

Python 3.x 当输出标签为3D阵列时,如何使用SVM?,python-3.x,machine-learning,scikit-learn,svm,Python 3.x,Machine Learning,Scikit Learn,Svm,问题很简单,我有一个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 la

问题很简单,我有一个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)
回溯(最近一次呼叫最后一次):
文件“basic.py”,第5行,在
clf.配合(x,y)
文件“/usr/local/lib/python3.5/dist-packages/sklearn/svm/base.py”,第149行,适合
接受\u大\u稀疏=假)
文件“/usr/local/lib/python3.5/dist-packages/sklearn/utils/validation.py”,第761行,检查
y=列_或_1d(y,警告=真)
文件“/usr/local/lib/python3.5/dist-packages/sklearn/utils/validation.py”,第797行,在列_或_1d中
raise VALUERROR(“错误的输入形状{0}”。格式(形状))
ValueError:错误的输入形状(2,2)

您正在添加不同的y-class标签,这就是为什么它不起作用的原因。请参阅下面带内联注释的解决方案

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]

@ZF007在发布之前,我已经看到了上面的链接,但是那里的输出数组只有1D,在我的例子中是3D。如果你通过编辑问题发布一些代码,有人可能会为你指出正确的方向。(在scikit learn的这一部分没有专业知识)。您的问题似乎有效,但可能由于缺少代码而触发了分类审查。@ZF007已更新。我需要训练输入为3D数组且标签也是3D数组的模型。使用示例并修改以适合您自己的x-array。Scikit learn不适合按您希望的方式进行。您可以对x中的项目执行
:对y中的项目执行
,这允许您通过3D阵列(x)和3D y进行iter。