MATLAB中文论坛

标题: 朴素贝叶斯fitcnb对应的属性posterior是不是不存在了 [打印本页]

作者: yangfan123456    时间: 2021-1-5 21:36
标题: 朴素贝叶斯fitcnb对应的属性posterior是不是不存在了
  1. %% 利用K-NN算法进行计算
  2. clc,clear all,close all
  3. load bank.mat
  4. names=bank.Properties.VariableNames;
  5. category=varfun(@iscellstr,bank,'Output','uniform');
  6. for i=find(category)
  7. bank.(names{i})=categorical(bank.(names{i}));
  8. end
  9. %跟踪分类变量
  10. catPred=category(1:end-1);
  11. %设置默认随机数生成方式,确保该脚本中的结果是可以重现的.
  12. rng('default');
  13. %数据探索——数据可视化
  14. figure(1)
  15. gscatter(bank.balance,bank.duration,bank.y,'kk','xo');
  16. xlabel('年平均余额/万元','fontsize',12)
  17. ylabel('上次接触时间/秒','fontsize',12)
  18. title('数据可视化效果图','fontsize',12)
  19. set(gca,'linewidth',2);
  20. %设置响应变量与预测变量
  21. X=table2array(varfun(@double,bank(:,1:end-1)));%预测变量
  22. Y=bank.y;%相应变量
  23. disp('数据中YES & NO的统计结果:')
  24. tabulate(Y)
  25. %将分类数组进一步转换成二进制数组,以便某些算法对分类变量的处理
  26. XNum=[X(:,~catPred) dummyvar(X(:,catPred))];
  27. YNum=double(Y)-1;

  28. cv=cvpartition(height(bank),'holdout',0.40);
  29. %设置交叉验证方式
  30. %随机选择40%的样本作为测试样本
  31. Xtrain=X(training(cv),:);
  32. Ytrain=Y(training(cv),:);
  33. XtrainNum=XNum(training(cv),:);
  34. YtrainNum=YNum(training(cv),:);
  35. Xtest=X(test(cv),:);
  36. Ytest=Y(test(cv),:);
  37. XtestNum=XNum(test(cv),:);
  38. YtestNum=YNum(test(cv),:);

  39. disp('训练集');
  40. tabulate(Ytrain);
  41. disp('测试集');
  42. tabulate(Ytest);
  43. %
  44. % knn=ClassificationKNN.fit(Xtrain,Ytrain,'Distance','seuclidean',...
  45. % 'NumNeighbors',5);
  46. % %进行预测
  47. % [Y_knn,Yscore_knn]=knn.predict(Xtest);
  48. % Yscore_knn=Yscore_knn(:,2);
  49. % %计算混淆矩阵
  50. % disp('最近邻方法分类结果:')
  51. % C_knn=confusionmat(Ytest,Y_knn)

  52. dist = repmat({'normal'},1,width(bank)-1);
  53. dist(catPred)={'mvmn'};
  54. %训练分类器
  55. Nb = fitcnb(Xtrain, Ytrain, 'Distribution', dist);
  56. % 进行预测
  57. Y_Nb = Nb.predict(Xtest);
  58. Yscore_Nb = Nb.Prior(Xtest);
  59. Yscore_Nb = Yscore_Nb(:,2);
  60. %计算混淆矩阵
  61. disp('贝叶斯方法分类结果:');
  62. C_nb = confusionmat(Ytest, Y_Nb)




复制代码
报错内容
  1. <blockquote>警告: 您为至少一个未出现在 'CategoricalPredictors' 列表中的预测变量指定了 'mvmn' 分布。'CategoricalPredictors' 将更新,以包括所有 'mvmn' 预测变量。
复制代码
后面把代码中的Nb.posterior改成了最可能的Nb.prior
但还是报错
报错内容为
  1. 警告: 您为至少一个未出现在 'CategoricalPredictors' 列表中的预测变量指定了 'mvmn' 分布。'CategoricalPredictors' 将更新,以包括所有 'mvmn' 预测变量。
  2. > In ClassificationNaiveBayes (line 85)
  3.   In classreg.learning/FitTemplate/fit (line 263)
  4.   In ClassificationNaiveBayes.fit (line 132)
  5.   In fitcnb (line 251)
  6. 数组索引必须为正整数或逻辑值。

  7. 出错 classreg.learning.internal.DisallowVectorOps/subsref (line 22)
  8.                 [varargout{1:nargout}] = builtin('subsref',this,s);
复制代码


请问问题处在了哪里?我是参考书上的。没有拼写错误,觉得很可能是新旧版本不同导致的错误。






欢迎光临 MATLAB中文论坛 (https://www.ilovematlab.cn/) Powered by Discuz! X3.4