Matlab 为什么神经网络的精确度很差?

Matlab 为什么神经网络的精确度很差?,matlab,machine-learning,neural-network,classification,deep-learning,Matlab,Machine Learning,Neural Network,Classification,Deep Learning,我有一个包含43个示例(数据点)和70'000个特征的数据集,这意味着我的数据集矩阵是(43 x 70'000)。标签包含4个不同的值(1-4),即有4个类 现在,我已经用深度信念网络/神经网络进行了分类,但我只得到了25%左右的准确率(机会水平),而不需要交叉验证。如果我使用kNN、SVM等,我将获得>80%的准确率 我使用了用于Matlab()的DeepLearnToolbox,并且刚刚改编了工具箱自述文件中的DeepFaith网络示例。我尝试了不同数量的隐藏层(1-3)和不同数量的隐藏节点

我有一个包含43个示例(数据点)和70'000个特征的数据集,这意味着我的数据集矩阵是(43 x 70'000)。标签包含4个不同的值(1-4),即有4个类

现在,我已经用深度信念网络/神经网络进行了分类,但我只得到了25%左右的准确率(机会水平),而不需要交叉验证。如果我使用kNN、SVM等,我将获得>80%的准确率

我使用了用于Matlab()的DeepLearnToolbox,并且刚刚改编了工具箱自述文件中的DeepFaith网络示例。我尝试了不同数量的隐藏层(1-3)和不同数量的隐藏节点(100500,…),以及不同的学习率、动量等,但精确度仍然很差。特征向量被缩放到范围[0,1],因为这是工具箱所需要的

我详细地完成了以下代码(仅显示了一次交叉验证):

特征向量是(43 x 70'000)矩阵,其值缩放为[0,1]


有人能推断出为什么我的准确率这么差吗?

因为数据集中的特征比示例多得多。换句话说:你有大量的权重,你需要估计所有的权重,但你不能,因为如此庞大的结构的NN无法在如此小的数据集上很好地推广,你需要更多的数据来学习如此大量的隐藏权重(事实上,NN可能会记住你的训练集,但不能推断它是测试集的“知识”)。同时,使用SVM和kNN等简单方法80%的准确率表明,您可以使用更简单的规则来描述数据,因为例如SVM将只有70k权重(而不是NN中的70k第一层大小+第一层大小+第二层大小+…),kNN将根本不使用权重


复杂模型并不是万能的,您尝试拟合的模型越复杂,您需要的数据就越多。

因为数据集中的特性比示例多得多。换句话说:你有大量的权重,你需要估计所有的权重,但你不能,因为如此庞大的结构的NN无法在如此小的数据集上很好地推广,你需要更多的数据来学习如此大量的隐藏权重(事实上,NN可能会记住你的训练集,但不能推断它是测试集的“知识”)。同时,使用SVM和kNN等简单方法80%的准确率表明,您可以使用更简单的规则来描述数据,因为例如SVM将只有70k权重(而不是NN中的70k第一层大小+第一层大小+第二层大小+…),kNN将根本不使用权重


复杂模型并不是万能的,您尝试拟合的模型越复杂,您需要的数据就越多。

因为数据集中的特性比示例多得多。换句话说:你有大量的权重,你需要估计所有的权重,但你不能,因为如此庞大的结构的NN无法在如此小的数据集上很好地推广,你需要更多的数据来学习如此大量的隐藏权重(事实上,NN可能会记住你的训练集,但不能推断它是测试集的“知识”)。同时,使用SVM和kNN等简单方法80%的准确率表明,您可以使用更简单的规则来描述数据,因为例如SVM将只有70k权重(而不是NN中的70k第一层大小+第一层大小+第二层大小+…),kNN将根本不使用权重


复杂模型并不是万能的,您尝试拟合的模型越复杂,您需要的数据就越多。

因为数据集中的特性比示例多得多。换句话说:你有大量的权重,你需要估计所有的权重,但你不能,因为如此庞大的结构的NN无法在如此小的数据集上很好地推广,你需要更多的数据来学习如此大量的隐藏权重(事实上,NN可能会记住你的训练集,但不能推断它是测试集的“知识”)。同时,使用SVM和kNN等简单方法80%的准确率表明,您可以使用更简单的规则来描述数据,因为例如SVM将只有70k权重(而不是NN中的70k第一层大小+第一层大小+第二层大小+…),kNN将根本不使用权重


复杂的模型并不是万能的,你想要适应的模型越复杂,你需要的数据就越多。

很明显,你的数据集比你网络的复杂度还小

神经网络的复杂性可以用数字来表示 参数的选择。在深层神经网络的情况下,这个数字可以是 数以百万计,数千万计,在某些情况下甚至 数亿。既然你愿意,我们就叫这个号码P 确信模型具有推广能力,这是一个很好的经验法则 数据点的数量至少为P*P

虽然KNN和SVM更简单,但它们不需要那么多数据。
因此,它们可以更好地工作。

很明显,您的数据集比网络的复杂度小

神经网络的复杂性可以用数字来表示 参数的选择。在深层神经网络的情况下,这个数字可以是 数以百万计,数千万计,在某些情况下甚至 数亿。既然你愿意,我们就叫这个号码P 确信模型具有推广能力,这是一个很好的经验法则 数据点的数量至少为P*P

虽然KNN和SVM更简单,但它们不需要那么多数据。
因此,它们可以更好地工作。

很明显,您的数据集比网络的复杂度小

神经网络的复杂性可以用数字来表示 参数的选择。在深层神经网络的情况下,这个数字可以是 数以百万计,数千万计,在某些情况下甚至 数亿。既然你愿意,我们就叫这个号码P 对模型的推广能力有信心
% Indices of training and test set
train = training(c,m);
test = ~train;

% Train DBN
opts = [];
dbn = [];
dbn.sizes = [500 500 500];
opts.numepochs =   50;
opts.batchsize = 1;
opts.momentum  = 0.001;
opts.alpha     =   0.15;
dbn = dbnsetup(dbn, feature_vectors_std(train,:), opts);
dbn = dbntrain(dbn, feature_vectors_std(train,:), opts);

%unfold dbn to nn
nn = dbnunfoldtonn(dbn, 4);
nn.activation_function = 'sigm';
nn.learningRate = 0.15;
nn.momentum = 0.001;

%train nn
opts.numepochs =  50;
opts.batchsize = 1;
train_labels = labels(train);
nClass = length(unique(train_labels));
L = zeros(length(train_labels),nClass);
for i = 1:nClass
L(train_labels == i,i) = 1;
end

nn = nntrain(nn, feature_vectors_std(train,:), L, opts);
class = nnpredict(nn, feature_vectors_std(test,:));