感谢您查看此问题。 我试图了解如何使用多变量高斯分类器。
为了更好地向您介绍我的问题,我将展示我目前如何对数据进行分类。
我有一个这些对象的库:
public class AccFeat {
int id;
Double[] mean = new Double[3];
Double[] sd = new Double[3];
Double[] avPeakDistance = new Double[3];
int[][] histogram = new int[3][10];
int[][] fftHistogram = new int[3][10];
int[] crossingCount = new int[3];
double resultantAcc;
int type;
然后我得到一个带有 type 字段的对象,表明它没有被识别。
步骤:
每班加载30个训练样本库。
计算每个样本类的每个要素的均值和方差,将这些值存储在数组中,每个类包含73个均值/方差对的数组。 (因为共有73个特征,包括6个直方图,每个10个箱子(60个数字))
创建一个包含73个值的数组,这些值对应于要识别的AccFeat对象的功能。
使用我所理解的朴素贝叶斯分类器来计算概率。
我们从0到8检查i,因为有9个样本类。
for (int i = 0; i < 9; i++) {
result = 1;
for (int j = 0; j < SAMPLEFEATURES.get(i).size(); j++) {
result = result * p(QUERYFEATURES.get(j), SAMPLEFEATURES.get(i).get(j));
//this is the p function, first argument is value of feature,
//second argument is mean-variance pair for this feature in this particular i class.
}
results[i] = result;
}
}
p(x)函数就是这样:
然后我有9个概率值,对于每个类,我的分类器会说它是对应于最高概率值的类。
现在我想创建一个多变量高斯分类器。
这是在这种情况下用于计算概率的公式:
所以我为9个类中的每个类创建了一个方差 - 协方差矩阵。在这里我不确定我是否做得对,我采用了所有73个特征,其中包括6个直方图,每个10个分区,因此其中60个特征是加速度频率和加速度值的直方图
我觉得有点狡猾,我应该把所有这些值放在一个矩阵中吗?计算x轴上10-20范围内的加速度频率和y加速度的峰值距离之间的协方差似乎有点奇怪。
但我这样做,并为每个类使用此公式为每个类创建一个73x73矩阵:
Cov(特征a,特征b)= sum((featureA [i] - mean_featureA)*(featureB [i] - mean_featureB))/ n-1
接下来我需要的是一个平均向量,所以我为每个类相关联的每组smaples创建一个73元素的每个特征均值的向量,总共9个向量。
根据我的理解,我的程序中公式中的x是一个73元素的未识别的AccFeat对象的特征值向量。
所以我实现了这个公式,思考:我必须使用协方差矩阵和每个类的方法来运行它,结果最高的那个很可能是识别的候选者
问题:
协方差矩阵充满了负值,只有5%左右是正值,当它们通常非常大时。
此矩阵的行列式在某些情况下非常接近0或负值,这会破坏公式。
我使用分类器的方式有什么问题?不幸的是,我没有人帮助我 有了这个,我基于对在线演讲幻灯片的所有弱认识......
任何人都可以帮我解决使用方法吗?
答案 0 :(得分:0)
我还没有彻底检查你所做的是否有效,但我可以帮助你解决你所犯的错误。您没有足够的数据点来估计协方差矩阵,因此最大似然估计是单数。
一种选择是移动到Linear Discriminant Analysis的变体,您可以在所有类中使用合并的协方差矩阵。如果您在所有类中汇集了足够的数据,这可能会为您提供非奇异的协方差矩阵。另一种选择是朴素贝叶斯,这就是你所拥有的,你有一个对角线协方差矩阵。
否则,您是否有任何理由想要使用MVN分类器?您可以使用其他东西,例如带有内核的SVM,用于比较直方图。