Python 如何利用两个特征向量训练支持向量机?

Python 如何利用两个特征向量训练支持向量机?,python,machine-learning,artificial-intelligence,classification,svm,Python,Machine Learning,Artificial Intelligence,Classification,Svm,我有两个numpy阵列(功能)。numpy阵列的尺寸为: 音频=(360,13)-->从音频文件中提取特征 image=(360,5)-->从这些音频文件的频谱图中提取特征 我想使用这两个数组一起训练svm分类器。但我知道svm训练只得到一个数组。(svm.train(特征、标签))。我要找的是svm.train(音频、图像、标签)之类的东西吗 我还尝试连接这两个数组,但维度不同。我怎样才能解决这个问题 也许我误读了,但是维度是如何成为一个问题的呢 每个阵列中有360个样本,一个有13个维度,另

我有两个numpy阵列(功能)。numpy阵列的尺寸为:

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

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

我想使用这两个数组一起训练svm分类器。但我知道svm训练只得到一个数组。(svm.train(特征、标签))。我要找的是svm.train(音频、图像、标签)之类的东西吗


我还尝试连接这两个数组,但维度不同。我怎样才能解决这个问题

也许我误读了,但是维度是如何成为一个问题的呢

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

您可能需要规范化这些值,但串联应该是:

new_data = np.concatenate((audio,image), axis=1)
您可以通过使数据值为零均值、单位方差(找到每个维度的均值和方差,从每个样本中减去均值,然后除以方差)来规范化数据值


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

您可以将它们连接起来。例如,像这样:,或者您可以训练两个SVM并处理预测结果。示例:.

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

串联有利于同质功能,当数据来自完全不同的模式(如音频+视频)时,串联不起作用。但是,可以使用核函数的简单属性(这是支持向量机的基础)来处理,即两个核的和是一个核,因此我们可以定义:

K_{audio x video}(x,y) = a K_{video}(x_{video}, y_{video}) + 
                         (1-a) K_{audio}(x_{audio},y_{audio})
因此,分别给出每个模态的核,我们在其上定义一个联合核,其中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)

好啊非常感谢。但我关心的是我是否应该正常化?如果我不正常化,会发生什么?它经常,但不总是,与梯度下降的速度有关。以下是关于动机的更多信息:
# 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)