0

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

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

首先,我在整个训练集上创建了一个包含 k=9 个组件的 GMM。我知道在一些论文中,作者为 trainset 中的每个标签创建了一个 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);

结果还可以,但还不够好。谁能给我一些提示?

谢谢!

4

1 回答 1

0

您可以采取以下步骤:

  1. 增加目标误差和/或在训练中使用最佳网络大小,但过度训练和网络大小增加通常无济于事

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

可分离性

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

  1. 标签 (X) 中所有数据的相关性应该很高(接近一)
  2. 标签 (X) 中的所有数据与标签 (!=X) 中的数据的互相关应该很低(接近于零)。

如果您观察到标签中的数据点具有低相关性并且跨标签的数据点具有高相关性- 它对属性的选择提出了一个问题(可能存在实际上不会使数据可分离的属性)。这样做如下:

  1. 向数据点添加更多相关属性并删除不太相关的属性(使用此技术的技术是 PCA
  2. 使用来自数据点的派生参数(如最高频率分量等)来训练而不是直接点
  3. 使用时间延迟网络来训练时间序列(总是)
于 2017-03-05T08:04:06.823 回答