如何使用两个特征向量训练svm?

ali*_*ali 1 python artificial-intelligence classification machine-learning svm

我有两个numpy数组(功能)。numpy数组的尺寸为:

audio =(360,13)--->从音频文件中提取特征

image =(360,5)->特征是从这些音频文件的频谱图中提取的。

我想一起使用这两个数组来训练svm分类器。但是我知道svm train只能得到一个数组。(svm.train(feature,label))。我正在寻找是否有像svm.train(音频,图像,标签)之类的东西

我也尝试连接这两个数组,但是维数不同。我该如何解决这种情况?

lej*_*lot 5

虽然@Saedeas提供了一个简单的解决方案,但我建议采用略有不同的方式。

串联对于同质功能很有用,当数据来自完全不同的形式(例如音频和视频)时,它不能很好地工作。但是,可以使用内核函数的简单属性(这是SVM的基础)来解决这一问题,即两个内核的总和是一个内核,因此我们可以定义:

K_{audio x video}(x,y) = a K_{video}(x_{video}, y_{video}) + 
                         (1-a) K_{audio}(x_{audio},y_{audio})
Run Code Online (Sandbox Code Playgroud)

因此,分别为每个模态指定内核,我们在其顶部定义一个联合内核,其中a是要调整的超参数ae [0,1]。

在代码方面,可以按照与建议的方式类似的方式进行:

# First concat, but only for easier handling
new_data = np.concatenate((audio,image), axis=1)
y = ...

def video_kernel(X, Y):
  ...

def audio_kernel(X, Y):
  ...

# now new kernel
def new_kernel(X, Y, a=0.5):
  return a*audio_kernel(X[:, :13], Y[:, :13]) + (1-a)*video_kernel(X[:, 13:], Y[:, 13:])

svm = SVC(kernel=new_kernel)
svm.fit(new_data, y)
Run Code Online (Sandbox Code Playgroud)