使用带有MATLAB的GMM进行分类



我正在尝试使用GMM对测试集进行分类。我有一个标签为{1,2,3}的训练集(n*4矩阵),n表示训练示例的数量,它有4个属性。我还有一个测试集(m*4)要分类。

我的目标是为每个测试示例提供一个概率矩阵(m*3),给出每个标签P(x_test|labels)。就像软集群一样。

首先,我在整个列车集上创建了一个具有k=9个分量的GMM。我知道在一些论文中,作者为训练集中的每个标签创建了一个GMM。但我想处理来自所有类的数据。

GMModel = fitgmdist(trainset,k_component,'RegularizationValue',0.1,'Start','plus');

我的问题是,我想确认组件和标签之间的关系P(component|labels)。所以我写了一个代码如下,但不确定它是否正确,

idx_ex_of_c1 = find(trainset_label==1);
idx_ex_of_c2 = find(trainset_label==2);
idx_ex_of_c3 = find(trainset_label==3);
[~,~,post] = cluster(GMModel,trainset);
cita_c_k = zeros(3,k_component);
for id_k = 1:k_component
cita_c_k(1,id_k) = sum(post(idx_ex_of_c1,id_k))/numel(idx_ex_of_c1);
cita_c_k(2,id_k) = sum(post(idx_ex_of_c2,id_k))/numel(idx_ex_of_c2);
cita_c_k(3,id_k) = sum(post(idx_ex_of_c3,id_k))/numel(idx_ex_of_c3);
end

cita_c_k是用于存储关系的(3*9)矩阵。idx_ex_of_c1是示例的索引,其标签在列集中为"1"。

用于测试过程。我首先将GMModel应用于测试集

[P,~] = posterior(GMModel,testset); % P is a m*9 matrix 

然后,求和所有成分,

P_testset = P*cita_c_k';
[a,b] = max(P_testset,3);
imagesc(b);

结果还可以,但还不够好。有人能给我一些建议吗?

谢谢!

您可以采取以下步骤:

  1. 在训练中增加目标错误和/或使用最佳网络大小,但过度训练和网络大小增加通常对没有帮助

  2. 最重要的是,在训练时打乱训练数据,只使用标签的重要数据点进行训练(忽略可能属于多个标签的数据点)

可分离性

使用相关特性验证数据的可分性。

  1. 标签(X)中所有数据的相关性应较高(接近1)
  2. 标签(X)中的所有数据与标签(!=X)中数据的交叉相关性应较低(接近零)

如果你观察到标签中的数据点具有低相关性,而标签之间的数据点具有高相关性-这就给属性的选择带来了问题(可能有一些属性实际上无法使数据分离)。这样做如下:

  1. 将更多相关属性添加到数据点,并删除不太相关的属性(使用的技术是PCA)
  2. 使用数据点的导出参数,如最高频率分量等进行训练,而不是直接点
  3. 使用时间延迟网络来训练时间序列(始终)

最新更新