当前位置: 首页 > news >正文

【机器学习-模型评估】

“评估”已建立的模型

在进行回归和分类时,为了进行预测,定义了预测函数fθ(x)
然后根据训练数据求出了预测函数的参数θ(即对目标函数进行微分,然后求出参数更新表达式的操作)
之前求出参数更新表达式之后就结束了。但是,其实我们真正想要的是通过预测函数得到预测值。
所以我们希望fθ(x)对未知数据x输出的预测值尽可能正确:

测量预测函数fθ(x)的正确性:精度

对于一元二元问题可以画图观测:
在这里插入图片描述
但是像多重回归这样的问题,变量增加后就不能在图上展示了,而且特意去画图也很麻烦
还有一点,是从训练数据中得到的参数,训练结束之后得到的就是只针对于训练集的正确参数
所以我们需要能够定量地表示机器学习模型的精度即模型评估

交叉验证

回归问题

把获取的全部训练数据分成两份:一份用于测试,一份用于训练。然后用前者来评估模型。
即让出一部分训练集不用于学习而是用于学习后对模型的评估测验
在这里插入图片描述
先观测一下同样的数据集用一元和二元分别训练后的预测函数
在这里插入图片描述
在这里插入图片描述
发现二元函数在训练集上的精度更高,但是测试集上的精度反而降低
模型评估就是像这样检查训练好的模型对测试数据的拟合情况
但还是那个问题,现实生活中的问题时,大多数情况不能像现在这样画图来看,所以我们需要定量地衡量精度
对于回归的情况,只要在训练好的模型上计算测试数据的误差的平方,再取其平均值就可以了。

均方误差MSE

假设测试数据有n个,那么可以这样计算:
在这里插入图片描述

这个值被称为均方误差或者MSE,全称Mean Square Error。这个误差越小,精度就越高,模型也就越好。
在这里插入图片描述
可知回归的目标函数也是误差函数,这与为了让误差函数的值变小而更新参数时所做的事情是一样的

分类问题

在这里插入图片描述

假设在逻辑回归的情况下,预测函数θTx是简单的一次函数,那么只根据训练数据进行训练后,决策边界应该是这样的

在这里插入图片描述
但是假如预测函数f=θTx更加复杂,可能就会像这样紧贴着训练数据进行分类
在这里插入图片描述
可以对训练数据完美地进行分类,却完全忽视了测试数据
所以在分类的时候,我们还必须检查模型是否正确。
由于回归是连续值,所以可以从误差入手,但是在分类中我们必须要考虑分类的类别是否正确
即在回归中要考虑的是答案不完全一致时的误差,而分类中要考虑的是答案是否正确(完全一致)
比如一个横纵向的二分类问题,无非有四个结果:
在这里插入图片描述
设分类结果为正的情况是Positive、为负的情况是Negative。分类成功为True、分类失败为False
那么一般来说,二分类的结果可以用这张表来表示:
在这里插入图片描述
使用表里的4个记号来计算分类的精度(表示的是在整个数据集中,被正确分类的数据TP和TN所占
的比例):
在这里插入图片描述
假如100个数据中80个被正确地分类了,那么精度就是
在这里插入图片描述
用测试数据来计算这个值,值越高精度越高,也就意味着模型越好。

精确率和召回率

一般来说,只要计算出这个Accuracy值,基本上就可以掌握分类结果整体的精度了。
但是有时候只看这个结果会有问题,所以还有别的指标。
假设图中的圆点是Positive数据、叉号是Negative 数据,考虑数据集极其不平衡的情况:
在这里插入图片描述
那么假设有100个数据,其中95个是Negative。
此时哪怕出现模型把数据全部分类为Negative的极端情况,Accuracy值也为0.95,
也就是说模型的精度是95%。
但是不管精度多高,一个把所有数据都分类为某一个类的模型(尽管这个类极端的多),但不能说它是好模型
考虑这个图:
在这里插入图片描述
这个例子看上去对Positive数据分类得不够好。

精确率(Precision):

在这里插入图片描述

这个指标只关注TP和FP
根据表达式来看,它的含义是在被分类为Positive 的数据中,实际就是Positive的数据所占的比例:
在这里插入图片描述
那么有:
在这里插入图片描述
这个值越高,说明分类错误越少
拿这个例子来说,虽然被分类为Positive 的数据有3个,但其中只有1个是分类正确的。所以计算得出的精确率很低。

召回率(recall)

把精确率分母上的FP换成FN:
在这里插入图片描述
这个指标只关注TP和FN
根据表达式来看,它的含义是在Positive 数据中,实际被分类为Positive的数据所占的比例:
在这里插入图片描述
在这里插入图片描述
基于这两个指标来考虑精度是比较好的。
不过一般来说,精确率和召回率会一个高一个低,需要我们取舍,精确率和召回率都很高的模型就是一个好模型.

另外,并不一定将准确/召回都以TP为主,也可以TN为主
在这里插入图片描述
到底以什么为主,当数据不平衡时,使用数量少的那个会更好
如Positive 极少,所以我们使用了Positive来计算,反之如果Negative较少,那就使用Negative

如何取舍?

假如就两个值都计算,然后取它们的平均值,考虑极端情况:
在这里插入图片描述
模型B召回率是1.0,也就是说所有的Positive数据都被分类为Positive了(很好)
但是精确率特别低
如果将所有的数据都分类为Positive,那么召回率就是1.0。但是这样一来,Negative数据也会被分类为Positive,所以精确率会变得很低。
看一下两个模型的平均值,会发现模型B的更高。但它是把所有数据都分类为Positive的模型,精确率极低,仅为0.02,并不能说它是好模型。
所以只看平均值确实无法知道模型的好坏,由此引出对Precision和Recall的综合取舍指标F值

F值(Fmeasure/F1值)

Precision是前面说的精确率,Recall是召回率,考虑数学上精确率和召回率的调和平均值:
在这里插入图片描述
异或(都可以完全一样):
在这里插入图片描述

不难得出精确率和召回率只要有一个低,就会拉低F值。
回顾前面的极端情况:
在这里插入图片描述
发现B模型的F值更高,因为F指标考虑到了精确率和召回率的平衡。

除F1值之外,还有一个带权重的F值指标:
在这里插入图片描述
我们可以认为F值指的是带权重的F值,当权重为1时才是刚才介绍的F1值

把全部训练数据分为测试数据和训练数据的做法称为交叉验证。
对于回归和分类,我们都可以这样来评估模型
并且在交叉验证的方法中,尤为有名的是K折交叉验证:

  • 把全部训练数据分为K份
  • 将K−1份数据用作训练数据,剩下的1份用作测试数据
  • 每次更换训练数据和测试数据,重复进行K次交叉验证
  • 最后计算K个精度的平均值,把它作为最终的精度
    在这里插入图片描述
    如果全部训练数据的量较大,这种方法必须训练多次,不切实际地增加K值会非常耗费时间,所以我们必须要确定一个合适的K值。

正则化

过拟合(overfitting)

有几种方法可以避免过拟合:

  • 增加全部训练数据的数量
  • 使用简单的模型
  • 正则化

首先,重要的是增加全部训练数据的数量。
因为学习是从数据中学习的,所以数据最重要。
另外,使用更简单的模型也有助于防止过拟合(例如过过度增加函数fθ(x)的次数会导致过拟合)。

回归正则化方法:

先回顾回归的目标函数
在这里插入图片描述
增加正则化项(m是参数个数):
L2正则化方法:
在这里插入图片描述
那么:
在这里插入图片描述
对这个新的目标函数进行最小化,这种方法就称为正则化
θ0这种只有参数的项称为偏置项,一般不对它进行正则化(j的取值是从1开始的,所以实际上只对m-1个参数θ正则化)
假如预测函数的表达式为fθ(x)=θ0+θ1x+θ2x2,那么m=2就意味着正则化的对象参数为θ1和θ2
λ 是决定正则化项影响程度的正的常数。这个值需要我们自己来定。

正则化效果

将目标函数分为两个部分CR
C(θ) 是本来就有的目标函数项,R(θ)是正则化项:

在这里插入图片描述
C(θ)和R(θ)相加之后就是新的目标函数
我们实际地把这两个函数的图形画出来(这个目标函数大致开口向上),加起来看看。
不过参数太多就画不出图来了,所以这里我们只关注θ1:
在这里插入图片描述
从这个目标函数在没有正则化项时的形状来看,θ1=4.5附近是最小值。
接下来是R(θ),它就相当于1/2*θ1^2,是过原点的简单二次函数
实际的目标函数是这两个函数之和E(θ)=C(θ)+R(θ),要画函数相加后的图即把θ1各点上的C(θ)和R(θ)的高相加,然后用线把它们相连:
在这里插入图片描述

本来是在θ1=4.5处最小,现在是在θ1=0.9处最小,与加正则化项之前相比,θ1更接近0了的确更接近0了。
这就是正则化的效果:
它可以防止参数变得过大,有助于参数接近较小的值。
虽然我们只考虑了θ1,但其他θj参数的情况也是类似的。这样就能防止过拟合(参数的值变小,意味着该参数的影响也会相应地变小):
比如考虑二次预测方程:
在这里插入图片描述
极端一点,假设θ2=0,这个表达式就从二次变为一次了,这就意味着本来是曲线的预测函数变为直线了
在这里插入图片描述
正是通过减小不需要的参数的影响,将复杂模型替换为简单模型来防止过拟合的方式
不过只是个例子,并不一定非要减小次数最高项的参数值。
整体思路就是:
为了防止参数的影响过大,在训练时要对参数施加一些惩罚,而λ就是可以控制正则化惩罚的强度

比如令λ=0,那就相当于不使用正则化:
在这里插入图片描述

反过来λ越大,正则化的惩罚也就越严厉(横向压缩更靠近原点)
在这里插入图片描述

分类正则化方法:

同样考虑目标函数
逻辑回归的目标函数是对数似然函数
在这里插入图片描述
原来的目标函数上加上负号是因为:
对数似然函数本来以最大化为目标。但是,这次想让它变成和回归的目标函数一样的最小化问题,所以加了负号。
这样就可以像处理回归一样处理它,所以只要加上正则化项就可以了。

反转符号是为了将最大化问题替换为最小化问题
反转了符号之后,在更新参数时就要像回归一样,与微分的函数的符号反方向移动

又因为反转了符号,目标函数发生改变,那么参数更新表达式也会改变
但是只需要再把正则化项的部分也微分了就行

包含正则化项的表达式的微分

在这里插入图片描述
在这里插入图片描述
C(θ)是原来的目标函数,讲回归的时候已经求过它的微分形式了:
在这里插入图片描述
以接下来只要对正则化项进行微分,正则化项只是参数平方的和,所以它的微分也很好求:
在这里插入图片描述
在这里插入图片描述

最终有:
在这里插入图片描述
目标函数对该参数的微分完成后,带入该参数更新表达式(参数±学习率×目标函数微分):
在这里插入图片描述
这就是加入了正则化项的参数更新表达式。
因为一般不对θ0应用正则化。R(θ)对θ0微分的结果为0,所以j=0时表达式中的λθj就消失了。
因此,实际上我们需要像这样区分两种情况:
在这里插入图片描述

逻辑回归正则化后的微分

原来的目标函数是C(θ),正则化项是R(θ),现在对E(θ)进行微分:
在这里插入图片描述在这里插入图片描述
之前已经求过逻辑回归原来的目标函数C(θ)的微分,不过现在考虑的是最小化问题,所以要注意在
前面加上负号。也就是要进行符号的反转:
在这里插入图片描述
我们已经求过正则化项R(θ)的微分:
在这里插入图片描述

所以参数更新表达式:
在这里插入图片描述

除了L2,还有L1正则化方法:
在这里插入图片描述
L1正则化的特征是被判定为不需要的参数会变为0,从而减少不要的变量个数
L2正则化不会把参数变为0。而是会抑制参数,使变量的影响不会过大

欠拟合(underfitting)

一个是过度训练(过拟合),一个是过度不训练(欠拟合):
欠拟合是与过拟合相反的状态,即没有拟合训练数据的状态
比如用直线对图中这种拥有复杂边界线的数据进行分类的情况,无论怎样做都不能很好地分类,最终的精度会很差:
在这里插入图片描述
出现这种情况的主要原因也和过拟合的情况相反就是模型相对于要解决的问题来说太简单了

区分过拟合与欠拟合

只根据精度不能判断是哪种不好的拟合
对于数据集,采取只选两个点学习训练:
在这里插入图片描述
那么:
在这里插入图片描述
在这个状态下,2个点都完美拟合,误差为0,因为一次函数肯定会以通过这2点为目标去训练
但是若全部用来训练:
在这里插入图片描述
在这种情况下,fθ(x)是一次函数,误差已经无法为0了。

如果模型过于简单,那么随着数据量的增加,误差也会一点点变大。换句话说就是精度会一点点下降。
把这种情况画在刚才所说的以数据的数量为横轴、以精度为纵轴的图上:
在这里插入图片描述
一开始精度很高,但随着数据量的增加,精度一点点地变低了。

接下来用测试数据来评估一下:
假设在刚才的10个训练数据之外,还有测试数据。我们用这些测试数据来评估各个模型,之后用同样的方法求出精度,并画成图
即用测试数据先评估根据2个训练数据训练好的模型,再评估根据10 个训练数据训练好的模型……然后依次求出精度

因为训练数据较少时训练好的模型难以预测未知的数据,所以精度很低;
反过来说,训练数据变多时(慢慢地将测试数据融入训练数据),预测精度就会一点点地变高。用图来展示就是这样的:
在这里插入图片描述
将两份数据的精度用图来展示后,如果是这种形状,就说明出现了欠拟合的状态。也有一种说法叫作高偏差
这是一种
即使增加数据的数量,无论是使用训练数据还是测试数据,精度也都会很差的状态

在这里插入图片描述
过拟合的情况下,也叫作高方差:
在这里插入图片描述
随着数据量的增加,使用训练数据时的精度一直很高,而使用测试数据时的精度一直没有上升到它的水准,只对训练数据拟合得较好,这就是过拟合的特征
在这里插入图片描述

像这样展示了数据数量和精度的图称为学习曲线
知道模型精度低,却不知道是过拟合还是欠拟合时画一下学习曲线就好了
通过学习曲线判断出是过拟合还是欠拟合之后,就可以采取相应的对策以便改进模型了。

实现

应用正则化(只需修改一下学习部分)

并且通过比较过拟合时图的状态和应用了正则化后图的状态,具体总结出正则化对模型施加了什么样的影响(特意弄出一个过拟合的状态,减少训练数据、增加训练次数)
比如这个函数(在此之前先在训练集加入一点噪声的训练数据)
在这里插入图片描述

import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt# 真正的函数
def g(x):return 0.1 * (x ** 3 + x ** 2 + x)
# 随意准备一些向真正的函数加入了一点噪声的训练数据
train_x = np.linspace(-2, 2, 8)
train_y = g(train_x) + np.random.randn(train_x.size) * 0.05
# 绘图确认
x = np.linspace(-2, 2, 100)
plt.plot(train_x, train_y, 'o')
plt.plot(x, g(x), linestyle='dashed')
plt.ylim(-1, 2)
plt.savefig('AI15.png')

在这里插入图片描述
虚线就是正确的g(x)的图形,圆点就是加入了一点噪声的训练数据(8个)

假设用10次多项式来学习这个训练数据。首先编写从创建训练数据的矩阵到预测函数的定义为止的代码:

# 标准化
mu = train_x.mean()
sigma = train_x.std()
def standardize(x):return (x - mu) / sigmatrain_z = standardize(train_x)# 创建训练数据的矩阵
def to_matrix(x):return np.vstack([np.ones(x.size),x,x ** 2,x ** 3,x ** 4,x ** 5,x ** 6,x ** 7,x ** 8,x ** 9,x ** 10,]).TX = to_matrix(train_z)# 参数初始化
theta = np.random.randn(X.shape[1])# 预测函数
def f(x):return np.dot(x, theta)

不应用正则化的实现

实现学习部分:
首先是不应用正则化的状态, η 值和学习的结束条件是根据之前多次尝试的结果来决定的

# 目标函数
def E(x, y):return 0.5 * np.sum((y - f(x)) ** 2)# 学习率
ETA = 1e-4
# 误差
diff = 1
# 重复学习
error = E(X, train_y)
while diff > 1e-6:theta = theta - ETA * np.dot(f(X) - train_y, X)current_error = E(X, train_y)diff = error - current_errorerror = current_error# 对结果绘图
z = standardize(x)
plt.plot(train_z, train_y, 'o')
plt.plot(z, f(to_matrix(z)))
plt.savefig('AI16.png')

在这里插入图片描述

图像看上去歪歪扭扭是因为发生了过拟合的状态。
由于参数的初始值是随机数,所以每次执行时这个图的形状都不一样。
但是,从该图中也能看出它与g(x) 相差很远。
如果应用了正则化,这个图就会变好一点:( λ的值也是根据我之前多次尝试的结果来决定的。)

# 保存未正则化的参数,然后再次参数初始化
theta1 = theta
theta = np.random.randn(X.shape[1])# 正则化常量
LAMBDA = 1# 误差
diff = 1# 重复学习(包含正则化项)
error = E(X, train_y)
while diff > 1e-6:# 正则化项。偏置项不适用正则化,所以为0reg_term = LAMBDA * np.hstack([0, theta[1:]])# 应用正则化项,更新参数theta = theta - ETA * (np.dot(f(X) - train_y, X) + reg_term)current_error = E(X, train_y)diff = error - current_errorerror = current_error# 对结果绘图
plt.plot(train_z, train_y, 'o')
plt.plot(z, f(to_matrix(z)))
plt.savefig('AI17.png')

在这里插入图片描述

为了便于比较,把

未应用和应用了正则化这两种情况展示在一张图上

虚线是未应用正则化的情况,而实线是应用了正则化的情况:
在这里插入图片描述
完整代码:

import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt# 真正的函数
def g(x):return 0.1 * (x ** 3 + x ** 2 + x)
# 随意准备一些向真正的函数加入了一点噪声的训练数据
train_x = np.linspace(-2, 2, 8)
train_y = g(train_x) + np.random.randn(train_x.size) * 0.05
# # 绘图确认
x = np.linspace(-2, 2, 100)
# plt.plot(train_x, train_y, 'o')
# plt.plot(x, g(x), linestyle='dashed')
# plt.ylim(-1, 2)
# plt.savefig('AI15.png')# 标准化
mu = train_x.mean()
sigma = train_x.std()
def standardize(x):return (x - mu) / sigmatrain_z = standardize(train_x)# 创建训练数据的矩阵
def to_matrix(x):return np.vstack([np.ones(x.size),x,x ** 2,x ** 3,x ** 4,x ** 5,x ** 6,x ** 7,x ** 8,x ** 9,x ** 10,]).TX = to_matrix(train_z)# 参数初始化
theta = np.random.randn(X.shape[1])# 预测函数
def f(x):return np.dot(x, theta)# 目标函数
def E(x, y):return 0.5 * np.sum((y - f(x)) ** 2)# 学习率
ETA = 1e-4
# 误差
diff = 1
# 重复学习
error = E(X, train_y)
while diff > 1e-6:theta = theta - ETA * np.dot(f(X) - train_y, X)current_error = E(X, train_y)diff = error - current_errorerror = current_errorz = standardize(x)
# 对结果绘图
# plt.plot(train_z, train_y, 'o')
# plt.plot(z, f(to_matrix(z)))
# plt.savefig('AI16.png')# 保存未正则化的参数,然后再次参数初始化
theta1 = theta
theta = np.random.randn(X.shape[1])# 正则化常量
LAMBDA = 1# 误差
diff = 1# 重复学习(包含正则化项)
error = E(X, train_y)
while diff > 1e-6:# 正则化项。偏置项不适用正则化,所以为0reg_term = LAMBDA * np.hstack([0, theta[1:]])# 应用正则化项,更新参数theta = theta - ETA * (np.dot(f(X) - train_y, X) + reg_term)current_error = E(X, train_y)diff = error - current_errorerror = current_error# 对结果绘图
# plt.plot(train_z, train_y, 'o')
# plt.plot(z, f(to_matrix(z)))
# plt.savefig('AI17.png')# 保存应用了正则化的参数
theta2 = theta
plt.plot(train_z, train_y, 'o')
# 画出未应用正则化的结果
theta = theta1
plt.plot(z, f(to_matrix(z)), linestyle='dashed')
# 画出应用了正则化的结果
theta = theta2
plt.plot(z, f(to_matrix(z)))
plt.savefig('AI18.png')

相关文章:

【机器学习-模型评估】

“评估”已建立的模型 在进行回归和分类时,为了进行预测,定义了预测函数fθ(x) 然后根据训练数据求出了预测函数的参数θ(即对目标函数进行微分,然后求出参数更新表达式的操作) 之前求出参数更新表达式之后就结束了。但是,其实我…...

19681 01背包

19681 01背包 ⭐️难度:中等 🌟考点:动态规划、01背包 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int N 10001…...

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测 目录 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预…...

基于CAMEL 的Workforce 实现多智能体协同工作系统

文章目录 一、workforce 简介1.架构设计2.通信机制 二、workforce 工作流程图示例1.用户角色2.工作流程 三、workforce 中重要函数说明1.__init__函数2.add_single_agent_worker 函数3.add_role_playing_worker 函数4.add_workforce 函数 四、基于workforce实现多智能体协调&am…...

炫酷的3D按钮效果实现 - CSS3高级特性应用

炫酷的3D按钮效果实现 - CSS3高级特性应用 这里写目录标题 炫酷的3D按钮效果实现 - CSS3高级特性应用项目介绍核心技术实现1. 基础结构设计2. 视觉效果实现2.1 背景渐变2.2 立体感营造 3. 交互动效设计3.1 悬停效果3.2 按压效果 技术要点分析1. 深度层次感2. 动画过渡3. 性能优…...

AI视频是否会影响原创价值

AI视频是否会影响原创价值 AI视频带来全民创意对原创内容的影响 随着AI技术的发展,AI视频技术在视频领域的影响也逐渐凸显,从自动剪辑、特效生成到基于文本或语音自动生成视频内容,这一系列的进步极大地降低了视频制作的技术门槛与成本。这种…...

代码随想录刷题day50|(回溯算法篇)131.分割回文串▲

目录 一、回溯算法基础知识 二、分割回文串思路 2.1 如何切割 2.2 判断回文 2.3 回溯三部曲 2.4 其他问题 三、相关算法题目 四、总结 一、回溯算法基础知识 详见:代码随想录刷题day46|(回溯算法篇)77.组合-CSDN博客 二、分割回文…...

SpringCloud 学习笔记3(OpenFeign)

OpenFeign 微服务之间的通信方式,通常有两种:RPC 和 HTTP。 简言之,RPC 就是像调用本地方法一样调用远程方法。 在 SpringCloud 中,默认是使用 HTTP 来进行微服务的通信,最常用的实现形式有两种: RestTem…...

Python与区块链隐私保护技术:如何在去中心化世界中保障数据安全

Python与区块链隐私保护技术:如何在去中心化世界中保障数据安全 在区块链世界里,透明性和不可篡改性是两大核心优势,但这也带来了一个悖论——如何在公开账本的同时保障用户隐私?如果你的交易记录对所有人可见,如何防止敏感信息泄露? Python 作为区块链开发中最受欢迎的…...

基于32单片机的无人机直流电机闭环调速系统设计

标题:基于32单片机的无人机直流电机闭环调速系统设计 内容:1.摘要 本文针对无人机直流电机调速需求,设计了基于32单片机的无人机直流电机闭环调速系统。背景在于无人机应用场景不断拓展,对电机调速精度和稳定性要求日益提高。目的是开发一套高精度、响应…...

QT 图表(拆线图,栏状图,饼状图 ,动态图表)

效果 折线图 // 创建折线数据系列// 创建折线系列QLineSeries *series new QLineSeries;// series->append(0, 6);// series->append(2, 4);// series->append(3, 8);// 创建图表并添加系列QChart *chart new QChart;chart->addSeries(series);chart->setTit…...

预测性维护:Ubuntu边缘计算机如何降低电梯故障率

在现代城市中,电梯作为垂直交通的重要工具,其运行状态直接关系到人们的出行安全和效率。传统的电梯监控系统往往依赖于中心化的数据处理,存在响应慢、数据量大、实时性差等问题。而边缘协议网关(Edge Protocol Gateway&#xff09…...

MyBatis plus详解

核心功能 代码生成器 它能够依据数据库表结构,自动生成涵盖实体类、Mapper 接口、Mapper XML 文件、Service 接口与实现类等在内的基础代码。开发人员只需简单配置数据库连接信息、表名以及生成代码的相关参数,即可快速生成符合项目规范的基础代码&…...

【数据挖掘】数据预处理——以鸢尾花数据集为例

数据预处理——以鸢尾花数据集为例 一、实验手册(一)实验目的(二)实验原理(三)实验环境(四)实验步骤(五)实验报告要求 二、案例代码(以鸢尾花数据…...

根据文件名称查询文件所在位置

在 Linux 中,根据文件名称查询文件所在位置主要通过命令行工具实现,以下是几种常用方法: --- ### **1. 使用 find 命令(最灵活)** find 命令可以递归搜索指定目录下的文件,支持按名称、类型、时间等条件过…...

记一次wsl2+docker无法运行的经历

前情提要 由于某个大创项目的需要和对猫娘机器人的迫切渴求(bushi 需要在电脑里面安装docker desktop。由于电脑里面安装了wsl2环境 因此决定使用wsl2dockerdesktop的方式配置docker 遇到的问题 在像往常一样安装docker desktop并且启动时 提示错误: …...

XSS介绍通关XSS-Labs靶场

目录 XSS XSS的类型 1.存储型XSS(PXSS): 2. 反射型XSS(N-PXSS): 3. DOM型XSS: 4. 突变型XSS(mXSS): 5. 通用型XSS(UXSS)&#x…...

枚举的定义及其使用

在Java中,enum(枚举)是一个特殊的类,用于表示一组常量。enum类型在Java中提供了一种类型安全的方式来定义常量,相比传统的常量(如public static final变量),它更加简洁、类型安全&am…...

[特殊字符][特殊字符][特殊字符][特殊字符][特殊字符][特殊字符]壁紙 流光染墨,碎影入梦

#Cosplay #🧚‍♀️Bangni邦尼🐰. #📷 穹妹 Set.01 #后期圈小程序 琼枝低垂,霜花浸透夜色,风起时,微光轻拂檐角,洒落一地星辉。远山隐于烟岚,唯余一抹青黛,勾勒出天光水…...

996引擎-接口测试:消息Tips

996引擎-接口测试:消息Tips 发送视野内广播消息 sendrefluamsg发送聊天框消息 sendmsg发送地图消息 sendmapmsg打印消息到控制台 release_print发送自定义颜色的文字信息 guildnoticemsg测试NPC参考资料发送视野内广播消息 sendrefluamsg function npc_test_onclick1(player)-…...

Redis设计与实现-底层实现

Redis底层实现 1、事件1.1 文件事件1.2 时间事件1.3 事件调度 2、Redis客户端2.1 客户端的相关属性2.2 客户端的创建与关闭2.2.1 普通客户端的创建2.2.2 普通客户端的关闭2.2.3 AOF的伪客户端2.2.4 Lua脚本的伪客户端 3、Redis服务端3.1 命令请求的执行过程3.1.1 客户端发送命令…...

acwing1295. X的因子链

题目链接:1295. X的因子链 - AcWing题库 算法:数论线性筛法求素数 x如果想要尽可能多的分为几个因子,那么就应该分成素数,因为如果是合数说明还能分。 题目要求求出①这段序列的最大长度和②最大长度序列的个数 最大长度&#x…...

练习-班级活动(map存储键值对)

问题描述 小明的老师准备组织一次班级活动。班上一共有 n 名 (n 为偶数) 同学,老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 n 以内的正整数作为 id,第 i 名同学的 id 为 ai​。 老师希望…...

34-三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 方法一&…...

Excel online开始支持Copilot高级数据分析:Python提供强大的数据见解

前文讲过Excel中的copilot可以直接调用Python进行高级数据分析: Copilot:Excel中的Python高级分析来了 Python in Excel高级分析:一键RFM分析 超越DeepSeek:Copilot in Excel高级数据分析原生支持Python无需安装软件 零代码、…...

【数据结构】kmp算法介绍+模板代码

目录 1.kmp算法介绍 2.应用场景 3.KMP与暴力算法比较 4.模板代码 KMP算法是一种高效的字符串匹配算法,用于在文本串中快速查找模式串的所有出现位置。其核心思想是通过预处理模式串,避免在匹配失败时进行不必要的回溯,从而将时间复杂度优…...

python关键字汇总

文章目录 1. 变量与类型相关2. 控制流相关3. 函数与类相关4. 异常处理相关5. 模块相关6. 其他 在 Python 3 里有 35 个关键字,它们各自具备特定的用途与意义 1. 变量与类型相关 True、False 意义:布尔类型的常量,分别代表逻辑真与逻辑假。示…...

六十天前端强化训练之第二十五天之组件生命周期大师级详解(Vue3 Composition API 版)

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 一、生命周期核心知识 1.1 生命周期全景图 1.2 生命周期钩子详解 1.2.1 初始化阶段 1.2.2 挂载阶段 1.2.3 更新阶段 1.2.4 卸载阶段 1.3 生命周期执行顺序 1.4 父子组…...

油候插件、idea、VsCode插件推荐(自用)

开发软件: 之前的文章: 开发必装最实用工具软件与网站 推荐一下我使用的开发工具 目前在用的 油候插件 AC-baidu-重定向优化百度搜狗谷歌必应搜索_favicon_双列 让查询变成多列,而且可以流式翻页 Github 增强 - 高速下载 github下载 TimerHo…...

R语言基于ggscitable包复现一篇3.5分的文章的连续变量交互效应(交互作用)的可视化图

交互作用效应(p for Interaction)在SCI文章中可以算是一个必杀技,几乎在高分的SCI中必出现,因为把人群分为亚组后再进行统计可以增强文章结果的可靠性,进行可视化后可以清晰的表明变量之间的关系。不仅如此,交互作用还可以使用来进…...

mac环境下chatwoot客服聊天docker本地部署+对接通义千问Qwen2.5

🚀 安装docker-desktop 🚀 定义一个.env环境变量文件docker-compose.yaml .env # Learn about the various environment variables at # https://www.chatwoot.com/docs/self-hosted/configuration/environment-variables/#rails-production-variables…...

mac上安装nvm及nvm的基本语法使用!!

种一棵树,最好是十年前,其次是现在!想要改变,从此刻开始,一切都不晚! 目录 nvm是什么?前提条件:安装homebrew如果系统已经有node版本:在mac上安装nvm:用nvm安…...

论文阅读:2024-NAACL Semstamp、2024-ACL (Findings) k-SemStamp

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Semstamp: A semantic watermark with paraphrastic robustness for text generation https://aclanthology.org/2024.naacl-long.226/ k-SemStamp: A Clustering-Based Semantic Wate…...

本地JAR批量传私服

在有网络隔离的环境下,Maven项目如果没有搭建私服就得把用到的通用组件通过U盘在每个组员间拷贝来拷贝去。非常的麻烦跟低效。搭建私服,如果通用组件很多的时候手工一个一个上传更是非常的麻烦跟低效; 我就遇上这问题,跟A公司合作…...

Linux上位机开发实战(camera视频读取)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 关于linux camera,一般都是认为是mipi camera,或者是usb camera。当然不管是哪一种,底层的逻辑都是v4l2&#x…...

OpenCV图像处理基础1

OpenCV 提供了丰富的图像处理和计算机视觉功能,包括图像读取、显示、颜色空间转换、滤波、边缘检测、轮廓检测等。 本章将介绍 OpenCV 的基本概念和常用功能。 图像的表示和处理 OpenCV 通过 NumPy 数组 来表示图像数据,每个图像就是一个多维数组,其中每个元素对应图像中的…...

Python Web 框架 Django、Flask 和 FastAPI 对比

在探索 Python Web 框架时,Django、Flask 和 FastAPI 无疑是最常被提及的名字。根据我们最新的 Python 开发者调查,这三大框架继续稳坐后端 Web 开发的热门宝座。它们均为开源项目,并且与 Python 的最新版本无缝兼容。然而,面对不…...

TISAX认证注意事项的详细介绍

TISAX(Trusted Information Security Assessment Exchange)认证的注意事项犹如企业在信息安全领域航行时必须遵循的灯塔指引,至关重要且不容忽视。以下是对TISAX认证注意事项的详尽阐述: 首先,企业需深入研读并理解TI…...

JavaScript |(六)DOM事件 | 尚硅谷JavaScript基础实战

学习来源:尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 笔记来源:在这位大佬的基础上添加了一些东西,欢迎大家支持原创,大佬太棒了:JavaScript |(六)DOM事件 | 尚硅谷JavaScript基础…...

【动态规划】详解混合背包问题

目录 1. 前置文章2. 题目3. 小结 1. 前置文章 本文前置文章: 【动态规划】详解 0-1背包问题【动态规划】详解完全背包问题【动态规划】详解分组背包问题【动态规划】详解多重背包问题 下面是三种背包模式的区别: 0 - 1 背包 是说:有 n 个…...

Nodejs 项目打包部署方式

方式一:PM2 一、准备工作 确保服务器上已安装 Node.js 环境建议使用 PM2 进行进程管理(需要额外安装) 二、部署步骤 1.首先在服务器上安装 PM2(推荐): npm install -g pm22.将项目代码上传到服务器&…...

银河麒麟操作系统的上下游版本判断

以下内容摘自《银河麒麟操作系统进阶应用》一书。 几百款Linux发行版之间并不是完全独立的,绝大多数Linux发行版可以追溯到几个关键的“祖先”发行版,其中最为人熟知的包括Debian、Fedora、Slackware和Arch Linux。这些“祖先”发行版又称“原始”发行版…...

Retrofit中scalars转换html为字符串

简介 在Retrofit中,如果你想直接获取HTML或其他文本格式的响应内容而不是将其映射到一个模型类,ScalarsConverterFactory 就派上用场了。ScalarsConverterFactory 是一个转换器工厂,它能够将响应体转换为Java基本类型如String、Integer或Byte…...

Java基础面试题学习

转换成自已的语言来回答,来源小林coding、沉默王二以及其它资源和自已改编。 1、概念 1、说一下Java的特点 我认为Java有很多特点 首先是平台无关性:Java可以实现一次编译到处运行,因为Java的编译器将源代码编译成字节码,使得该…...

# [RPA] 使用八爪鱼进行高效网页数据采集

在许多行业中,数据是核心资产。然而,虽然许多网站的文本内容可以免费访问,但手动一条一条采集,不仅耗时耗力,还容易出错。这种情况下,使用自动化工具来提高采集效率就显得尤为重要。本文将介绍 八爪鱼 这一…...

【工具变量】全国地级市地方ZF债务数据集(2014-2023年)

地方ZF债务是地方财政运作的重要组成部分,主要用于基础设施建设、公共服务及经济发展,是衡量地方财政健康状况的重要指标。近年来,我国地级市的地方ZF债务规模不断变化,涉及一般债务和专项债务等多个方面,对金融市场、…...

6.5840 Lab 3: Raft

论文很重要 raft-zh_cn/raft-zh_cn.md at master maemual/raft-zh_cn GitHub Part 3A: leader election (moderate) 十次test都过了 实现 Raft 的领导者选举和心跳机制(AppendEntries RPC,无日志条目)。第 3A 部分的目标是实现以下功能&am…...

DCDC36V同步降压 输出可调 2A电流恒压芯片SL1588H 替换LV3842

在当今电子设备飞速发展的时代,电源管理芯片的性能优劣直接关乎设备的稳定性与高效运行。对于诸多需要将 36V 电压进行同步降压、输出电压可调且稳定输出 2A 电流的应用场景,一款卓越的恒压芯片不可或缺。SL1588H 正凭借其领先的技术和出色的性能&#x…...

AH4953A双PMOS管深度解析:无线充系统的“高效开关”设计实践

AH4953 30v5A双PMOS管深度解析:无线充系统的“高效开关”设计实践 1. 产品定位与基础特性 AH4953A双通道P沟道MOSFET,专为无线充电、电源管理等高频开关场景优化。其核心优势体现在: • 高耐压低损耗:30V漏源电压(Vd…...

图数据库Neo4j和JDK安装与配置教程(超详细)

目录 前言 一、Java环境配置 (一)JDK的下载与安装 (二)JDK环境配置 (三)检测JDK17是否配置成功 二、Neo4j的安装与配置 (一)Neo4j的下载与安装 (二)N…...