我正在阅读"机器学习简介"由Ethem Alpaydin和我来到最近的质心分类器并试图实现它。我想我已经正确实现了分类器,但我的准确率只有68%。那么,最接近的质心分类器本身效率低下还是我的实现中存在一些错误(如下)?
数据集包含1372个数据点,每个数据点有4个特征,有2个输出类 我的MATLAB实现:
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);
答案 0 :(得分:0)
这里至少有一些事情:
您正在使用点积来指定输入空间中的相似度,这几乎永远不会有效。使用点积的唯一原因是假设所有数据点具有相同的范数,或者规范无关紧要(几乎从不为真)。尝试使用欧几里德距离,即使它非常幼稚 - 它应该明显更好
是效率低下的分类器吗?取决于效率的定义。这是一个非常简单和快速的,但就预测能力来说,它非常糟糕。事实上,它比Naive Bayes更糟糕,Naive Bayes已经被认为是“玩具模型”。
代码也有问题
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的生成模型),所以没有任何好处可以发生。