【模型评估】ROC(Receiver operating characteristic)与 AUC

2023-10-30

前面,我们提到了混淆矩阵,以及根据混淆矩阵进一步计算得到的敏感度(召回率)、特异度、精确度、准确度、F1 Score等等。那他们的前提都是要首先确定一个截断阈值。

【模型评估】混淆矩阵(confusion_matrix)之 TP、FP、TN、FN;敏感度、特异度、准确率、精确率

这个截断阈值选取多少比较合适呢?这里就需要引入ROC曲线了,一个衡量模型整体性能的参数。

一、什么是ROC(Receiver Operating Characteristic)

在上一章计算混淆矩阵时候,我们提到:混淆矩阵的绘制严重依赖一个固定的截断阈值,大于这个阈值的是阳性,反之则是阴性。

在确定该阈值的前提下,才能确定混淆矩阵的数值,这种对模型评价方式是片面的,不够全局的,没有从整体上评价一个模型的性能。

此时,迫切需要一中评价方式,能够更加全面的对模型进行评估。既然一个截断阈值的评价是片面的,那么我尽可能的多取一些阈值,综合起来评价,那是不是就可以避免这个问题呢?于是就出现的ROC曲线,如下所示:

1

其中:

  • 横轴:False Positive Rate(假阳率,FPR=1-特异度)
  • 纵轴:True Positive Rate(真阳率,TPR=敏感度)

连接(0,0)和(1,1)绿色曲线上的任意一点,是在该阈值下,对应的混淆矩阵下的假阳性率和真阳性率。例如图中的(0.1,0.8),即该阈值 t 下,假阳性率为0.1,真阳性率为0.8。

连接这条曲线上的任意一个点,就对应着在该截断阈值下的假阳性率和真阳性率。其中

  • 最优的点取在左上角
  • 曲线右下包围的面积,叫做AUC值

二、如何绘制ROC曲线

那后面,我们就针对这样一个思路,开始绘制一个分类任务中的ROC曲线出来。整理下绘制思路:

  1. 获取每一张评估图像的标注类别gt、预测该真实类别的预测置信度score;
  2. 对于某一个类,遍历分数0-1,分1000个截断阈值,分别计算在该阈值下,该类的混淆矩阵,进一步计算得到假阳性率和真阳性率
  3. 横坐标是假阳性率(1-特异度),纵坐标是真阳性率(敏感度),绘制ROC曲线
  4. 计算AUC值

2.1、sklearn绘制简单ROC

思路就是上面这样一个心路历程,但是现在基本上各个库都已经帮你封装好了,只需要准备好对应的数据格式,调用函数即可,无需重复造轮子了。下面就是调用sklear的函数,直接绘制ROC和AUC 值。如下:

import numpy as np
from sklearn.metrics import roc_curve, auc
y      = np.array([1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1])
scores = np.array([0.1, 0.4, 0.35, 0.8, 0.9, 0.7, 0.6, 0.4, 0.2, 0.1, 0.2, 0.9, 0.8, 0.65, 0.85, 0.67, 0.75, 0.74, 0.36, 0.85, 0.48, 0.95, 1, 0.65,
                   0.85, 0.75, 0.95, 0.84, 0.74, 0.58, 0.95])
fpr, tpr, thresholds = roc_curve(y, scores, pos_label=1)
print(fpr)
print(tpr)
print(thresholds)

roc_auc = auc(fpr, tpr)

plt.plot(fpr, tpr, lw=1, label="COVID vs NotCOVID, AUC=%0.3f)" % (roc_auc))

plt.xlim([0.00, 1.0])
plt.ylim([0.00, 1.0])
plt.xlabel("False Positive Rate")
plt.ylabel("True Positive Rate")
plt.title("ROC")
plt.legend(loc="lower right")
plt.savefig(r"./ROC.png")
print("ok")

其实,到这里基本上已经够绘制ROC曲线了,无论是单个类别,还是多个类别。pos_label是哪个,其他的都是negative,依次来绘制ROC曲线即可。

2.2、多分类的ROC曲线绘制到一起

有多个类别的时候,喜欢把不同的类,ROC汇总到一张图里面,这样可以相互对比,下面提供了一张绘制方式留作参考。同时也是鸢尾花项目的训练和测试过程,有所启发。

# 引入必要的库
import numpy as np
import matplotlib.pyplot as plt
from itertools import cycle
from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize
from sklearn.multiclass import OneVsRestClassifier
from scipy import interp
 
# 加载数据
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 将标签二值化
y = label_binarize(y, classes=[0, 1, 2])
# 设置种类
n_classes = y.shape[1]
 
# 训练模型并预测
random_state = np.random.RandomState(0)
n_samples, n_features = X.shape
 
# shuffle and split training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5,random_state=0)
 
# Learn to predict each class against the other
classifier = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True,
                                 random_state=random_state))
y_score = classifier.fit(X_train, y_train).decision_function(X_test)
 
# 计算每一类的ROC
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])
 
# Compute micro-average ROC curve and ROC area(方法二)
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])
 
# Compute macro-average ROC curve and ROC area(方法一)
# First aggregate all false positive rates
all_fpr = np.unique(np.concatenate([fpr[i] for i in range(n_classes)]))
# Then interpolate all ROC curves at this points
mean_tpr = np.zeros_like(all_fpr)
for i in range(n_classes):
    mean_tpr += interp(all_fpr, fpr[i], tpr[i])
# Finally average it and compute AUC
mean_tpr /= n_classes
fpr["macro"] = all_fpr
tpr["macro"] = mean_tpr
roc_auc["macro"] = auc(fpr["macro"], tpr["macro"])
 
# Plot all ROC curves
lw=2
plt.figure()
plt.plot(fpr["micro"], tpr["micro"],
         label='micro-average ROC curve (area = {0:0.2f})'
               ''.format(roc_auc["micro"]),
         color='deeppink', linestyle=':', linewidth=4)
 
plt.plot(fpr["macro"], tpr["macro"],
         label='macro-average ROC curve (area = {0:0.2f})'
               ''.format(roc_auc["macro"]),
         color='navy', linestyle=':', linewidth=4)
 
colors = cycle(['aqua', 'darkorange', 'cornflowerblue'])
for i, color in zip(range(n_classes), colors):
    plt.plot(fpr[i], tpr[i], color=color, lw=lw,
             label='ROC curve of class {0} (area = {1:0.2f})'
             ''.format(i, roc_auc[i]))
 
plt.plot([0, 1], [0, 1], 'k--', lw=lw)
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Some extension of Receiver operating characteristic to multi-class')
plt.legend(loc="lower right")
plt.show()

保存的图像,如下:

2

2.3、绘制FROC曲线

当评估检测算法性能时,常用的指标之一是接收者操作特性曲线(Receiver Operating Characteristic Curve,ROC曲线)。ROC曲线以真阳性率(True Positive Rate,TPR)作为纵轴,以假阳性率(False Positive Rate,FPR)作为横轴。它显示了在不同阈值下,算法的敏感性和特异性之间的权衡关系。

而放射学检测任务中,通常关注的是感兴趣区域(Region of Interest,ROI)的检测情况,这些ROI往往是病灶或异常区域。相较于ROC曲线,放射学检测任务更关注的是假阳性检测的数量,因为在医学领域,减少误检率尤为重要。

为了解决放射学检测任务的特殊性,提出了自由响应工作特性曲线(Free-response Receiver Operating Characteristic Curve,FROC曲线),它是一种用于评估医学图像检测算法性能的指标。FROC曲线以敏感性Sensitivity)作为纵轴,以平均假阳性数Average False Positives Per Image,AFPI)作为横轴。

在FROC曲线中,每个点代表了在特定假阳性数下的敏感性。与ROC曲线不同,FROC曲线的纵轴不是真阳性率,而是敏感性。AFPI表示平均每幅图像的假阳性数,它可以帮助评估算法在不同任务中的表现。

通过绘制FROC曲线,可以更准确地评估放射学检测算法在不同假阳性检测水平下的性能。一般来说,FROC曲线上的点越靠近左上角,表示算法在更低的假阳性率下能够获得较高的敏感性,从而被认为是更优秀的算法。

总结而言,FROC曲线是用于评估医学图像检测算法性能的一种指标,它关注在不同假阳性检测水平下的敏感性表现,帮助评估算法在放射学检测任务中的性能。

from sklearn import metrics
import matplotlib.pylab as plt
 
GTlist = [1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0,
          0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
          0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
 
Problist = [0.99, 0.98, 0.97, 0.93, 0.85, 0.80, 0.79, 0.75, 0.70, 0.65,
            0.64, 0.63, 0.55, 0.54, 0.51, 0.49, 0.30, 0.2, 0.1, 0.09,
            0.1, 0.5, 0.6, 0.7, 0.8, 0.5, 0.2, 0.3, 0.2, 0.5]
 
# num of image
totalNumberOfImages = 2
numberOfDetectedLesions = sum(GTlist)
totalNumberOfCandidates = len(Problist)
 
fpr, tpr, thresholds = metrics.roc_curve(GTlist, Problist, pos_label=1)
 
# FROC
fps = fpr * (totalNumberOfCandidates - numberOfDetectedLesions) / totalNumberOfImages
sens = tpr
 
print(fps)
print(sens)
plt.plot(fps, sens, color='b', lw=2)
plt.legend(loc='lower right')
# plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([fps.min(), fps.max()])
plt.ylim([0, 1.1])
plt.xlabel('Average number of false positives per scan')  # 横坐标是fpr
plt.ylabel('True Positive Rate')  # 纵坐标是tpr
plt.title('FROC performence')
plt.show()

展示结果:
2

2.4、MedCalc统计软件绘制ROC

MedCalc是一款医学专用的统计计算软件,在研究医学领域有较为广泛的应用,软件不大,而功能却很强大,用图形化的界面直观明了的显示所统计的结果,这里就简单介绍下medcalc的统计教程。

官方下载地址:(只有15天试用期。由于不能乱传播,仅用作学习使用。若想获得免费版本,评论备注信息,留下邮箱)。官方地址:Download MedCalc Version 20.106

下面已绘制ROC曲线为例,进行介绍,步骤如图所示:
1

绘制的结果如下:

2

这也是绘制ROC的一种方式,比较快捷。只要准备好需要的数据,既可以直接绘制。注意,这里统计预测分数时候,阈值一定要取的比较低,比如0.01。这样在绘制曲线时候,阈值的选择面才会大。

百度文档对这块进行了详述,更多内容去看这里:MedCalc常用统计教程

2.5、目标检测中,基于Bbox阈值的ROC曲线

1

(这个暂时欠着,在处理中,可以先透露一些步骤):

  1. 读取的是预测的csv文件,包括file name, cls, score, box,预测结果里面多了一个置信度分数score

  2. 以标注gt作为标准,对预测pd的box进行iou的判断,如果大于设定的阈值,即暂时判定该gt的这个box,为tp(为何说暂定,因为这一个gt box,可能会被多个pd box的iou所匹配,所以需要找到iou最大的那个),没有被匹配的gt box判定为fn

  3. 根据置信度分数,进行0-1,分1000个截断阈值进行判断,依次遍历所有的预测框:

    • iou阶段,已经得到了混淆矩阵,tp、fp、tn、fn的
    • 用置信度阈值再过一遍,tp中大于阈值的,还是tp;小于阈值的,就预测为了negative,但是之前是positive的,于是就变成fn
    • fp中大于阈值的,还是fp;小于阈值的,就预测为了negative,之前是negative的,于是就变成tn
    • tn=GT_negative-fp
    • fn=GT_positive-tp
  4. 统计下来,横纵轴坐标,绘制曲线,即可得到ROC曲线;

  5. 计算AUC值(近似为矩形面积累加)

代码正在整理说明,如果你们有好的建议,欢迎评论区讨论。

三、AUC值

AUC 是 ROC 曲线下面的面积,AUC 可以解读为从所有正例中随机选取一个样本 A,再从所有负例中随机选取一个样本 B,分类器将 A 判为正例的概率比将 B 判为正例的概率大的可能性。

也就是:任意取一个正样本和负样本,正样本得分大于负样本的概率。

AUC 反映的是分类器对样本的排序能力。AUC 越大,自然排序能力越好,即分类器将越多的正例排在负例之前。

  • AUC = 1,代表完美分类器
  • 0.5 < AUC < 1,优于随机分类器
  • 0 < AUC < 0.5,差于随机分类器

AUC的公式:
3

问1:数据不平衡,对AUC有影响吗?

答1:数据不平衡对 auc 影响不大(ROC曲线下的面积,ROC的横纵坐标分别是真阳性率和1-真阴性率)。

问2:还有什么指标可以针对不平衡数据进行评估?

答2:还可以使用 PR(Precision-Recall )曲线。

四、总结

ROC(Receiver Operating Characteristic)曲线是一种用于评估二分类模型性能的图形表示方法。它以真阳性率(True Positive Rate,TPR)为纵轴,以假阳性率(False Positive Rate,FPR)为横轴,展示了在不同分类阈值下,模型的敏感性和特异性之间的权衡。

关键概念:

  • 真阳性(True Positive,TP):被模型正确地划分为正类的样本。
  • 假阳性(False Positive,FP):被模型错误地划分为正类的负类样本。
  • 真阴性(True Negative,TN):被模型正确地划分为负类的样本。
  • 假阴性(False Negative,FN):被模型错误地划分为负类的正类样本。

这块参考链接:

绘制ROC曲线的步骤:

  • 使用不同的分类阈值对样本进行预测,并计算出对应的TPR和FPR。
  • 根据不同的分类阈值,将TPR和FPR绘制在坐标轴上。
  • 连接各个点,形成ROC曲线。

ROC曲线的特点:

  • 曲线越靠近左上角,表示模型具有更高的敏感性和更低的特异性,即在较低的假阳性率下能够获得较高的真阳性率,被认为是更优秀的模型。
  • 对角线代表随机猜测的情况,处于对角线上方的曲线表示模型的性能好于随机猜测。
  • ROC曲线下的面积(Area Under the ROC Curve,AUC)是一个综合评估模型性能的指标,AUC越大,模型性能越好。

ROC曲线的应用:

  • 选择最佳分类阈值:根据应用需求,可以选择对应特定TPR和FPR的分类阈值。
  • 比较不同模型:通过比较ROC曲线和AUC值,可以评估不同模型的性能。
  • 模型调优:通过调整模型参数或特征选择,改变ROC曲线形状,提高模型性能。

总而言之,ROC曲线是评估二分类模型性能的一种重要工具,通过展示敏感性和特异性之间的权衡关系,帮助选择最佳分类阈值和比较不同模型的性能。

AP也是常用的一个综合评价工具,那么AP是怎么定义和如何实现的呢?这是下节我们需要讨论的内容,期待。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【模型评估】ROC(Receiver operating characteristic)与 AUC 的相关文章

  • 散景图只会弹出一个空白窗口

    所以我最近一直在尝试学习散景 一切都很顺利 但突然间 每当我尝试制作散景图时 浏览器就会显示一个空白页面 我没有收到任何错误代码 只有空白页 这是我几天前成功用来创建绘图的程序 我什至尝试加载几周前制作的 html 绘图文件 该文件在同事计
  • python - 如何删除每行中的重复列表(pandas)?

    我的每一行中都包含一个列表 我想通过保留分数中的最高值来删除重复元素 这是我的数据框 df1 中的数据 pair score 0 A A 1 0000 1 A F 0 9990 2 A G 0 9985 3 A G 0 9975 4 A H
  • 如何并排绘制具有相同 X 坐标的条形图(“闪避”)

    import matplotlib pyplot as plt gridnumber range 1 4 b1 plt bar gridnumber 0 2 0 3 0 1 width 0 4 label Bar 1 align cente
  • 如何打印前面有一定数量空格的整数?

    C has printf Xd Y 它只打印整数 X 并使其在控制台窗口上占据 Y 空格 例如 printf 3d 10 console 10 printf 5d 5 console 5 我如何在 python 3 中使用它 This pr
  • 在 SQLAlchemy 中,过滤器是在连接之前还是之后应用?

    使用 SQLAlchemy 我执行如下查询 import models as m import sqlalchemy as sa s session maker q s query m ShareCount m Article join m
  • 使用ideone时如何传入命令行参数?

    我正在使用 ideone 在线解释器 http ideone com http ideone com 来测试一些 C 和 Python 程序 如何指定命令行参数而不是使用 STDIN 输入 看起来你不能 但是快速破解应该做的伎俩 stati
  • pandas read_csv 之前预处理数据文件

    我使用 SAP 的数据输出 但它既不是 CSV 因为它不引用包含其分隔符的字符串 也不是固定宽度 因为它具有多字节字符 它是一种 固定宽度 字符 为了将其放入 pandas 我当前读取文件 获取分隔符位置 对分隔符周围的每一行进行切片 然后
  • 创建 xyz 海拔数据的曲面图

    我正在尝试用 python 创建一座山的表面图 其中我有一些 xyz 数据 最终结果应该类似于that https i stack imgur com rKQV0 png 该文件的格式如下 616000 0 90500 0 3096 712
  • Discord.py 斜线命令在 cogs 中不起作用

    我正在构建一个不和谐的机器人 并且想要在 cogs 内使用斜杠命令 但这些命令不显示或工作 这是代码 cog guild ids 858573429787066368 861507832934563851 class Slash comma
  • DataFrame.loc 的“索引器太多”

    我读了关于切片器的文档 http pandas pydata org pandas docs stable advanced html using slicers一百万次 但我从来没有理解过它 所以我仍在试图弄清楚如何使用loc切片Data
  • 将列表值转换为 pandas 中的行

    我有数据帧 其中一列具有相同长度的 numpy ndarray 值 df list 0 Out 92 array 0 0 0 0 29273096 0 30691767 0 27531403 我想将这些列表值转换为数据框并从 df iloc
  • argparse 不检查位置参数

    我正在创建一个脚本 它使用 argparse 接受位置参数和可选参数 我已经阅读了 Doug 的教程和 python 文档 但找不到答案 parser argparse ArgumentParser description script t
  • 为什么 pip 已经是最新的了却要求我升级?

    我全新安装了 python 3 7 1 64 位 并使用最新的 pyCharm 作为我的 IDE 我在这台机器上没有安装其他 python 我去安装 numpy 并收到以下消息 venv C Users John PycharmProjec
  • 类变量:“类列表”与“类布尔值”[重复]

    这个问题在这里已经有答案了 我不明白以下示例的区别 一次类的实例可以更改另一个实例的类变量 而另一次则不能 示例1 class MyClass object mylist def add self self mylist append 1
  • 增强迪基-富勒测试中的 BIC 在 Python 中到底是如何工作的?

    这个问题是关于 statsmodels tsa stattools python 库 adfuller 中的增强迪基 富勒测试实现 原则上 AIC 和 BIC 应该计算一组可用模型的信息标准 并选择最好的模型 信息损失最低的模型 但它们在增
  • 将 str.contains 映射到 pandas DataFrame

    python 初学者 我正在寻找创建字符串的字典映射以及关联的值 我有一个数据框 想要创建一个新列 如果字符串匹配 则会将该列标记为 x df pd DataFrame comp dell notebook dell notebook S3
  • 在 4K 屏幕上使用 Matplotlib 和 TKAgg 或 Qt5Agg 后端

    我在 Ubuntu 16 04 上使用 Matplotlib 2 0 和 Python 3 6 来创建数据图 电脑显示器的分辨率为 4k 分辨率为 3840x2160 绘图数字看起来非常小 字体也很小 我已经尝试过TKAgg and Qt5
  • 尝试 numba 时出现巨大错误

    我在使用 numba 时遇到了大量错误 讽刺的是 正确的结果是在错误之后打印的 我正在使用最新的 Anaconda python 并安装了 numba conda install numba 一次在 Ubuntu 13 64 位和 anac
  • 在自定义 keras 层的调用函数中传递附加参数

    我创建了一个自定义 keras 层 目的是在推理过程中手动更改前一层的激活 以下是基本层 它只是将激活值乘以一个数字 import numpy as np from keras import backend as K from keras
  • 如何仅读取 CSV 文件每行的第一列 [重复]

    这个问题在这里已经有答案了 如何在Python中读取CSV文件每行的第一列 我的数据是这样的 1 abc 2 bcd 3 cde 我只需要循环第一列的值 另外 当我在 calc 中打开 csv 文件时 每行中的数据都在同一个单元格中 这正常

随机推荐

  • 成功解决RuntimeError: Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be

    错误代码 问题原因 这是由于Input type 与weight type的类型不符合 可以注意到Input type是没有cuda的 而weight type是在cuda上也就是有gpu的加载的 错误代码后的or可以不用管 解决办法 既然
  • DBA 面试题目

    from ITPUB more 技术方面 1 解释冷备份和热备份的不同点以及各自的优点 解答 热备份针对归档模式的数据库 在数据库仍旧处于工作状态时进行备份 而冷备份指在数据库关闭后 进行备份 适用于所有模式的数据库 热备份的优点在于当备份
  • c 语言超时溢出问题

    在嵌入式开发过程中 经常会遇到溢出问题 例如在使用软定时判断时间是否超时 如下 if timer ticks gt timeout timer ticks是一个无符号数 假如是一个无符号8位 当timer ticks为254 超时时间为2个
  • 【100%通过率 】【华为OD机试真题c++ 】最大平分数组【 2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 给定一个数组nums 可以将元素分为若干个组 使得每组和相等 求出满足条件的所有分组中 最大的平分组个数 输入描述 第一行输入 m 接着输入m个
  • awk与shell参数传递(或说变量传递)二三点

    awk与shell间参数 或说变量传递 是shell编程中常有的话题了 因为其中实际涉及到不少的知识点 比如包括 a 进程进通信 b awk参数形式 c shell命令解析 命令替换 等等 在此列举二三点例子 做为小结 以下主要分为二部分
  • 路由器工作原理

    定义 路由器 router 是互联网的枢纽 是连接英特网中各局域网 广域网的设备 它会根据信道的情况自动选择和设定路由 以最佳路径 按前后顺序发送数据 作用在OSI模型的第三层 提供了路由与转发两种重要机制 路由 路由器控制层面的工作 决定
  • 使用Python绘制余弦函数的可视化曲线

    使用Python绘制余弦函数的可视化曲线 余弦函数是一种重要的三角函数 其图像可以用来描述很多自然现象 在Python中 我们可以使用plot函数快速地绘制出余弦曲线的图像 首先 我们需要导入必要的库 import numpy as np
  • 如何在H264数据中获取PTS

    H264的ES原始数据一般是以NAL Network Abstract Layer 的格式存在 可以直接用于文件存储和网络传输 每一个NALU Network Abstract Layer Unit 数据 是由数据头 RBSP数据组成 首先
  • 计算1~100之间所有整数的和

    sum 0 for i in range 1 101 sum sum i print sum 5050 sum 0 i 1 while i lt 100 sum sum i i i 1 print sum 5050
  • 在VBA中写SQL语句的注意事项

    最近使用VBA连接MySQL数据库比较多 总结出一些书写方面的注意事项 分享出来 希望能给大家一些提示 同时也给自己做个备忘 1 单引号 双引号 在标准SQL语句中 字符串使用的是单引号 但是MySQL中 单引号和双引号都适用 平时使用时也
  • Python学习第七篇:sys标准库

    Python学习第七篇 sys标准库 活动地址 CSDN21天学习挑战赛 Python的sys模块提供访问由解释器使用或维护的变量的接口 并提供了一些函数用来和解释器进行交互 操控Python的运行时环境 要进行使用 直接导入即可 impo
  • Spring中ApplicationListener事件监听机制详解

    1 概述 Spring中事件监听 也有说法叫事件通知 机制 其实本质是观察者模式的应用 当某个事件发生时 其会被广播出去 监听该实践的listener就会被触发然后执行响应的动作 该模式可良好应用于程序解耦 类似消息的发布订阅 它的事件监听
  • 为什么绝对收敛级数具有可交换性+为什么一般项级数不能使用比较判别法/等价判别法?

    绝对收敛 可以认为是级数某种 本质上 是收敛的 即其正项和负项的和分别是收敛的 而条件收敛 往往是正项负项的和不收敛 因为在级数中的排列导致互相抵消 所以 看起来 收敛了 数列收敛 也就是数列的前N项和的极限存在 对于正项数列 在前N项改变
  • 标签的正确使用

    原文 http book csdn net bookfiles 502 10050217296 shtml 7 7 图片 标签 7 7 1
  • LTC2380-24使用记录

    CNV脉冲时间 至少保持20ns 触发转换之后 标志位忙 此期间 芯片在转换 最长花掉392ns 20210115 转换系数 FS 5 0 6uV 10 2 24 时钟的上升沿输出数据 高位先输出 20210119 数据处理问题 高精度24
  • 移植linux开源软件到android系统

    例子 vlc android vlc android jni 目录 写连接vlc core 的jni 代码 vlc目录 configure host arm linux androideabi 生成linux Makefile 后面的编译和
  • 深入理解Python中的GIL(全局解释器锁)

    深入理解Python中的GIL 全局解释器锁 一 GIL是什么 GIL 又称全局解释器锁 作用就是限制多线程同时执行 保证同一时间内只有一个线程在执行 线程非独立的 所以同一进程里线程是数据共享 当各个线程访问数据资源时会出现 竞争 状态
  • AWK用户自定义函数

    函数是程序的基本组成部分 AWK允许我们定义自己的函数 一个大项目可以分为多个函数并且每个函数可以写 独立测试 它提供了可重用性的代码 下面给出的是用户自定义函数的一般格式为 function function name argument1
  • Android开发中onConfigurationChanged()不起作用

    很多开发者 在开发中很可能遇到的这样的问题 在Activity中重写了onConfigurationChanged 但是该函数就是不执行 这种问题的解决方式一般是没有在AndroidManifest中添加configuration的标签 可
  • 【模型评估】ROC(Receiver operating characteristic)与 AUC

    前面 我们提到了混淆矩阵 以及根据混淆矩阵进一步计算得到的敏感度 召回率 特异度 精确度 准确度 F1 Score等等 那他们的前提都是要首先确定一个截断阈值 模型评估 混淆矩阵 confusion matrix 之 TP FP TN FN