2011-05-28 235 views
2

我用MFCC算法得到了一些声音变量的特征。我想用K-Means对它们进行聚类。我有70帧,每个帧有9个倒谱系数用于一个音色样本。这意味着我有一个像70 * 9大小的矩阵。如何实现MFCC特征的K均值聚类算法?

让我们假设A,B和C是语音记录,这样

A是:

List<List<Double>> -> 70*9 array (I can use Vector instead of List) 

而且B和C具有相同的长度了。

我不想聚簇每个帧,我想聚集每个帧块(在我的例子中,一个组有70帧)。

如何在Java中使用K-Means实现它?

回答

2

以下是您对问题领域知识变得至关重要的地方。您可能只需使用70 * 9矩阵之间的距离,但您可能会更好。我不知道您提到的特定功能,但一些通用示例可能是平均值,每个功能70个值的标准差。您基本上希望减少维度的数量,这既能提高速度,又能使度量对抗简单变换,例如将所有值偏移一步

+0

哦,一旦你确定你的最终特征是正常化的,你的最后距离测量可能只是特征之间差异的总和 – Nicolas78 2011-05-29 06:50:10

0

K-Means对您的数据有一些非常艰难的假设。我不相信你的数据适合在其上运行k-means。

  1. K均值设计为欧几里德距离,并且可能会有更适合您的数据的距离度量。许多距离函数(和算法!)在70 * 9尺寸下效果不佳(“维度诅咒” )
  2. 您需要事先知道k。

附注:远离基本类型的Java泛型,如Double。它杀死了性能。使用double[][]