怎么判断你的模型是好是坏?模型性能评估指标大全!

模型性能评估指标,大家一定不陌生!很多小伙伴们都说难,但是它真的很重要很重要很重要!它会对我们的模型有很多的指导,也会给我们真正做模型的时候提供一些指导性的思想,不然我们看到别人的东西只能跟着人家的思路走,不能有自己的想法,或者说没办法去”批判“他做得好还是不好!这多憋屈呀!来!咱学!给它学得透透的!

今天的分析会略微包含一丢丢数学相关内容,大家不要怕!冲!当然,不了解这些也没关系,不会影响大家应用!当然,了解它们一定会让我们更开心对不啦!

性能度量(performance measure),也就是性能评价指标,其实就是指衡量模型泛化能力的性价标准。我们在对比不同模型的能力时,使用不同的性能度量,往往会导致不同的评判结果。这就意味着模型的好坏其实是相对的,什么样的模型是好的,它其实不仅取决于算法和数据,还取决于任务需求

那么我们的任务需求是什么呢?

在预测任务中给定样本集 D = {( x 1 x_1 x1, y 1 y_1 y1), ( x 2 x_2 x2, , y 1 y_1 y1), ( x 3 x_3 x3, y 1 y_1 y1), … , ( x m x_m xm, y m y_m ym)},其中 y i y_i yi 是样本 x i x_i xi 的真实标签。我们要评估模型 f f f 的性能,就要把模型预测结果 f ( x ) f(x) f(x) 和真实标签 y y y 进行比较。

在回归任务中,最常用的性能度量就是“均方误差”(mean squared error):

E ( f ; D ) = 1 m Σ i = 1 m ( f ( x i ) − y i ) 2 E(f; D) = \frac1m\overset{m}{\underset{i=1}{\Sigma}}(f(x_i)-y_i)^2 E(f;D)=m1i=1Σm(f(xi)yi)2

看到公式我们不要怕!其实都是纸老虎!我们举个例子帮助大家理解!

假如我们的样本集 D 是这样的:D = {小要, 2), (小刘, 6), (小曼, 8)},那我们的 m,也就是样本数量就是 3。现在有个模型 f 已经被构建好啦,我们把”小要“、”小刘“、”小曼“输入这个模型,就可以得到它们各自的结果,比如得到的结果是这样:{小要, 2), (小刘, 5), (小曼, 8)}。其中的”2, 5, 8“就是我们的模型预测结果 f(x),而之前的”2, 6, 8“就是真实标签 y。我们把预测结果和真实标签相减后平方然后加起来除以样本个数,就可以得到均方误差。也就是:

M S E = [ ( 2 − 2 ) 2 + ( 5 − 6 ) 2 + ( 8 − 8 ) 2 ] / 3 MSE = [(2-2)^2 + (5-6)^2 + (8 - 8)^2] / 3 MSE=[(22)2+(56)2+(88)2]/3

其实均方误差就是计算数据预测值与真实值差值的平方和的平均数,也就是误差平方和的平均数。

更一般的,对于数据分布 D \mathcal D D 和概率密度函数 p ( ⋅ ) p(·) p(),均方误差可以描述为:

E ( f ; D ) = ∫ x ∼ D ( f ( x ) − y ) 2 p ( x ) d x E(f; \mathcal D) = \int_{x \sim \mathcal D}(f(x)-y)^2p(x)dx E(f;D)=xD(f(x)y)2p(x)dx

其实还有一种情况,就是每个样本出现的概率是不一样的,比如同样是上面的例子,我们又知道”小要“出现的概率是 0.2,”小刘“的概率0.5,”小曼“的的 0.3,那么这个时候就不可以像上面一样那么单纯了!不过也简单,咱们这么干:

M S E = [ ( 2 − 2 ) 2 × 0.2 + ( 5 − 6 ) 2 × 0.5 + ( 8 − 8 ) 2 × 0.3 ] / 3 MSE=[(2-2)^2\times0.2+(5-6)^2\times0.5+(8-8)^2\times0.3]/3 MSE=[(22)2×0.2+(56)2×0.5+(88)2×0.3]/3

简单地把概率乘进去就好啦!是不是也蛮好理解!

下面我们就来主要介绍一下分类任务中最常用的性能度量。

错误率与精确度

**错误率(error rate)和精确度(accuracy)**是分类任务中最常用的两种性能度量,适用于二分类和多分类。

这俩很好理解,咱们来瞅瞅!通过我上面通俗易懂、出神入化的解释,相信大家应该对公式恐惧感减弱了叭!来!咱们继续掰扯!前期多解释,后期我们对于简单的公式就可以嗖嗖嗖过去啦!当然,对于难度较大的,当然还是会对它进行深入剖析!

首先是错误率,它是指分类错误的样本数占样本总数的比例。

公式如下:

E ( f ; D ) = 1 m Σ i = 1 m ∥ ( f ( x i ) ≠ y i ) E(f; D) = \frac1m\overset{m}{\underset{i=1}{\Sigma}}\parallel(f(x_i)\not= y_i) E(f;D)=m1i=1Σm(f(xi)=yi)

这个就是我们前面的均方误差的公式,大家已经很清楚啦!其中的那个小双杠 ∥ \parallel 呢,它是统计满足括号中条件的元素的个数,如果相等就取 0,不相等就取 1,最后进行求和,得到的值一共有多少个不相等,比如说 10 个里面有 6 个不相等,那就说明错误率为 0.6。感觉有点类似于条件表达式,真返回 1,假返回 0。上面的 E 就是我们的错误率,注意它不是期望哈,千万不要搞混,不然会一脸懵逼皱眉挠头的!

然后是精确度,和错误率相反,它指的是分类正确的样本数占样本总数的比例。

公式如下:

a c c ( f ; D ) = 1 m Σ i = 1 m ∥ ( f ( x i ) = y i ) = 1 − E ( f ; D ) acc(f; D) = \frac1m\overset{m}{\underset{i=1}{\Sigma}}\parallel(f(x_i)= y_i)=1-E(f; D) acc(f;D)=m1i=1Σm(f(xi)=yi)=1E(f;D)

用 1 减去错误率,就得到精确度啦!

查准率、查全率与 F1

错误率和精确度虽然很常用,但是其实并不能满足所有的任务需求。比如说西瓜问题,如果我们关心的是“挑出的西瓜当中有多少的比例是好瓜”,或者说“所有好瓜当中有多少比例被挑了出来”,显然,错误率就不够用了,就需要使用其它的性能度量。查准率(precision)与查全率(recall)就是更适用于这类需求的性能度量,感觉平常我们好像更习惯叫它们准确率和召回率

首先,我们简单介绍一下混淆矩阵(confusion matrix)

混淆矩阵本身是对于预测结果的一个粗略评价,可以让我们对预测结果和原始数据有一个宏观的了解。在计算查准率。查全率等评价指标时我们也会用到混淆矩阵中的数值。

混淆矩阵里面有四个格子,包含了我们在进行一个二分类预测的时候,预测结果所有可能出现的情况。也就是说,对于任何一个样本进行预测以后,预测结果一定属于这四个格子的其中一个:

左上角 True Positive(简写为 TP)表示实际上这个样本为 Positive,模型也把这个样本预测为 Positive 的情况。这是我们预测正确的部分。

右下角 True Negative(简写为 TN)表示实际上这个样本为 Negative,模型也把这个样本预测为 Negative 的情况。这是我们预测正确的部分。

右上角 False Positive(简写为 FP)表示实际上这个样本为 Negative,但是模型预测为了 Positive 的情况。这是预测错误的部分,也是统计学上的第一类错误(Type I Error)。

左下角 False Negative(简写为 FN)表示实际上这个样本为 Positive,但是模型预测为了 Negative 的情况。这是预测错误的部分,也是统计学上的第二类错误(Type II Error)。

假设,我们有一个任务:给定一些患者的样本,构建一个模型来预测肿瘤是不是恶性的。在这里,肿瘤要么良性,要么恶性,所以这是一个典型的二分类问题。

假设用 y = 1 表示肿瘤是良性,y = 0 表示肿瘤是恶性。则我们可以制作如下表格:

真实情况(竖)/预测结果(横)y = 1,良性y = 0,恶性
y = 1,良性TP(真正例)FN(假反例)
y = 0,恶性FP(假正例)YN(真反例)

TP 表示预测为良性,而实际也是良性的样例数;

FN 表示预测为恶性,而实际是良性的样例数;

FP 表示预测为良性,而实际是恶性的样例数;

TN 表示预测为恶性,而实际也是恶性的样例数;

所以,这四个数值就形成了一个矩阵,我们称为混淆矩阵。

那么,查准率(precision,P)和查全率(recall,R)就分别定义为:

P = T P T P + F P P= \frac{TP}{TP+FP} P=TP+FPTP

R = T P T P + F N R= \frac{TP}{TP+FN} R=TP+FNTP

查准率和查全率是一对矛盾的度量,也就是说它们二者之间是一个**反向变动的关系。**让我们通过一个通俗易懂的例子来解释这个问题(P-R反向变动关系原理)。

假设你是一名草药采集者,你的任务是在一片森林里寻找特定的草药。你带着一个草药识别工具,这个工具可以帮助你判断某个植物是不是你正在寻找的草药。

现在,你在森林中随机采集了 100 株植物,其中有 10 株是你需要找的目标草药,剩下 90 株是其他植物。你使用草药识别工具对这 100 株植物进行了测试,并记录了结果。

查准率衡量的是你找到的草药中有多少是真正的目标草药。换句话说,查准率是在所有被工具判定为目标草药的植物中,真正是目标草药的比例。

查全率衡量的是你实际找到的目标草药占所有目标草药的比例。换句话说,查全率是在所有目标草药中,你成功找到的比例。

现在我们按照上面给出的公式来计算一下:

假设草药识别工具判断有 8 株植物是目标草药,其中只有 6 株是真正的目标草药,其他 2 株是误判的。

  • 查准率 P = 真正的目标草药数 / 被判定为目标草药数 = 6 / 8 = 0.75 = 75%
  • 查全率 R = 真正的目标草药数 / 所有目标草药数 = 6 / 10 = 0.6 = 60%

这里就体现了查准率和查全率的矛盾:

  • 如果你只采集了非常确定的植物(比如,你非常自信这是目标草药的情况下),那么你的查准率可能很高,因为大部分你判断为目标草药的都是对的。但是,你可能错过了很多真正的目标草药,因此查全率会较低。
  • 如果你为了不错过任何目标草药而采集了大量的植物,那么你的查全率可能会很高,因为你找到了大部分的目标草药。但是,你可能也会采集到很多其他植物,导致查准率较低。

所以在分类任务中,我们需要权衡查准率和查全率,并根据具体任务的要求来选择合适的度量指标。有时候我们希望更注重准确率,有时候我们又希望更注重覆盖率,这取决于具体的应用场景。

在很多情况下,我们可以根据模型的预测结果对样本进行排序,排在前面的就是模型认为最可能是正例的样本,排在最后的就是模型认为这不可能是正例的样本,那么我们按照这个顺序逐个把样本作为正例进行预测,那么每次就可以计算出当前的查全率和查准率。以查准率为纵轴、查全率为横轴作图,就得到了查准率 - 查全率曲线,也就是我们常见的”P-R曲线“。

P-R曲线

我们也把当前判定样本是否是正例的预测分数定义为阈值(threshold),选取不同的阈值会得到不同的查准率和查全率。

那么,我们要选择哪一个阈值下的查准率和查全率才能代表我们模型的最优效果呢?

我们就设计了一些方法去帮助我们确定最优阈值:

  • 平衡点(Break-Even Point,BEP):它比较简单粗暴,就是 P = R 时的取值。BEP 过于简化,而且不太靠谱,所以不常用。

  • F1度量:让我们再来回顾一下之前的例子,草药采集者在森林中使用草药识别工具采集了 100 株植物,其中 10 株是目标草药,90 株是其他植物。假设草药识别工具给每株植物一个概率得分,表示这株植物可能是目标草药的概率。

    在这个情况下,我们可以设定一个概率阈值,比如 0.5。如果植物的概率得分大于 0.5,我们将其判定为目标草药;否则,我们将其判定为其他植物。

    现在,我们来计算一下在不同概率阈值下的查准率和查全率,并绘制 P - R 曲线。为了简化计算,我们假设在不同阈值下,草药识别工具的结果如下:

    阈值判定为目标草药的植物真正的目标草药查准率查全率
    0.180100.1251.0
    0.360100.1671.0
    0.540100.251.0
    0.72090.450.9
    0.91060.60.6

    F1 度量其实就是查准率和查全率的调和平均(harmonic mean),它通过综合考虑这两个指标来给出一个单一的度量值。F1 度量的计算方式为 2 * (查准率 * 查全率) / (查准率 + 查全率),也就是下面的公式:

    F 1 = 2 × P × R P + R = 2 × T P 样本总数 + T P − T N F_1=\frac{2\times P\times R}{P+R}=\frac{2\times TP}{样本总数+TP-TN} F1=P+R2×P×R=样本总数+TPTN2×TP

    在这个公式中,查准率和查全率都出现在分子和分母中,所以 F1 度量会受到这两个指标的影响。F1 度量的取值范围在 0 到 1 之间,值越接近 1 表示模型在查准率和查全率上都表现良好,值越接近 0 表示模型在这两个指标上表现较差。

    继续使用上面的表格数据,我们可以计算出不同阈值下的 F1 度量:

    阈值F1
    0.10.222
    0.30.286
    0.50.4
    0.70.64
    0.90.6

    我们可以看到,随着阈值的变化,F1 度量也会相应变化。当阈值为 0.7 时,F1 度量最高,这意味着在这个阈值下,模型在查准率和查全率上都取得了一个较好的平衡。

    所以 F1 度量能够帮我们找到一个合适的阈值,使模型在查准率和查全率上都能取得较好的表现。

  • F β F_β Fβ:有时候我们会希望将其中一个指标更加重视,而另一个指标则相对较次要。比如在商品推荐系统中,我们就希望推荐内容尽量都是用户感兴趣的,这个时候查准率就更重要;而在逃犯信息检索系统中,我们会希望尽可能少漏掉逃犯,这个时候查全率就更重要。这个时候就可以使用 F β F_β Fβ 度量来确定 P - R 曲线的阈值,公式如下:

    F β = ( 1 + β 2 ) × P × R ( β 2 × P ) + R F_β=\frac{(1+β^2)\times P\times R}{(β^2\times P)+R} Fβ=(β2×P)+R(1+β2)×P×R

    F1 度量是查准率和查全率的调和均值,而 F β F_β Fβ 度量则是查准率和查全率的加权调和平均,它通过引入参数 β 来调整查准率和查全率之间的平衡。β 的取值决定了对查准率和查全率的重视程度:

    • 当 β = 1 时,相当于常见的 F 1 F_1 F1 度量,即查准率和查全率的平衡值。
    • 当 β > 1 时,查全率会对 F β F_β Fβ 度量的影响更大,因此更注重覆盖率。
    • 当 0 < β < 1 时,查准率会对 F β F_β Fβ 度量的影响更大,因此更注重准确率。

    总结一下, F β F_β Fβ 度量可以帮助我们根据任务需求,调整查准率和查全率之间的平衡,使模型在特定方面表现得更优秀。通过选择不同的 β 值,我们可以根据实际应用场景来确定最合适的阈值,从而优化模型的性能。

那如果我们想要用 n个二分类实现多分类问题,这该如何做呢?

我们可以先根据各混淆矩阵分别求 P 和 R,然后再计算平均值,这样就可以得到”宏查准率(macro-P)“、”宏查全率(macro-R)“和”宏 F 1 F_1 F1(macro- F 1 F_1 F1)“;也可以先对各混淆矩阵的对应元素求平均,记为 T P ‾ \overline{TP} TP F P ‾ \overline{FP} FP T N ‾ \overline{TN} TN F N ‾ \overline{FN} FN,再基于这些平均值计算”微查准率(micro-P)“、”微查全率(micro-R)“和”微 F 1 F_1 F1(micro- F 1 F_1 F1)“。

前面我们讲了这么多,那么我们如何用P-R曲线去比较模型的好坏呢?

比如上图的三个模型,我们可以明确地看出,B 模型和 A 模型肯定是比 C 模型好,而 B 模型和 A 模型曲线有交叉,我们用肉眼就无法确定二者哪个更好啦!那我们有什么方法去对它们进行判断吗?

有的!

  • 比较曲线下面积的大小(这个我们后续会详细讲解,其实就是我们平常说的 AUC),它可以一定程度上表征模型的优劣。
  • F 1 F_1 F1
  • F β F_β Fβ

这部分内容过多,我们分个期好不好!下节见!

文末碎碎念

那今天的分享就到这里啦!我们下期再见哟!

最后顺便给自己推荐一下嘿嘿嘿!

如果我的分享对你有用的话,欢迎关注点赞在看转发分享阿巴阿巴阿巴阿巴巴巴!这可是我的第一原动力!

蟹蟹你们的喜欢和支持!!!

啊对!如果小伙伴们有需求的话,也可以加入我们的交流群:一定要知道 | 永久免费的生信交流群终于来啦!

还有兴趣的话,也可以看看我掏心掏肺的干货满满 | 给生信小白的入门小建议 | 掏心掏肺版!绝对干货满满!

如果有小伙伴对付费分析有需求的话,可以看看这里:个性化科研服务 | 付费分析试营业正式启动啦!定制你的专属生信分析!可提供1v1答疑!

入群链接后续可能会不定期更新,主要是因为群满换码或是其他原因,如果小伙伴点开它之后发现,咦,怎么失效啦!不要慌!咱们辛苦一下动动小手去主页的要咨询那里,点击进交流群即可入群!

参考资料
  1. 周志华. 机器学习[M]. 北京:清华大学出版社. 2016.01.
  2. https://www.bilibili.com/video/BV17J411C7zZ
  3. https://zhuanlan.zhihu.com/p/364253497

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/451480.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阳光保险MySQL数据库平稳迁移OceanBase,稳定运营超700天

作者简介&#xff1a; 车东兴&#xff1a;于阳光保险就职&#xff0c;深耕保险行业的 IT 领域长达12 年&#xff0c;对保险领域的基础架构实践有深刻的理解与掌握。熟悉多款数据库&#xff0c;具有丰富的数据库运维经验。 王华城&#xff1a;于阳光保险就职&#xff0c;10多年一…

Eclipse安装springboot

Eclipse免费&#xff0c;套件丰富&#xff0c;代码开源&#xff0c;功能强大…推荐&#xff01; 1 下载eclipse: https://www.eclipse.org/downloads/download.php?file/technology/epp/downloads/release/2023-12/R/eclipse-jee-2023-12-R-win32-x86_64.zip 2 安装Spring框…

【Vue3】什么是路由?Vue中的路由基本切换~

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

AI写真变现项目丨超级训练营SOP手册

出品方&#xff1a; 吴东子团队 x AI破局俱乐部 以下只是该SOP手册的部分介绍&#xff0c;AI写真变现项目上手到变现全流程&#xff0c;需要完整手册的可以dd我。 AI写真 首先什么是AI写真&#xff0c;顾名思义的话可以说成是用AI生成写真照&#xff0c;我们先暂且这么理解&am…

学习数据节构和算法的第15天

单链表的实现 链表的基本结构 #pragma once #include<stdio.h> typedf int SLTDataType; typedy struct SListNode {SLTDataType data;struct SListNode*next; }SLTNode;void Slisprint(SLTNode*phead);打印链表 #include<stdio.h> void SListPrint(SLTNode*phe…

springboot+nacos使用

依赖 nacos服务发现和注册的依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency><dependency><groupId>com.alibaba.cloud</g…

【掌握版本控制:Git 入门与实践指南】操作仓库文件|分支管理

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;泥中に咲く—ウォルピスカーター 0:34━━━━━━️&#x1f49f;──────── 4:46 &#x1f504; ◀️ ⏸ ▶…

基于Springboot的高校汉服租赁网站(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的高校汉服租赁网站&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

【清晰易懂】@Mapper注解和BaseMapper爱恨情仇

此问题的提出在于自己没有弄明白一个问题&#xff0c;就是Mapper注解有时候可以不加&#xff0c;有时候又需要加。 先说结论&#xff1a;Mapper注解和BaseMapper类在项目中起着相同的作用&#xff0c;都是为了实现数据库基本简单的CRUD&#xff0c;省去在xml文件中再去写&#…

(一)运行起自己的chatGPT

一、运行步骤 前面所有步骤可以参见https://datawhaler.feishu.cn/docx/BwjzdQPJRonFh8xeiSOcRUI3n8b 二、注意 需要注意的是&#xff1a; 部署起来后&#xff0c;必须使用域名访问才能进入。用ip地址端口访问不成功 三、运行效果 gradio需要额外配置一个外部端口&#x…

Redis + Caffeine = 王炸!!

在高性能的服务架构设计中,缓存是一个不可或缺的环节。在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中,只有当缓存的访问没有命中时再查询数据库。在提升访问速度的同时,也能降低数据库的压力。 随着不断的发展,这一架构也产生了改进,在…

移动硬盘无法读取怎么修复?分享三个简单方法

移动硬盘作为现代数据存储的重要工具&#xff0c;一旦出现故障&#xff0c;往往会让我们感到焦虑和困惑。当移动硬盘无法读取时&#xff0c;我们需要冷静分析并采取适当的措施来修复它。本文将为您介绍三种有效的修复方法。 一、检查物理连接与驱动程序 当移动硬盘无法读取时&…

整数和浮点数在内存中储存的形式

整数 整数的二进制表示法有三种&#xff0c;即原码、反码、补码。 三种表示方式均有符号位和数值位 符号位位于数值位最高位的那一位&#xff0c;分别用0和1表示&#xff0c;0表示正数&#xff0c;1表示负数。 数值位&#xff0c;除最高位的那一位外其他都是数值位。 正整数…

GaussDB(DWS)运维利刃:TopSQL工具解析

在生产环境中&#xff0c;难免会面临查询语句出现异常中断、阻塞时间长等突发问题&#xff0c;如果没能及时记录信息&#xff0c;事后就需要投入更多的人力及时间成本进行问题的定位和解决&#xff0c;有时还无法定位到错误出现的地方。在本期《GaussDB(DWS)运维利刃&#xff1…

Onlyfans年龄验证/无法支付解决方案

很多小伙伴在使用的时候遇到年龄验证&#xff0c;或者需要绑定visa卡&#xff0c;这里需要注意的是提示绑定visa卡直接绑定就好了&#xff0c;记得开好你的环境&#xff0c;要不然也会出现身份验证&#xff0c;对于我们来说验证一般是不过的 1、准备好环境 2、准备好卡&#…

如何使用US Domain Center和WordPress搭建非营利组织网站的详细指南

在今天的数字化时代&#xff0c;拥有一个专业、易于管理和更新的网站对于非营利组织&#xff08;例如慈善机构、NGO等&#xff09;至关重要。WordPress是一个功能强大且易于使用的网站构建平台&#xff0c;而美国域名中心 US Domain Center&#xff1a;US Domain Center 则是一…

iOS应用内的沙盒目录

iOS系统的沙盒机制规定每个应用都只能访问当前沙盒目录下面的文件&#xff0c;在开发中常常需要数据存储的功能&#xff0c;比如存取文件&#xff0c;归档解档等&#xff0c;因此有必要熟悉沙盒目录及其作用。 Documents目录 开发者可以将应用程序的数据文件保存在这个目录下.…

9.15完全平方数

j 算法&#xff1a; 完全平方数就是物品&#xff08;可以无限件使用&#xff09;&#xff0c;凑个正整数n就是背包&#xff0c;问凑满这个背包最少有多少物品&#xff1f; 动规五部曲&#xff1a; 1.确定dp及其下标 dp[j]&#xff1a;凑成j的最少完全平方数的个数为dp[j] …

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的暴力行为检测系统(深度学习模型+UI界面+Python代码+训练数据集)

摘要&#xff1a;本篇博客深入介绍了如何利用深度学习技术构建暴力行为检测系统&#xff0c;并提供了完整的实现代码。本系统基于性能卓越的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等前代算法进行了详细的性能比较&#xff0c;关注了如mAP、F1 Score等关键性能指标。…

数据结构 第2章:线性表

文章目录 2.1 线性表的定义和操作2.1.1 线性表的基本概念2.1.2 线性表的基本操作 2.2. 顺序表2.2.1. 顺序表的基本概念2.2.2. 顺序表的实现2.2.3. 顺序表的基本操作 2.3 链表2.3.1 单链表的基本概念2.3.2 单链表的实现2.3.3 单链表的插入2.3.4. 单链表的删除2.3.5. 单链表的查找…