如何在支持向量机中操作多维特征或者使用多维特征训练模型?

3
如果我有这个输入:
"a1,b1,c1,d1;A1,B1,C1,D1;α1,β1,γ1,θ1;Label1"  
"... ... "  
"an,bn,cn,dn;An,Bn,Cn,Dn;αn,βn,γn,θn;Labelx"

数组表达式:

[
 [[a1,b1,c1,d1],[A1,B1,C1,D1],[α1111],[Label1]], 
 ... ... ... ... 
 [[an,bn,cn,dn],[An,Bn,Cn,Dn],[αn,βn,γn,θn],[Labelx]]
                                                     ]

实例:

[... ... ... ...
 [[58.32,453.65,980.50,540.23],[774.40,428.79,1101.96,719.79],[503.70,624.76,1128.00,1064.26],[1]], 
 [[0,0,0,0],[871.05,478.17,1109.37,698.36],[868.63,647.56,1189.92,1040.80],[1]],
 [[169.34,43.41,324.46,187.96],[50.24,37.84,342.39,515.21],[0,0,0,0],[0]]]

就像这样:
有三个矩形,标签表示相交、包含或其他。
我想使用3个或更多功能通过SVM来训练模型。
我刚刚学习了“Python鸢尾花SVM”代码,接下来我该怎么做?

我的建议:
以下是我的建议:

from sklearn import svm
import numpy as np
mport matplotlib as mpl
from sklearn.model_selection import train_test_split

def label_type(s):
    it = {b'Situation_1': 0, b'Situation_2': 1, b'Unknown': 2}
    return it[s]


path = 'C:/Users/SEARECLUSE/Desktop/MNIST_DATASET/temp_test.data' 
data = np.loadtxt(path, dtype=list, delimiter=';', converters={3: 
label_type})

x, y = np.split((data), (3,), axis=1)
x = x[:, :3]
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, 
train_size=0.6)

clf = svm.SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr')
clf.fit(x_train, y_train.ravel())

错误报告:

Line: clf.fit(x_train, y_train.ravel())

ValueError: could not convert string to float: 

如果我尝试转换数据:

x, y = np.split(float(data), (3,), axis=1)

报告错误:

Line: x, y = np.split(float(data), (3,), axis=1)

TypeError: only length-1 arrays can be converted to Python scalars

我怀疑你不能对data使用float,因为data不是长度为1的数组,所以它不能被转换为Python标量(即float)。请使用data.astype('float'),这是一个NumPy方法。 - kevinkayaks
它不起作用,可能是因为像[0,0,0,0]中的符号','无法转换为浮点类型? - Yuan Chu
对于您来说,将输入特征展平是否是一个有效的选项? - syltruong
我确实想要一个一维的输入,但是将矩形压缩成一个单点似乎很困难...我不知道是否可以得到一个函数来完成这个任务。 - Yuan Chu
@YuanChu 在进行数据展开之前,请确保您的数据是正确的。这可能会解决不出现错误的问题,但可能无法得到良好的模型。请了解数据以及数据为什么以那种方式表示。深入挖掘一下,这不会有害! - BoyInDaBox89
显示剩余2条评论
2个回答

0

SVM最初并不是为处理多维数据而设计的。我建议您将输入特征展平:

x, y = np.split((data), (3,), axis=1)
x = x[:, :3]

# flatten the features
x = np.reshape(x,(len(x),-1))

x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, 
train_size=0.6)

clf = svm.SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr')
clf.fit(x_train, y_train.ravel())

非常感谢,我会改变我的想法来完成我的项目。 - Yuan Chu

-1

在我回答之前,我有几个问题:

Q1. 你用什么样的数据来训练SVM模型?是图像数据吗?如果是图像数据,那么它是RGB数据吗?从你解释的方式来看,你打算使用SVM进行图像分类。如果我错了,请纠正我。

假设 假设你有图像数据。那么请将其转换为灰度图像。然后尝试将整个数据转换为numpy数组。查找numpy模块以了解如何执行此操作。

一旦你的数据变成了numpy数组,那么你就可以应用你的模型。

如果这有帮助,请告诉我。


A1: 我想找到一个强特征来解释我的标签。但现在,我只有3个弱特征,并且我想使用SVM找到一种关系将3个特征合并成1个。 - Yuan Chu
如果我理解正确的话,[a1,b1,c1,d1] 是一个特征,你想找出它是否能正确解释标签?还有 [A1,B1,C1,D1] 等等... - BoyInDaBox89
我认为使用单一的特征来进行姿势分类是低效的,所以我尝试制作一些弱特征。另外,我尝试将图形交集识别作为我的简易步骤。 - Yuan Chu
这意味着 [ [特征1-1],[特征1-2],[特征1-3],[标签1]],因为很难获取[[特征1],[标签1]]。 - Yuan Chu
这些特性是否属于三维运动,如张量? - BoyInDaBox89
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接