感谢您检查这个问题。我试图了解如何使用多元高斯分类器。
为了更好地向您介绍我的问题,我将展示目前我如何对数据进行分类。
我有一个包含这些对象的库:
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 个 bin(60 个数字))
创建一个包含 73 个值的数组,这些值对应于要识别的 AccFeat 对象的特征。
使用我理解的Naive Bayesian Classifier计算概率。
我们检查 i 从 0 到 8,因为有 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
接下来我需要一个均值向量,因此我为与每个类关联的每组样本创建了一个包含每个特征的平均值的 73 个元素向量,总共 9 个向量。
据我了解,在我的程序中,公式中的 x 是未识别的 AccFeat 对象的特征值的 73 元素向量。
所以我实现了这个公式,思考:我必须使用协方差矩阵和每个类的均值来运行它,结果最高的最有可能是识别的候选者
问题:
协方差矩阵充满了负值,其中只有大约 5% 是正值,而当它们是正值时,它们通常非常大。
在某些情况下,该矩阵的行列式非常接近 0 或负数,这会破坏公式。
我使用分类器的方式有什么问题?不幸的是,我没有人可以帮助我解决这个问题,我所有的薄弱理解都基于在线讲座幻灯片......
谁能帮助我如何使用它?