ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Matlab模式识别全流程源码实战:从KNN到SVM的分类算法实现与评估

Matlab模式识别全流程源码实战:从KNN到SVM的分类算法实现与评估 在模式识别课程和实际工程项目里Matlab 一直是很多人首选的实验平台。无论是学校里的《模式识别与机器学习》作业还是工作中需要快速验证一个分类方案Matlab 的矩阵运算、自带工具箱和可视化能力都能帮上大忙。不过多数人遇到的问题不是“不知道算法原理”而是“原理看得懂、代码写不顺”——网上零散的源码要么只有单算法要么没有完整的训练评估流程拿来跑通容易想改造成自己的数据就抓瞎了。这篇东西我就把自己整理和实战过的一套模式识别 Matlab 源码方案完整拆一遍从环境准备、目录结构、核心算法实现到交叉验证、调参和排错全部按可直接复用的标准来写适合正在做课程设计、准备竞赛或者刚接触模式识别的工程师参考。1. 项目概述与整体设计思路1.1 这套源码解决什么问题先说清楚这套代码的定位它不是某个单一算法的 demo而是一套“从数据到评估”的完整流程。你拿到的是一堆原始特征和标签经过这套流程后能得到分类准确率、混淆矩阵、ROC 曲线、决策边界图以及每个算法的超参数调优建议。换句话说它是一个模式识别实验的基础框架KNN、贝叶斯、LDA、BP 神经网络、SVM、K-means 这些经典算法都内置了可直接调用的函数你只需要把数据换成自己的改几个参数就能跑。我在给研究生带实验课的时候经常发现一个现象很多同学用 Matlab 自带的fitcknn、fitcsvm这类一行式函数代码确实很短但不知道内部发生了什么改参数全靠猜。而另一些同学手写算法却又写得漏洞百出比如距离矩阵算错维度、协方差矩阵奇异没处理、标签乱序对齐错误。这套源码的定位就是夹在两者之间——既能让你看清核心算法的数学实现又提供工程化的封装保证在真实数据上稳定运行。1.2 为什么用 Matlab 而不是 Python这个问题几乎每次分享都会被问到。我的回答很直接如果你做的是深度学习、大规模文本处理那 Python 生态更好但如果你是在做模式识别课程实验、算法验证、特征提取实验Matlab 的效率优势非常明显。首先是矩阵操作是原生语法写dist sqrt(sum((X - x).^2, 2))这种距离计算几乎是零成本。其次是可视化密度高画散点图、决策边界、ROC 曲线都只要几行不需要像 matplotlib 那样调一堆样式。第三是调试方便工作区里双击变量就能看数据断点打上之后逐行看的体验比命令行友好太多。当然Python 在工业部署上有优势但这不影响我们用 Matlab 做算法验证。我的习惯是Matlab 里验证想法、画图、写报告定稿之后再翻译成 Python 或者 C 做上线。这也是很多研究所和高校实验室的通用工作流。1.3 整体目录结构与代码组织一套好的源码架子最重要的是“分层清晰”。我把整个项目拆成五个文件夹加一个主脚本入口目录/文件作用main.m主入口脚本控制整个流程加载数据、划分训练测试、调用算法、评估data/存放原始数据集支持 CSV、Mat 格式或者直接加载 Matlab 自带的fisheriris、digitsfeatures/特征提取和预处理脚本包含归一化、PCA 降维、数据划分函数algorithms/各分类器实现每个算法一个函数文件输入输出格式统一evaluate/评估工具包括混淆矩阵绘制、分类报告、ROC 曲线、交叉验证utils/小工具函数比如数据打乱、颜色生成、图像显示辅助这个组织方式的好处是你要换数据集只改main.m里的数据加载部分你要加算法只往algorithms/里丢一个新函数接口保持一致就行。我做项目一直遵循这个原则——把流程和算法解耦这样后续维护和扩展的成本会低很多。1.4 算法选型地图什么场景用什么算法模式识别课程里算法很多但不是每个都要从零手写。我做了一张选型表也是这套源码内置算法的选择逻辑算法适用场景特点源码文件KNN小样本、低维、类别边界复杂无训练过程预测时计算量大knn_classifier.m贝叶斯分类器特征基本符合高斯分布、各类别协方差可估计可解释性强需要估计先验和似然bayes_classifier.mLDA线性可分、需要降维可视化同时做降维和分类Fisher准则lda_classifier.mBP神经网络非线性关系、样本量充足训练慢需要调参拟合能力强bp_classifier.mSVM中高维、小样本、需要强泛化核函数选择关键Matlab有封装svm_classifier.mK-means无监督、聚类探索需指定簇数对初始化敏感kmeans_clustering.m在实际项目中我通常会先跑 KNN 和 LDA 做一个 baseline如果准确率已经够了就不再上复杂模型。这能省大量调参时间也能避免过拟合。这套源码的顺序也是这样安排的方便你做对比实验。2. 环境准备与数据工程2.1 Matlab 版本与工具箱选择我用的版本是 R2023a但整套源码向后兼容到 R2016b 问题不大关键是要保证几个基础工具箱已经安装Statistics and Machine Learning Toolbox必须很多评估函数依赖它、Neural Network Toolbox跑 BP 时需要新版本叫Deep Learning Toolbox、Image Processing Toolbox如果涉及图像特征提取。你可以用ver命令快速查看已经装了哪些工具箱缺哪个就补装哪个。这里有一个很多人踩过的坑Matlab 新版默认中文界面有时候代码注释里的中文会显示成乱码。解决方法是到“预设”里把语言改成 English推荐或者确保文件编码保存为 UTF-8。我的建议是源码注释尽量用英文或者简洁拼音不是崇洋媚外而是避免编码问题影响跨机器协作尤其是你从别人那里拷贝代码的时候乱码注释会非常头疼。2.2 准备数据集从 UCI 下载到 Matlab 自带数据这套源码支持三类数据来源初期调试我强烈建议先用 Matlab 自带的fisheriris鸢尾花数据集跑通全流程因为这个数据不需要任何预处理加载后就是 150x4 的特征矩阵加 150x1 的标签向量非常适合测试代码逻辑。如果你想用更真实、更有挑战性的数据UCI Machine Learning Repository 有很多经典数据集比如鸢尾花、葡萄酒、乳腺癌、手写数字等。下载下来的大多是.data或.csv格式用readmatrix读取就行。需要注意几点最后一列常是标签要确认标签是数值型还是字符串型数据里可能有缺失值用ismissing检查然后用rmmissing删除或fillmissing填充类别标签如果是字符串要先用grp2idx转成数值编号。我自己还整理过一个小的辅助函数load_dataset.m统一数据加载的接口——输入文件名和标签位置输出归一化的特征矩阵和数值标签向量。这样后续切换数据集时主脚本几乎不用改。2.3 特征归一化与数据划分的细节很多刚做模式识别的同学容易忽略归一化直接拿原始特征丢进分类器。这在小数据集上往往也能跑出结果但会带来两个问题一是特征量纲差异大的时候距离类算法KNN、K-means会被量大纲的特征主导二是某些优化算法收敛变慢。我的建议是计算距离的算法必须归一化树模型不必须SVM 和神经网络强烈建议归一化。归一化方法常用的有两种mapminmax线性映射到 [0,1] 区间和zscore标准化为零均值单位方差。在源码里我用的是zscore因为它对离群点的鲁棒性略好一点。有一个特别重要的细节归一化参数只能在训练集上拟合然后用同样的参数去变换测试集不能在划分数据集之前对整个数据做归一化。否则测试集的信息泄漏到了训练过程评估指标会偏乐观。这在学术上是会被审稿人怼的问题在工程上会让模型上线后表现大跌眼镜。数据划分我用的是cvpartition函数它可以做简单的随机划分也可以做 K 折交叉验证的划分。例如cv cvpartition(label, HoldOut, 0.3)表示留出 30% 作为测试集并且它会自动按类别比例分层抽样保证训练集和测试集里各类别比例接近原始分布。分层这个细节非常重要——如果不分层极端情况下测试集可能某些类一个样本都没有那准确率就直接失真了。2.4 跑通第一个 Demo鸢尾花三分类我建议你拿到源码后第一步不是改代码而是原封不动运行一次。在main.m中默认加载fisheriris选择 KNN 分类器运行后你会看到终端打印的训练集准确率、测试集准确率、各类别的精确率和召回率以及弹出一张混淆矩阵热力图。第一次跑通这个流程你就理解了整条链路数据加载 → 划分 → 归一化 → 训练模型 → 测试评估 → 可视化。然后再开始替换数据、切换算法、调整参数。这种“先纵向跑通再横向扩展”的方式学任何代码框架都是最高效的。3. 核心算法源码拆解与实现3.1 KNN分类器从距离计算到投票决策KNN 是模式识别里最直观的算法也是这套源码里最简单的一个模块。核心思想就一句话“一个样本的类别由它最近的 K 个邻居投票决定。”源码实现我写成了函数predict knn_classifier(train_X, train_y, test_X, K)里面做了三件事首先计算测试样本到所有训练样本的欧氏距离Matlab 里可以直接用pdist2(train_X, test_X)也可以用循环加sqrt(sum((train_X - x).^2, 2))。数据量小的时候两种方式差别不大我更推荐pdist2因为它是 C 实现的速度快且代码简洁。然后对每个测试样本把距离从小到大排序取前 K 个邻居的标签。用sort函数可以得到排序后的距离和对应的索引索引是关键的——因为我们要的是“哪些训练样本离它最近”而不是仅仅知道距离值。最后对这 K 个标签做投票。Matlab 里可以用mode函数直接取众数也可以用accumarray统计次数再找最大。需要注意 K 的取值K 太小容易过拟合K 太大又会让分类边界过于平滑。经验上 K 通常取奇数避免平票然后用交叉验证来选。写代码时最容易踩的一个坑是距离计算完之后忘记取索引直接把排序距离当成索引用了结果标签全乱了。这种 bug 特别隐蔽因为运行不报错就是准确率低得离谱。调试方法很粗暴随机挑几个测试样本手动算距离核对邻居是不是同一个。3.2 贝叶斯分类器高斯判别分析实现贝叶斯分类器的理论基础是贝叶斯定理后验概率正比于先验概率乘以似然。假设每一类的特征服从多元高斯分布那就得到高斯判别分析GDA。这套源码里的bayes_classifier.m完整实现了这个逻辑。实现分三步第一步估计先验概率就是每类样本数除以总样本数第二步对每一类估计均值向量和协方差矩阵用mean和cov函数第三步对每个测试样本用mvnpdf计算它在各类高斯分布下的概率密度乘上先验概率取最大者作为预测类别。这里有几个工程细节需要注意。第一协方差矩阵必须是非奇异的才能计算概率密度。当特征维度高于该类的样本数时协方差矩阵必然奇异解决办法是加一个小的正则项cov_matrix epsilon * eye(D)其中 epsilon 取一个很小的值比如 1e-6这相当于给高斯分布加了一点噪声方差数值上更稳定。第二mvnpdf返回的是概率密度值不是概率密度值可以大于 1但我们的目标只是最大化后验所以不影响决策。第三如果特征之间有很强的相关性协方差矩阵会接近奇异这时候可以考虑先用 PCA 降维去相关。贝叶斯分类器的优势是可解释性你能直接看到每类的均值向量和协方差矩阵知道分类器为什么这么决策。我在实际项目中经常用它做 baseline——虽然准确率不一定最高但它能告诉你数据的基本分布形态。3.3 LDA线性判别分析Fisher准则与降维分类线性判别分析和贝叶斯分类器有数学上的联系但它的出发点是寻找一个投影方向使得类间散度最大、类内散度最小。lda_classifier.m的实现我分成了两个层次一个是降维投影的版本一个是直接分类的版本。如果你只是想用 LDA 做二分类本质是找一个权重向量 w然后对每个样本计算投影值 y w^T * x再用一个阈值 t 判断类别。w 的计算公式是w S_w^(-1) * (mu_1 - mu_2)其中 S_w 是类内散度矩阵mu_1 和 mu_2 是两类的均值向量。这个公式在源码里只有几行但背后的 Fisher 准则值得理解——它保证投影后两类均值差尽量大同时每类内部的方差尽量小。多分类的情况稍微复杂可以扩展到多类 Fisher 判别或者做“一对多”的 LDA 组合。在 Matlab 里有一个取巧的方法用fitcdiscr函数做判别分析分类自带正则化选项但我源码里还是保留了手写版本的 LDA因为它能输出投影矩阵方便你可视化降维后的数据分布。一个常见的误区是把 LDA 当 PCA 用。两者虽然都做降维但 PCA 是无监督的只找方差最大的方向不看类别标签LDA 是有监督的利用标签信息找判别力最强的方向。在分类问题上LDA 的降维效果通常优于 PCA但它对每个类别样本数有要求样本太少的类会导致 S_w 估计不准。3.4 BP神经网络分类器从手工实现到工具箱封装BP 神经网络这套源码我给了两个版本。第一个是完全手写的bp_classifier.m包含前向传播、反向传播、梯度下降三个核心部分适合理解神经网络的本质第二个是封装了 Matlab 神经网络工具箱的bp_classifier_fast.m适合实际使用。因为手写版的代码量比较大我建议初学阶段主要读实战阶段直接用第二个。手写版的核心结构是输入层 - 隐藏层(激活函数用 sigmoid 或 tanh) - 输出层(softmax 或 sigmoid)。前向传播就是逐层做线性变换加激活函数反向传播则是从损失函数开始逐层求梯度然后更新权重。损失函数我用的是交叉熵因为分类任务比均方误差收敛更快。权重初始化用随机小数不能全零初始化否则每一层的神经元会学习到完全相同的特征这就是对称性问题。工具箱版本则简洁得多net feedforwardnet(10)创建一个单隐藏层 10 个神经元的网络net train(net, train_X, train_y_onehot)做训练pred net(test_X)得到输出。注意工具箱的输入输出默认是“样本在列”的格式跟普通矩阵格式相反这是最容易报错的地方。还要注意分类标签要先转成 one-hot 编码比如三类就是 [1 0 0] / [0 1 0] / [0 0 1]训练完成后再把网络输出转回标签形式。BP 网络最大的坑是过拟合。样本量不够大的时候使劲训练容易把训练集准确率跑到 100%但测试集反而下降。解决办法是早停用一部分训练数据做验证集验证集准确率连续多次不提升就停止训练。工具箱的train函数默认会划分验证集并做早停手写版本里我也加了简单实现。3.5 SVM多分类核函数选择与封装调用SVM 在 Matlab 里的封装已经很成熟fitcsvm是二分类的多分类需要用fitcecoc把它包装成“一对一”或“一对多”的组合策略。源码里svm_classifier.m默认用fitcecoc加 RBF 高斯核这是我在实际项目里最常用的组合因为它能处理非线性边界且参数调节相对容易。SVM 的关键超参数有两个一个是盒子约束 C控制对误分类样本的惩罚力度C 越大越容易过拟合另一个是 RBF 核的尺度参数 γ在 Matlab 里叫KernelScale控制高斯核的宽度γ 越大决策边界越复杂。这两个参数用默认值往往不够好需要调参。调参方法源码里提供两种手动的网格搜索和自动优化。网格搜索就是遍历一组 C 和 KernelScale 的组合用交叉验证评估每组参数的表现选最优。Matlab 的fitcecoc支持OptimizeHyperparameters参数自动调参但速度慢数据量稍大就很耗时。我个人的建议是先用t templateSVM(KernelFunction, rbf, KernelScale, auto)快速跑一版看看准确率大概在什么水平再决定要不要精细调参。SVM 对特征缩放非常敏感这一点在源码里我特意做了强提示归一化做不好SVM 的准确率会大幅波动。原因很好理解RBF 核计算的是样本之间的欧氏距离或某种内积如果特征量纲不一致距离会被大数值特征支配小数值特征的信息就丢了。3.6 无监督聚类K-means 与 PCA 可视化模式识别课程里无监督学习也是重头戏K-means 和 PCA 往往是配套使用的。kmeans_clustering.m里我手写了一个标准的 K-means随机初始化簇中心迭代执行“分配样本到最近中心 - 重新计算每个簇的中心”直到中心不再变化或达到最大迭代次数。手写 K-means 有个细节初始化的随机性会导致聚类结果不稳定。解决办法是用 K-means 初始化策略它让初始中心尽可能分散能显著提高聚类质量和稳定性。Matlab 自带的kmeans函数默认已经是 K-means但如果手写版本建议实现这个策略代码量也不大。PCA 部分我写了两种实现方式基于特征值分解的eig和基于奇异值分解的svd。对于高维数据建议直接对协方差矩阵做特征值分解取出最大的 k 个特征值对应的特征向量作为投影矩阵。PCA 的一个关键步骤是居中——先把每列特征减去均值再做协方差矩阵计算否则第一主成分会被数据的均值主导而不是方差主导。聚类和 PCA 搭配使用的场景很多最典型的是对高维数据先 PCA 降到二维或三维然后可视化散点图肉眼观察是否存在自然的簇结构再决定用无监督还是有监督方法。我在特征工程里也经常这样用快速发现异常点和离群簇比直接训练分类器效率高很多。4. 训练评估、交叉验证与调参实战4.1 不只准确率混淆矩阵与分类报告很多初学者评价分类器只看一个准确率这在类别平衡的数据集上够了但类别不平衡时就会严重误导。比如 95% 的样本是 A 类你全部预测成 A 类准确率也有 95%但这个分类器没有任何实用价值。所以评估部分我做了完整的分类报告包括每类精确率、召回率和 F1-score。精确率是“预测为该类的样本中有多少是真的该类”召回率是“该类真实样本中有多少被找出来了”。这两个指标在医学诊断、故障检测、欺诈识别里非常关键。源码里的evaluate_classifier.m函数会输出一个表格每一行是一个类别列出精确率、召回率、F1-score 和样本数。同时绘制混淆矩阵热力图对角线越亮代表分类效果越好非对角线上的密集亮块则提示哪些类别容易互相混淆——这对改进方向很有参考价值。4.2 交叉验证的正确姿势交叉验证是评估模型泛化能力最常用的方法源码内置了 K 折交叉验证的完整实现。K 的典型取值为 5 或 10意思是把训练数据随机分成 K 份每次用 K-1 份训练、留 1 份验证轮流做 K 次最终把 K 次的评估结果平均。这样做的好处是每个样本都被当作过验证样本评估结果比单次划分更稳定可靠。这里有一个很关键却很隐蔽的坑交叉验证必须放在整个预处理流程的外面。也就是说每一折训练里都要单独做归一化而不能先对整个训练集归一化再交叉验证。否则信息泄漏的问题依然存在。折叠中的验证数据相当于“未来遇到的新数据”它不能参与训练集归一化参数的估计。Matlab 里cvpartition可以直接配合循环实现手动 K 折也可以直接用crossval函数。源码里我包装了一个run_cross_validation.m输入算法名称、数据和折数返回每一折的准确率列表和平均准确率方便你对比不同算法的稳定性。4.3 超参数调优的实用思路调参是模式识别里最耗时但也最影响结果的部分。以 KNN 为例K 的取值可以用交叉验证画出一条“K 值与准确率”的曲线K 从 1 到 20每取一个值跑一次交叉验证画出曲线后会看到一个先上升后平稳或下降的趋势峰值对应的 K 就是较优值。这个方法在源码里用tune_knn.m实现跑完直接出图。BP 神经网络的调参维度更多隐藏层节点数、学习率、迭代次数、批量大小。我的经验是先用默认参数跑通然后从隐藏层节点数开始调因为这个对模型容量影响最大。隐藏层节点太多容易过拟合太少欠拟合。一种快速试探法是 2 的幂次4、8、16、32逐一对比验证集准确率。SVM 的调参我前文提过重点是用网格搜索 C 和 KernelScale。一个可复用的技巧是先在 log 尺度上粗搜比如 C [0.01, 0.1, 1, 10, 100]KernelScale [0.01, 0.1, 1, 10]找到大致的优良区域后再在这个区域里细搜。这样比全空间暴力搜索高效得多。4.4 可视化决策边界与学习曲线好的可视化能极大帮助你理解分类器在做什么。源码里plot_decision_boundary.m可以画出二维特征空间里的决策边界不同颜色区域代表分类器判定的类别区域叠加的散点是真实样本。画图的原理很简单在特征取值范围内生成一个密集的网格把每个网格点喂给分类器得到预测类别然后用contourf填充颜色即可。决策边界图能直观地暴露很多问题比如线性分类器在非线性可分数据上会留下大片误分类区KNN 的边界会呈现不规则的锯齿状SVM 的 RBF 核边界则相对平滑。调整参数后边界如何变化比单看准确率数字更有说服力。学习曲线是评估模型“欠拟合还是过拟合”的利器。横轴是训练样本数量纵轴是准确率同时画出训练集准确率和验证集准确率两条曲线。如果训练集曲线高而验证集曲线低且两者差距很大说明过拟合如果两者都低说明欠拟合模型容量不够或特征质量差。源码里的plot_learning_curve.m实现了这个过程建议换到新数据集时先跑这个能快速判断出下一步应该加数据、加特征还是换算法。5. 常见报错与调试技巧实录5.1 高频报错速查表这一节是我在调试这套源码和帮学生调代码时遇到最频繁的问题整理成了速查表基本覆盖了跑模式识别 Matlab 代码 90% 以上的报错场景。报错信息原因解决方案Matrix dimensions must agree矩阵维度不匹配通常是训练数据和测试数据列数不一致检查size(X_train)和size(X_test)确认特征列数相同Index exceeds array bounds索引超出数组范围通常是标签编号从 0 开始而 Matlab 从 1 开始标签转索引后 1或用grp2idx转换Covariance matrix must be positive definite协方差矩阵奇异特征维度高于样本数或特征高度相关加正则项 epsilon * eye(D)或先 PCA 降维The number of observations must be greater than the number of predictors样本数少于特征数常见于 LDA 和贝叶斯用 PCA 降维或增加样本量Invalid training data: Y must be a vector标签格式不对可能是行向量/列向量混淆或包含 NaN使用Y Y(:)转成列向量并检查ismissingConvergence failed神经网络或迭代算法不收敛减小学习率、增加迭代次数、标准化输入数据、换权重初始化中文注释乱码文件编码不是 UTF-8或系统语言不匹配统一保存为 UTF-8 编码或把 Matlab 预设语言改为 English5.2 调试技巧从“报错”到“修好”的思考路径遇到报错不要急着百度先按三步走。第一步读报错信息里的代码位置Matlab 会标出具体是哪一行第二步检查这一行用到的每个变量的size和class这是 90% 问题的根源第三步如果不是维度问题就把这一行拆成多步执行在命令行逐步看中间结果。举一个真实的例子有一次我跑手写 KNN报错Index exceeds array bounds定位发现是[sorted_dist, idx] sort(dist)后我误用了sorted_dist(1:K)去索引训练标签应该用idx(1:K)。这种逻辑错误在编译型语言里不会报错但结果全错在 Matlab 里也是只有跑评估阶段才发现准确率不对。所以我的调试经验是先在小规模数据上打印中间结果验证正确性再放到大数据上跑。5.3 数据泄漏与不公平对比的三大雷区这一节是我最想强调的因为即使代码不报错如果踩了数据泄漏的坑最终实验结论可能是错的。第一个雷区是在划分数据集前做了归一化或 PCA。整个数据集的信息被用于构造预处理参数导致测试集的信息提前“被模型感受”到了评估结果虚高。第二个雷区是调参时用了测试集。很多同学反复用同一份测试集评估并调整参数本质上测试集变成了训练集的一部分最终报告的数字没有说服力。正确做法是把数据分成训练集、验证集、测试集三份参数调优只对着验证集做测试集只在最终评估时用一次。第三个雷区是不同算法之间的对比不公平。比如 KNN 归一化了而 SVM 没归一化比如某个算法调了一堆参数而另一个算法用的默认值。要得出可靠结论必须在同样的数据划分和预处理流程下评估每个算法并且给每个算法都能调到合理水平的时间。5.4 源码扩展如何替换成自己的数据集最后说一下怎么把源码用在自己的数据上这是实操阶段最常问的问题。假设你的数据是一个 Excel 文件前五列是特征最后一列是类别标签那么只需要在load_dataset.m里用readmatrix读取然后做简单处理X data(:, 1:end-1); label_raw data(:, end);再用grp2idx把标签转成数值编号即可。如果数据是图像你需要先把图像转换成特征向量。最简单的入门做法是把每张图缩放成固定尺寸比如 32x32然后展开成 1024 维向量再用 PCA 降维。这种做法虽然丢了很多空间结构信息但对入门实验是够的。进阶做法是用颜色直方图、方向梯度直方图HOG或局部二值模式LBP提取特征这部分代码可以写在features/目录里和分类器解耦。我自己在实际项目中经常遇到的一个问题是自己的数据集类别不平衡。这时候除了看准确率还要重点看召回率和 F1-score必要时可以用fitcsvm的Prior参数设置类别权重或者用采样方法调整类别比例。这些高级技巧建议在你跑通基础流程后再逐步尝试不要在第一天就全部堆上来。源码框架的好处就在这里随着你理解的加深可以在某个环节持续投入改进而不用推翻重来。模式识别不是“调一个算法跑一个结果”那么简单它是一个反复循环的过程理解数据、尝试算法、分析错误、改进方案。这套源码给了你一个可以反复操作的基础平台剩下的就是多跑实验、多看边界和混淆矩阵逐渐形成自己的判断力。
返回列表