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

时间:2017-09-15 20:20:06

标签: python machine-learning artificial-intelligence classification svm

我有两个numpy数组(功能)。 numpy数组的维度是:

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

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

我想将这两个数组一起用来训练svm分类器。但我知道svm火车只有一个阵列。 (svm.train(feature,label))。我正在寻找有什么像svm.train(音频,图像,标签)

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

3 个答案:

答案 0 :(得分:4)

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

连接适用于同质功能,当数据来自完全不同的模式(如音频+视频)时,它不能很好地工作。但是,可以使用内核函数的简单属性(它是SVM的基础)来处理它,即两个内核的总和是内核,所以我们可以定义:

K_{audio x video}(x,y) = a K_{video}(x_{video}, y_{video}) + 
                         (1-a) K_{audio}(x_{audio},y_{audio})

为每个模态分别给出内核,我们在它上面定义一个联合内核,其中a是一个超参数e [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)

答案 1 :(得分:2)

也许我误读了,但这些维度是一个问题?

每个阵列中有360个样本,一个有13个维度,另一个有5个样本。将其转换为包含18个维度的360个样本的单个数组。

您可能需要规范化值,但连接应该只是:

new_data = np.concatenate((audio,image), axis=1)

您可以通过使数据值为零均值,单位方差(找到每个维度的均值和方差,从每个样本中减去均值,并除以方差)来标准化数据值。

means = np.mean(new_data, axis=0)
vars = np.var(new_data, axis=0)
norm_data = (new_data - means) / vars

编辑:您可能仍然以这种方式正常化,但我会使用@ lejlot的解决方案。多核方法很有意义,并且比这种方法更灵活。

答案 2 :(得分:0)

您可以连接它们。例如:http://scikit-learn.org/stable/modules/pipeline.html#feature-union,或者您可以训练两个SVM并使用预测结果。示例:http://scikit-learn.org/stable/modules/ensemble.html#voting-classifier