我有两个numpy数组(特性)。numpy数组的尺寸如下:
从音频文件中提取audio=(360,13) -特征
Image=(360,5)->特征是从这些音频文件的谱图中提取出来的。
我想使用这两个数组一起训练svm分类器。但我知道svm列车只得到一个数组。(svm.train(特征,标签))。我在找像svm.train(音频,图像,标签)这样的东西吗?
我还试图将这两个数组连接起来,但尺寸不同。我怎样才能解决这个问题?
发布于 2017-09-15 20:30:30
也许我误解了,但维度又是什么问题呢?
每个数组中有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的解决方案。多内核方法很有意义,而且比这种方法更灵活。
发布于 2017-09-15 20:34:26
虽然@Saedeas提供了一个简单的解决方案,但我建议采用稍微不同的方式。
级联对于同质的特性是很好的,当数据来自完全不同的方式(如音频+视频)时,它不能很好地工作。但是,可以使用内核函数的简单属性(这是SVMs的基础)来处理,即两个核之和是一个内核,因此我们可以定义:
K_{audio x video}(x,y) = a K_{video}(x_{video}, y_{video}) +
(1-a) K_{audio}(x_{audio},y_{audio})因此,分别给出了每个模态的核,在其上定义了一个联合核,其中a是一个超参数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)发布于 2017-09-15 20:32:33
你可以把它们连在一起。例如:http://scikit-learn.org/stable/modules/pipeline.html#feature-union,或者您可以训练两个支持向量机并处理预测结果。例子:http://scikit-learn.org/stable/modules/ensemble.html#voting-classifier .
https://stackoverflow.com/questions/46246986
复制相似问题