0

我目前正在阅读 Ethem Alpaydin 的“机器学习简介”,我遇到了最近的质心分类器并试图实现它。我想我已经正确实现了分类器,但我得到的准确率只有 68%。那么,最近的质心分类器本身效率低下还是我的实现中存在一些错误(如下)?

该数据集包含 1372 个数据点,每个数据点有 4 个特征,并且有 2 个输出类 My MATLAB implementation:

  DATA = load("-ascii", "data.txt");

#DATA is 1372x5 matrix with 762 data points of class 0 and 610 data points of class 1
#there are 4 features of each data point 
X = DATA(:,1:4); #matrix to store all features

X0 = DATA(1:762,1:4); #matrix to store the features of class 0
X1 = DATA(763:1372,1:4); #matrix to store the features of class 1
X0 = X0(1:610,:); #to make sure both datasets have same size for prior probability to be equal 
Y = DATA(:,5); # to store outputs

mean0 = sum(X0)/610; #mean of features of class 0 
mean1 = sum(X1)/610; #mean of featurs of class 1

count = 0;
for i = 1:1372 
   pre = 0;
  cost1 = X(i,:)*(mean0'); #calculates the dot product of dataset with mean of features of both classes
  cost2 = X(i,:)*(mean1');

  if (cost1<cost2)
    pre = 1;
  end
  if pre == Y(i)
    count = count+1; #counts the number of correctly predicted values
   end

end

disp("accuracy"); #calculates the accuracy 
disp((count/1372)*100);
4

1 回答 1

0

这里至少有几件事:

  1. 您正在使用点积来分配输入空间中的相似性,这几乎是无效的。使用点积的唯一原因是假设所有数据点都具有相同的范数,或者范数无关紧要(几乎从不正确)。尝试使用欧几里得距离,即使它非常幼稚 - 它应该会好得多

  2. 它是一个低效的分类器吗?取决于效率的定义。这是一种非常简单和快速的方法,但就预测能力而言,它是非常糟糕的。事实上,它比已经被认为是“玩具模型”的朴素贝叶斯还要糟糕。

  3. 代码也有问题

    X0 = DATA(1:762,1:4); #matrix to store the features of class 0
    X1 = DATA(763:1372,1:4); #matrix to store the features of class 1
    X0 = X0(1:610,:); #to make sure both datasets have same size for prior probability to be equal 
    

    一旦对 X0 进行子采样,您就有 1220 个训练样本,但稍后在“测试”期间,您会同时测试训练和“X0 的缺失元素”,从概率的角度来看,这实际上没有意义。首先,您永远不应该测试训练集的准确性(因为它高估了真实准确性),其次,通过对您的训练数据进行二次抽样,您并没有均衡先验。不是在这样的方法中,您只是在降低质心估计的质量,仅此而已。这些技术(子/过采样)均衡了执行模型先验的模型的先验。您的方法没有(因为它基本上是假设先验为 1/2 的生成模型),因此不会发生任何好事。

于 2017-04-23T12:57:13.977 回答