模型评估与调优(PyTorch)
文章目录
- 模型评估方法
- 混淆矩阵
- 混淆矩阵中的指标
- ROC曲线(受试者工作特征)
- AUC
- R平方
- 残差
- 均方误差(MSE)
- 均方根误差(RMSE)
- 平均绝对误差(MAE)
- 模型调优方法
- 交叉验证(CV)
- 交叉验证方法
- Holdout验证
- K折交叉验证
- 留一验证
- 十折交叉验证
- 网格搜索交叉验证
- 随机搜索
- PyTorch实现交叉验证
- 源代码地址
- 代码内容
- 准确度为0的问题分析和解决
- 解决方法:
- ❌ 原始错误原因分析
- 1. 数据分布不合理
- 2. 训练集和验证集无区分性
- 3. 模型无法收敛到有效解
- ✅ 修改后为何能解决问题?
- 📌 总结
模型评估方法
混淆矩阵
- 混淆矩阵是机器学习中统计分类模型预测结果的表,它以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别进行汇总,其中矩阵的行表示真实值,矩阵的列表示模型的预测值。
- 在机器学习中,正样本就是使模型得出正确结论的例子,负样本是使得模型得出错误结论的例子。
- 建立一个二分类的混淆矩阵,假如宠物店有10只动物,其中6只狗,4只猫,现在有一个分类器将这10只动物进行分类,分类结果为5只狗,5只猫,分类结果的混淆矩阵为:
混淆矩阵 | 预测值:正(狗) | 预测值:负(猫) |
---|---|---|
真实值:正(狗) | 5 | 1 |
真实值:负(猫) | 0 | 4 |
混淆矩阵中的指标
- TP(TruePositive):被判定为正样本,事实上也是正样本。真的正样本也叫真阳性。
- FN(FalseNegative):被判定为负样本,但事实上是正样本。假的负样本也叫假阴性。
- FP(FalsePositive):被判定为正样本,但事实上是负样本。假的正样本也叫假阳性。
- TN(TrueNegative):被判定为负样本,事实上也是负样本。真的负样本也叫真阴性。
混淆矩阵 | 预测值:正(狗) | 预测值:负(猫) |
---|---|---|
真实值:正(狗) | TP | FN |
真实值:负(猫) | FP | TN |
ROC曲线(受试者工作特征)
- ROC曲线的全称是“受试者工作特征”,常用来衡量分类学习器的好坏。如果一个学习器的ROC曲线能将另一个学习器的ROC曲线完全包括,则说明该学习器的性能优于另一个学习器。ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。
- ROC曲线的横轴表示FPR,即错误地预测为正例的概率,纵轴表示TPR,即正确地预测为正例的概率,二者的计算公式如下:
F P R = F P F P + T N T P R = T P T P + F N FPR=\frac{FP}{FP+TN} \qquad TPR=\frac{TP}{TP+FN} FPR=FP+TNFPTPR=TP+FNTP
AUC
- AUC是一个数值,它是ROC曲线与坐标轴围成的面积。TPR越大、FPR越小,模型效果越好,ROC曲线就越靠近左上角,表明模型效果越好,AUC值越大,极端情况下为1。由于ROC曲线一般都处于 y = x y=x y=x直线的上方,因此 A U C AUC AUC的取值范围一般在 0.5 0.5 0.5和 1 1 1之间。
- 在部分场景下ROC曲线不能直观说明分类器的效果,使用AUC值作为评价标准可以只管说明分类器的效果。
- AUC值越大,当前的分类算法越有可能将正样本排在负样本前面,即能够更好地分类,可以从AUC判断分类器(预测模型)优劣的标准。
- UC=1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合不存在完美分类
- 0.5<AUC<1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,有预测价值。
- AUC=0.5,跟随机猜测一样,模型没有预测价值。
- AUC<0.5,比随机猜测还差
R平方
- 判定系数R平方(决定系数)是指在线性回归中,回归可解释离平方和与总离差平方和的比值,其数值等于相关系数R的平方。
- 判定系数是一个解释性系数,在回归分析中,其主要作用是评估回归模型对因变量y产生变化的解释程度(判定系数R平方是评估模型好坏的指标)。
- R平方的取值范围为 0 1 0~1 0 1,通常以百分数表示,如回归模型的R平方等于 0.7 0.7 0.7,那么表示此回归模型对预测结果的可解释程度为70%。一般认为,R平方大于0.75,表示模型拟合度很好,可解释程度较高;R平方小于0.5,表示模型拟合有问题,不宜进行回归分析。
-
问题: 在多元回归中,R²(判定系数)有一个明显缺点:只要增加自变量(哪怕是不相关的变量),R²就会变大。这会导致模型看起来拟合得很好,但实际上可能加入了无用的变量,反而降低了模型的可靠性。
-
解决方法:为了修正这个问题,我们使用调整后的R²。它会根据样本量(n)和自变量个数(k)自动惩罚无意义的变量,避免R²被高估。计算公式如下:
调整后的 R 2 = 1 − ( 1 − R 2 ) × n − 1 n − k − 1 \text{调整后的} R^2 = 1 - (1 - R^2) \times \frac{n-1}{n-k-1} 调整后的R2=1−(1−R2)×n−k−1n−1
关键点:
- R²的缺陷:单纯增加变量就会提高R²,即使变量没用。
- 调整原理:公式中的 n − 1 n − k − 1 \frac{n-1}{n-k-1} n−k−1n−1 会惩罚变量过多的模型(k越大,分母越小,整体值越大,从而降低R²)。
- 效果:只有真正有用的变量才会提升调整后的R²,垃圾变量会被过滤掉。
-
在回归分析(尤其是多元回归)中,调整后的R²比普通R²更准确,因为它会惩罚无用的自变量,避免模型“虚高”的拟合效果。因此,我们通常用调整后的R²来评估模型的真实拟合度。
-
调整后的R²是否合格?临界值:0.5
- 如果调整后的R² ≥ 0.5,说明模型拟合效果尚可。
- 如果调整后的R² < 0.5,说明模型解释力较弱,需要检查: 已使用的自变量是否真的影响因变量?是否遗漏了重要的自变量?
残差
- 残差在数理统计中指实际观测值估计值之间的差,它蕴涵了有关模型基本假设的重要信息。如果回归模型正确的话,可以将残差看作误差的观测值。
- 回归算法的残差评价指标有均方误差(Mean Squared Error,MSE)、均方根误差(Root Mean Square Error,RMSE),平均绝对误差(Mean Absolute Error,MAE)。
均方误差(MSE)
- 均方误差(MSE)表示预测值和观测值之间差异(残差平方)的平均值。(线性回归的损失函数,线性回归的目的就是让这个损失函数的数值最小。)
M S E = 1 m ∑ i = 1 m ( y ^ i − y i ) 2 MSE=\frac{1}{m}\sum_{i=1}^{m}(\hat y_i-y_i)^2 MSE=m1i=1∑m(y^i−yi)2
均方根误差(RMSE)
- 均方根误差(RMSE)表示预测值和观测值之间差异(残差)的样本标准差。
R M S E = M S E = 1 m ∑ i = 1 m ( y ^ i − y i ) 2 RMSE=\sqrt{MSE}=\sqrt{\frac{1}{m}\sum_{i=1}^{m}(\hat y_i-y_i)^2} RMSE=MSE=m1i=1∑m(y^i−yi)2
平均绝对误差(MAE)
- 平均绝对误差(MAE)表示预测值和观测值之间绝对误差的平均值。MAE是一种线性分数,所有个体差异在平均值上的权重都相等,而RMSE相比MAE,会对高的差异惩罚更多。
M A E = 1 m ∑ i = 1 m ∣ y ^ i − y i ∣ MAE=\frac{1}{m}\sum_{i=1}^{m}|\hat y_i - y_i| MAE=m1i=1∑m∣y^i−yi∣
模型调优方法
交叉验证(CV)
- 交叉验证(Cross Validation,CV)或者循估计,是一种统计学上将数据样本切割成较小子集的实用方法,主要用于数据建模。
- 交叉验证的基本思想:将原始数据进行分组,一部分作为训练集,另外一部分作为验证集。首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型,以此评价分类器的性能指标,使用交叉验证的目的得到可到稳定的模型。
交叉验证方法
Holdout验证
- Holdout验证将原始数据随机分为两组,一组作为训练集,另一组作为验证集,利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率,以此作为分类器的性能指标。
K折交叉验证
- K折交叉验证将初始采样分割成K个子样本,一个单独的子样本被保留作为验证模型的数据,其他K-1个样本用来训练。交叉验证重复K次,每个子样本验证一次,平均K次的结果,最终得到一个单一估测。优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次。
留一验证
- 留一验证指只使用原本样本中的一项当作验证数据,而剩余的则留下当作训练数据。这个步骤一直持续到每个样本都被当作一次验证数据。事实上,这等同于K折交叉验证,其中K为原样本个数。
十折交叉验证
- 十折交叉验证用来测试算法的准确性。将数据集分成10份,轮流将其中9份作为训练数据,1份作为测试数据。每次试验都会得出相应的正确率。10次结果的正确率的平均值作为算法精度的估计,一般还需要进行多次10折交叉验证(例如10次10折交叉验证),再求其均值,作为算法的最终准确性估计。
网格搜索交叉验证
- 网格搜索交叉验证(GridSearchC):部分:网格搜索(GridSearch)和交叉验证(CV)。网格搜索搜索的是参数,即在指定的参数范围内,按步长依次调整参数,利用调整的参数训练模型,从所有的参数中找到在验证集上精度最高的,这其实是一个训练和比较的过程。
- 网格搜索可以保证在指定的参数范围内找到精度最高的参数,它要求遍历所有可能的参数的组合,在面对大数据集和多参数的情况下,非常耗时。所以网格搜索适用于三四个(或者更少)超参数,用户列出一个较小的超参数值域,这些超参数值域的笛卡儿积为一组超参数。
随机搜索
- 在搜索超参数时,如果超参数个数较少可以采用网格搜索。但当超参数个数比较多时,如果仍然采用网格搜索,搜索时间将呈指数上升。随机搜索的方法,随机在超参数空间中搜索几十甚至几百个点,其中就有可能有比较小的值。
- 随机搜索不是尝试所有可能的组合,而是通过选择每一个超参数的一个随机值的特定数量的随机组合,方便通过设定搜索次数控制超参数搜索的计算量等。对于有连续变量的参数,随机搜索会将其当成一个分布进行采样。
PyTorch实现交叉验证
源代码地址
- 交叉验证源代码地址
代码内容
import torch
from torch import nn
from torch.utils.data import DataLoader, TensorDataset
import torch.nn.functional as f# 构造训练集
train_x = torch.rand(100, 28, 28)
train_y = torch.randn(100, 28, 28)
train_x = torch.cat((train_x, train_y), dim=0)
# 构造标签 前100个元素为1 后100个元素为0
labels = [1] * 100 + [0] * 100
# 将标签列转为张量
labels = torch.tensor(labels, dtype=torch.long)# 设置网络结构
"""
__init__方法中定义三个全连接层:fc1、fc2和fc3。
forward方法实现前向传播过程,对输入数据进行展平,通过全连接层和激活函数进行处理。
num_flat_features方法用于计算输入数据的展平特征数量。
"""
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.fc1 = nn.Linear(28 * 28, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 2)def forward(self, x):# 将输入张量x展平为一维张量,并计算展平后的特征数量x = x.view(-1, self.num_flat_features(x))x = f.relu(self.fc1(x))x = f.relu(self.fc2(x))x = self.fc3(x)return x# 计算输入x的展平特征数量的函数def num_flat_features(self, x):size = x.size()[1:] # 获取输入x除了第一个维度外的尺寸num_features = 1 # 初始化特征数量为1for s in size: # 遍历尺寸列表num_features *= s # 计算特征数量return num_features # 返回特征数量# 训练集数据处理
class train_data_set(TensorDataset):def __init__(self, train_features, train_labels):self.x_data = train_features # 保存训练特征self.y_data = train_labels # 保存训练标签self.len = len(train_labels) # 保存训练样本数量# 获取训练数据def __getitem__(self, index):return self.x_data[index], self.y_data[index]# 获取训练数据数量def __len__(self):return self.len# 设置损失函数
loss_func = nn.CrossEntropyLoss()"""
get_k_fold_data函数用于将数据集分为K折,并返回当前折的训练集数据、训练集标签、验证集数据和验证集标签。
"""# 设置k划分
def get_k_fold_data(k, i, x, y):"""获取k折交叉验证数据:param k: 折数:param i: 当前折的索引:param x: 输入的数据:param y: 标签:return:x_train(torch.Tensor):训练集数据y_train(torch.Tensor):训练集标签x_valid(torch.Tensor):验证集数据y_valid(torch.Tensor):验证集标签"""assert k > 1fold_size = x.shape[0] // k # 每折的大小x_train, y_train = None, Nonefor j in range(k):idx = slice(j * fold_size, (j + 1) * fold_size)x_part, y_part = x[idx, :], y[idx]if j == i:x_valid, y_valid = x_part, y_partelif x_train is None:x_train, y_train = x_part, y_partelse:x_train = torch.cat((x_train, x_part), dim=0)y_train = torch.cat((y_train, y_part), dim=0)return x_train, y_train, x_valid, y_valid"""
k_fold函数则在K折交叉验证中循环训练模型,并计算和累积每折的训练集和验证集的损失与准确度。
"""
def k_fold(k, x_train, y_train, num_epochs=3, learning_rate=0.001, weight_decay=0.1, batch_size=5):"""进行k折验证:param k: 折数:param x_train: 训练数据:param y_train: 训练标签:param num_epochs: 训练轮数 默认值为3:param learning_rate: 学习率 默认值为0.001:param weight_decay: 权重衰减 默认值为0.1:param batch_size: 批次大小 默认为5:return:train_loss_sum(float):训练集损失总和valid_loss_sum(float):验证集损失总和train_acc_sum(float):训练集准确度总和valid_acc_sum(float):验证集准确度总和"""train_loss_sum, valid_loss_sum = 0.0, 0.0train_acc_sum, valid_acc_sum = 0.0, 0.0for i in range(k):data = get_k_fold_data(k, i, x_train, y_train)net = Net() # 创建网络实例train_ls, valid_ls = train(net, *data, num_epochs, learning_rate, weight_decay, batch_size)print('*' * 10, '第', i + 1, '折', '*' * 10)print('训练集损失:%.6f' % train_ls[-1][0], '训练集准确度:%.4f' % valid_ls[-1][1],'测试集损失:%.6f' % valid_ls[-1][0], '测试集准确度:%.4f' % valid_ls[-1][1])train_loss_sum += train_ls[-1][0]valid_loss_sum += valid_ls[-1][0]train_acc_sum += train_ls[-1][1]valid_acc_sum += valid_ls[-1][1]print('#' * 5, '最终k折交叉验证结果', '#' * 5)print('训练集累积损失:%.4f' % (train_loss_sum / k), '训练集累积准确度:%.4f' % (train_acc_sum / k),'测试集累积损失:%.4f' % (valid_loss_sum / k), '测试集累积准确度:%.4f' % (valid_acc_sum / k))return train_loss_sum, valid_loss_sum, train_acc_sum, valid_acc_sum# 设置训练函数def train(net, train_features, train_labels, test_features, test_labels, num_epochs, learning_rate, weight_decay,batch_size):"""设置训练函数:param net: 神经网络模型:param train_features: 训练数据特征:param train_labels: 训练数据标签:param test_features: 测试数据特征:param test_labels: 测试数据标签:param num_epochs: 训练轮数:param learning_rate: 学习率:param weight_decay: 权重衰减:param batch_size: 批次大小:return:train_ls: 训练集的损失和准确度损失test_ls: 测试集的损失和准确度列表"""# 初始化训练集和测试集的损失和准确度列表train_ls, test_ls = [], []# 创建训练数据集和数据加载器dataset = train_data_set(train_features, train_labels)train_iter = DataLoader(dataset, batch_size, shuffle=True)# 创建优化器optimizer = torch.optim.Adam(params=net.parameters(), lr=learning_rate, weight_decay=weight_decay)# 遍历每个训练轮次for epoch in range(num_epochs):# 遍历每个批次for X, y in train_iter:output = net(X)loss = loss_func(output, y)optimizer.zero_grad()loss.backward()optimizer.step()# 将当前轮次的训练集损失和准确度添加到列表train_ls.append(log_rmse(0, net, train_features, train_labels))# 测试集损失和准确度添加到列表中if test_labels is not None:test_ls.append(log_rmse(1, net, test_features, test_labels))# 返回训练集和测试集的损失和准确度列表return train_ls, test_ls# 设置准确度计算函数
def log_rmse(flag, net, x, y):"""计算对数均方根误差和准确度的函数:param flag: 0表示训练集,1表示测试集:param net: 评估的模型:param x: 数据特征:param y: 数据标签:return:loss.data.item(): 损失值accuracy: 准确度"""# 如果是测试集,设置网络为评估模式if flag == 1:net.eval()# 前向传播 获取预测结果output = net(x)result = torch.max(output, 1)[1].view(y.size())# 计算正确预测的数量corrects = (result.data == y.data).sum().item()# 计算准确度accuracy = corrects * 100.0 / len(y)# 计算损失loss = loss_func(output, y)# 如果是测试集,设置网络为训练模式net.train()return loss.data.item(), accuracyif __name__ == '__main__':"""执行k折交叉验证"""# 调用交叉验证函数k_fold(10, train_x, labels)
********** 第 1 折 **********
训练集损失:0.039320 训练集准确度:100.0000 测试集损失:0.024422 测试集准确度:100.0000
********** 第 2 折 **********
训练集损失:0.042435 训练集准确度:100.0000 测试集损失:0.024841 测试集准确度:100.0000
********** 第 3 折 **********
训练集损失:0.043264 训练集准确度:100.0000 测试集损失:0.024778 测试集准确度:100.0000
********** 第 4 折 **********
训练集损失:0.033361 训练集准确度:100.0000 测试集损失:0.018814 测试集准确度:100.0000
********** 第 5 折 **********
训练集损失:0.039068 训练集准确度:100.0000 测试集损失:0.024000 测试集准确度:100.0000
********** 第 6 折 **********
训练集损失:0.039641 训练集准确度:95.0000 测试集损失:0.370682 测试集准确度:95.0000
********** 第 7 折 **********
训练集损失:0.040322 训练集准确度:95.0000 测试集损失:0.447232 测试集准确度:95.0000
********** 第 8 折 **********
训练集损失:0.038236 训练集准确度:95.0000 测试集损失:0.425054 测试集准确度:95.0000
********** 第 9 折 **********
训练集损失:0.036090 训练集准确度:95.0000 测试集损失:0.414253 测试集准确度:95.0000
********** 第 10 折 **********
训练集损失:0.037329 训练集准确度:100.0000 测试集损失:0.353675 测试集准确度:100.0000
##### 最终k折交叉验证结果 #####
训练集累积损失:0.0389 训练集累积准确度:100.0000 测试集累积损失:0.2128 测试集累积准确度:98.0000
准确度为0的问题分析和解决
********** 第 1 折 ********** 训练集损失:0.690276 训练集准确度:0.0000 测试集损失:0.714697 训练集准确度:0.0000 ********** 第 2 折 ********** 训练集损失:0.686439 训练集准确度:0.0000 测试集损失:0.777147 测试集准确度:0.0000
解决方法:
train_y = torch.rand(100, 28, 28)
将其修改为:
train_y = torch.randn(100, 28, 28)
❌ 原始错误原因分析
1. 数据分布不合理
torch.rand
:生成的是[0, 1)
区间内的均匀分布随机数。torch.randn
:生成的是标准正态分布(均值为0,方差为1)的随机数,取值范围更广。
- 在模型中:模型期望学习区分两类样本(标签为 0 和 1)。如果输入数据(如
train_x
和train_y
)都是从相同分布(如rand
)生成的,那么这两类样本之间没有可区分的特征模式。更严重的是,rand
数据集中在 [0,1] 区间,导致模型输出难以区分两个类别,从而准确率始终为 0。
2. 训练集和验证集无区分性
- 原始
train_x
和train_y
都使用了torch.rand
,它们本质上是同一类数据,只是被人为地赋予了不同的标签。这种构造方式使得模型无法学到任何有意义的分类边界。
3. 模型无法收敛到有效解
- 因为输入数据缺乏类别间的差异性,损失函数无法下降到合理值。准确率一直为 0 是模型无法识别任何样本类别的直接体现。
✅ 修改后为何能解决问题?
将 train_y = torch.rand(100, 28, 28)
改为:
train_y = torch.randn(100, 28, 28)
带来的变化包括:
对比项 | torch.rand | torch.randn |
---|---|---|
分布类型 | 均匀分布 | 正态分布 |
数值范围 | [0, 1) | 大致 [-3, 3] |
样本差异性 | 小 | 大 |
是否适合用于分类任务 | 否 | 是 |
- 通过使用
torch.randn
,train_x
和train_y
的数据分布出现明显差异,这为模型提供了可学习的特征差异。因此,模型可以逐渐学习如何区分这两个类别,准确率也随之提升。
📌 总结
错误点 | 原因 | 影响 | 解决方案 |
---|---|---|---|
使用 torch.rand 构造数据 | 数据分布单一、无类别差异 | 模型无法学习分类边界 | 改用 torch.randn 提供更大差异性 |
缺乏真实数据 | 输入无语义信息 | 模型无法收敛 | 使用真实图像数据(如 MNIST)效果更佳 |
相关文章:
模型评估与调优(PyTorch)
文章目录 模型评估方法混淆矩阵混淆矩阵中的指标ROC曲线(受试者工作特征)AUCR平方残差均方误差(MSE)均方根误差(RMSE)平均绝对误差(MAE) 模型调优方法交叉验证(CV&#x…...
oppo手机安装APK失败报错:安装包异常
如果你的apk文件在oppo手机安装失败了,像这样: 先说我们当时解决方式: 如果还没上架应用市场的测试包,在上面图一中需要关闭“超级守护”,类似华为的纯净模式。如果开启了还还不行,安装页面的报错太笼统不…...
互联网大厂Java面试场景:从缓存到容器化的技术问答
场景:互联网大厂Java面试之旅 面试官:严肃的技术专家 应聘者:搞笑的水货程序员明哥 第一轮:缓存技术与数据库优化 面试官:明哥,你能谈谈Redis的常见使用场景和一些优化技巧吗? 明哥…...
【android bluetooth 协议分析 01】【HCI 层介绍 6】【WriteLeHostSupport命令介绍】
HCI 指令 HCI_Write_LE_Host_Support 是 Bluetooth Host 向 Controller 发送的一条指令,用于启用或禁用主机对 Bluetooth Low Energy(LE)的支持能力。该指令属于 HCI(Host Controller Interface)命令集合中,…...
Helm配置之为特定Deployment配置特定Docker仓库(覆盖全局配置)
文章目录 Helm配置之为特定Deployment配置特定Docker仓库(覆盖全局配置)需求方法1:使用Helm覆盖值方法2: 在Lens中临时修改Deployment配置步骤 1: 创建 Docker Registry Secret步骤 2: 在 Deployment 中引用 Secret参考资料Helm配置之为特定Deployment配置特定Docker仓库(覆…...
项目:在线音乐播放服务器——基于SSM框架和mybatis
介绍项目 项目主要是基于SSM框架和mybatis进行实现 主要的功能: 登陆界面,用户注册,音乐的播放列表,删除指定的歌曲,批量删除指定的歌曲,收藏歌曲,查询歌曲,从收藏列表中删除收藏…...
Linux配置vimplus
配置vimplus CentOS的配置方案很简单,但是Ubuntu的解决方案网上也很多但是有效的很少,尤其是22和24的解决方案,在此我整理了一下我遇到的问题解决方法 CentOS7 一键配置VimForCPP 基本上不会有什么特别难解决的报错 sudo yum install vims…...
Ubuntu22.04开机运行程序
新建启动文件 sudo vim /etc/systemd/system/trojan.service 2. 写入配置文件 [Unit] DescriptionTrojan Proxy Service Afternetwork.target[Service] Typesimple ExecStart/home/cui/Downloads/trojan/trojan -c /home/cui/Downloads/trojan/config.json Restarton-failur…...
高效查询:位图、B+树
1. 位图(BitMap)与布隆过滤器(Bloom Filter) 1.1. 问题背景与解决方案 问题背景 场景:网页爬虫判重 搜索引擎的爬虫会不断地解析网页中的链接并继续爬取。一个网页可能在多个页面中出现,容易重复爬取。…...
HashMap的扩容机制
在添加元素或初始化的时候需要调用resize方法进行扩容,第一次添加数据初始化数组长度为16,以后每次每次扩容都是达到了扩容阈值(数组长度 * 0.75) 每次扩容的时候,都是扩容之前容量的2倍; 扩容之后&#…...
从坏道扫描到错误修复:HD Tune实战指南
一、硬盘检测的必要性 随着计算机使用时间的增加,机械硬盘和固态硬盘都会出现不同程度的性能衰减。定期进行硬盘健康检查可以:及时发现潜在故障;预防数据丢失风险;掌握存储设备实际状态。 二、HD Tune功能解析 性能测试&#x…...
Leetcode 3553. Minimum Weighted Subgraph With the Required Paths II
Leetcode 3553. Minimum Weighted Subgraph With the Required Paths II 1. 解题思路2. 代码实现 题目链接:3553. Minimum Weighted Subgraph With the Required Paths II 1. 解题思路 这一题很惭愧,并没有自力搞定,是看了大佬们的解答才有…...
算法加训之最短路 上(dijkstra算法)
目录 P4779 【模板】单源最短路径(标准版)(洛谷) 思路 743. 网络延迟时间(力扣) 思路 1514.概率最大路径(力扣) 思路 1631.最小体力消耗路径 思路 1976. 到达目的地的方案数 …...
01 Nginx安装及基本配置
01 Nginx安装 # 官网:https://nginx.org/en/ # 点击下载图1 Nginx下载官网 # https://nginx.org/en/download.html # 全是各个平台的源码包图2 Nginx下载版本 # 找到最下面的stable and mainline(稳定版和主线版)图3 找到最下面的稳定版 # https://nginx.org/en/li…...
ABP vNext 多租户系统实现登录页自定义 Logo 的最佳实践
🚀 ABP vNext 多租户系统实现登录页自定义 Logo 的最佳实践 🧭 版本信息与运行环境 ABP Framework:v8.1.5.NET SDK:8.0数据库:PostgreSQL(支持 SQLServer、MySQL 等)BLOB 存储:本地…...
Docker 网络
目录 前言 1. Docker 网络模式 2. 默认 bridge 网络详解 (1)特点 (2)操作示例 3. host 网络模式 (1)特点 (2)操作示例 4. overlay…...
btc交易所关键需求区 XBIT反弹与上涨潜力分析
在加密货币市场的浪潮中,狗狗币(DOGE)近期的走势吸引了众多投资者的目光。根据XBIT分析,狗狗币刚刚踏入关键需求区,此前虽从高点大幅下跌了10%,但XBIT去中心化交易所平台分析师认为,短期内它有望…...
深度剖析:YOLOv8融入UNetv2 SDI模块的性能提升之旅
文章目录 一、引言二、SDI多层次特征融合模块概述(一)背景和动机(二)模块设计原理 三、SDI模块实现(一)关键代码结构(二)代码解析 四、将SDI模块融入YOLOv8(一࿰…...
图像定制大一统?字节提出DreamO,支持人物生成、 ID保持、虚拟试穿、风格迁移等多项任务,有效解决多泛化性冲突。
字节提出了一个统一的图像定制框架DreamO,支持人物生成、 ID保持、虚拟试穿、风格迁移等多项任务,不仅在广泛的图像定制场景中取得了高质量的结果,而且在适应多条件场景方面也表现出很强的灵活性。现在已经可以支持消费级 GPU(16G…...
spark数据处理练习题详解【下】
12. (单选题) def main(args: Array[String]): Unit { println(func1("张三",f1)) } def func1(name:String,fp:(________________)): String { fp(name) } def f1(s:String): String { "welcome "s } 选择填空() A.String>S…...
Vue基础(11)_条件渲染
原生css想让显示的元素隐藏,方式有以下几点: display: none; opacity: 0; visibility: hidden; 那么vue中是怎样实现元素显示/隐藏的呢? 条件渲染 v-show 写法:v-show"表达式" 判断:表达式转换为布尔值(tr…...
湖北理元理律师事务所:债务优化服务的四维创新实践
在债务问题普遍影响家庭经济稳定的当下,专业法律服务机构的价值不仅在于提供解决方案,更需构建可持续的服务生态。湖北理元理律师事务所通过“法律心理技术教育”四维服务体系,探索出一条兼顾债务化解与生活质量保障的创新路径。 服务模式创…...
ubuntu工控机固定设备usb串口号
ubuntu工控机固定设备usb串口号 1、多个USB设备的ID相同 ubuntu系统中的串口使用权限并没有对所有的用户进行开放,所以在使用代码对串口进行操作时,需要打开用户对串口的使用权限,否则在代码中会出现“串口无法打开的报错”,只有…...
MongoDB的安装及简单使用
MongoDB 是一个开源的文档型 NoSQL 数据库,由 MongoDB Inc. 开发,专为灵活性和可扩展性设计。 特点: 1.文档模型:数据以 BSON(二进制 JSON)格式存储,支持嵌套结构。 2.动态 S…...
卷积神经网络进阶:转置卷积与棋盘效应详解
【内容摘要】 本文深入解析卷积神经网络中的转置卷积(反卷积)技术,重点阐述标准卷积与转置卷积的计算过程、转置卷积的上采样作用,以及其常见问题——棋盘效应的产生原因与解决方法,为图像分割、超分辨率等任务提供理论…...
Linux进程信号(三)之信号产生2
文章目录 4. 由软件条件产生信号5. 硬件异常产生信号模拟一下除0错误和野指针异常除0错误野指针错误 总结思考一下 4. 由软件条件产生信号 SIGPIPE是一种由软件条件产生的信号,在“管道”中已经介绍过了。 软件条件不就绪,很明显这个软件条件没有直接报错ÿ…...
【AWS入门】Amazon SageMaker简介
【AWS入门】Amazon SageMaker简介 [AWS Essentials] Brief Introduction to Amazon SageMaker By JacksonML 机器学习(Machine Learning,简称ML) 是当代流行的计算机科学分支技术。通常,人们在本地部署搭建环境,以满足机器学习的要求。 AWS…...
MySQL--day2--基本的select语句
(以下内容全部来自上述课程) SQL概述 结构化查询语句 1. SQL分类 DDL:数据定义(definition)语言:create、drop、alter… DML:数据操作(manipulation)语言ÿ…...
程序代码篇---python获取http界面上按钮或者数据输入
文章目录 前言 前言 本文简单接受了python获取http界面上按钮或者数据输入...
网络安全利器:蜜罐技术详解
蜜罐是网络安全领域中一种主动防御和情报收集的重要工具。本文将深入探讨蜜罐技术的原理、类型、应用场景以及部署注意事项。 1. 什么是蜜罐? 蜜罐(Honeypot)是一种安全资源,其价值在于被探测、攻击或未经授权使用。简单来说,蜜罐就是一个诱饵系统,用来吸引黑客的注意力…...
回溯实战篇3
文章目录 前言排列全排列全排列II 棋盘问题N皇后解数独 其他递增子序列重新安排行程 前言 今天继续带大家进行回溯的实战篇3,去学习如何用回溯的方法去解决排列和棋盘以及其他用回溯方法解决的问题,最重要的就是学会回溯三部曲的构建,一文带…...
Spark 基础自定义分区器
(一)什么是分区 【复习提问:RDD的定义是什么?】 在 Spark 里,弹性分布式数据集(RDD)是核心的数据抽象,它是不可变的、可分区的、里面的元素并行计算的集合。 在 Spark 中…...
【提高+/省选−】洛谷P1495 —— 【模板】中国剩余定理(CRT)/ 曹冲养猪
见:P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪 - 洛谷 题目描述 自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎&a…...
系统架构设计师考前冲刺笔记-第1章-系统工程与信息系统基础
文章目录 第1章 系统工程与信息系统基础大纲13 DSS5678 BSP910 SCM11 OLAP12 OLAP14 BRP15 集成16 企业门户19 边缘计算 第1章 系统工程与信息系统基础 大纲 1 3 DSS DSS 决策支持系统 Decision Support System 5 6 7 8 BSP 9 10 SCM 注意:生产计划 11 OLAP O…...
Vue环境下数据导出Excel的全面指南
文章目录 1. 前言2. 原生JavaScript实现方案2.1 使用Blob对象和URL.createObjectURL2.2 使用Base64编码实现 3. 常用第三方库方案3.1 使用SheetJS (xlsx)3.2 使用ExcelJS3.3 使用vue-json-excel 4. 服务器端导出方案4.1 前端请求服务器生成Excel4.2 使用Web Worker处理大数据导…...
Linux下 使用 SSH 完成 Git 绑定 GitHub
文章目录 1、检查 SSH2、生成 SSH key3、添加 SSH key4、验证绑定是否成功 1、检查 SSH Git Bash 中输入ssh命令,查看本机是否安装 SSH: 2、生成 SSH key (1)输入 ssh-keygen -t rsa 命令,表示我们指定 RSA 算法生…...
Jsoup库和Apache HttpClient库有什么区别?
Jsoup 和 Apache HttpClient 是两个功能不同的库,它们在 Java 开发中被广泛使用,但用途和功能有明显的区别: Jsoup 用途:Jsoup 是一个用于解析 HTML 文档的库。它提供了非常方便的方法来抓取和解析网页内容,提取和操作…...
安全漏洞频发,如何加强防护措施?
当系统安全漏洞频发时,应从代码安全审查、自动化漏洞扫描、权限控制与访问管理、员工安全意识培训等四个关键维度加强防护。其中,代码安全审查是防止漏洞渗透的第一道防线。企业应将代码安全审查纳入CI/CD流程,实施静态代码分析和依赖包检查机…...
Text models —— BERT,RoBERTa, BERTweet,LLama
BERT 什么是BERT? BERT,全称Bidirectional Encoder Representations from Transformers,BERT是基于Transformer的Encoder(编码器)结构得来的,因此核心与Transformer一致,都是注意力机制。这种…...
CodeBuddy初探
回顾Trae 上一篇博客Trae IDE和VSCode Trae插件初探-CSDN博客,我们进行了TraeIDE和Trae插件初探,给了Trae这样一个任务: 生成一个to do list清单web页面,采用vue实现,可以在页面上进行todolist进行增删改查。 Trae的…...
spark数据处理练习题详解【上】
1. (单选题) scala中属于序列的可变的集合,可以添加,删除元素的是() A.Array B.List C.Tuple D.ListBuffer 答案及解析:D 在Scala中,属于序列的可变集合,可以添加和删除元素的是ÿ…...
sparkSQL读入csv文件写入mysql(2)
(二)创建数据库和表 接下来,我们去创建一个新的数据库,数据表,并插入一条数据。 -- 创建数据库 CREATE DATABASE spark; -- 使用数据库 USE spark;-- 创建表 create table person(id int, name char(20), age int);-- …...
产品周围的几面墙
不能把排序,当单选题做。 2025年的杭州咖啡馆,味道最浓的不是咖啡,是聊各种项目和创业的卷味。 在过去几年,聊项目的也不少,那时候带着更加浓烈的自信和松弛感,不过今年略带几分忐忑和试探的口吻。 看到网…...
【锂电池剩余寿命预测】LSTM长短期记忆神经网络锂电池剩余寿命预测(Pytorch完整源码和数据)
目录 效果一览程序获取程序内容代码分享效果一览 程序获取 获取方式一:文章顶部资源处直接下载:...
螺旋矩阵--LeetCode
题目 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入:matrix [[…...
湖北理元理律师事务所:债务管理的社会价值探索
债务问题从来不是孤立的经济事件,其背后牵涉家庭稳定、社会信用体系乃至区域经济发展。湖北理元理律师事务所通过五年服务数据发现:科学债务规划可使单个家庭挽回约23%的可支配收入,间接降低离婚率、心理健康问题发生率等社会成本。 债务优化…...
知识图谱(KG)与大语言模型(LLM)
知识图谱(KG)以其结构化的知识表示和推理能力,为大语言模型(LLM)的“幻觉”、知识更新滞后和可解释性不足等问题提供了有力的解决方案。反过来,LLM的强大文本理解和生成能力也为KG的构建、补全、查询和应用…...
LLM大语言模型系列1-token
一,什么是token 1,什么是token: 参考:https://en.wikipedia.org/wiki/Token https://en.wikipedia.org/wiki/Lexical_analysis#Token 我们有很多描述token的解释,建议是汇总在一起进行综合理解: 1️⃣To…...
数据清洗-案例
四)实现代码 在之前的项目的基础之上,重写去写一个包,并创建两个类:WebLogMapper和WebLogDriver类。 (1)编写WebLogMapper类 package com.root.mapreduce.weblog; import java.io.IOException; import…...
项目的部署发布和访问的流程
首先打包项目: npm run build 打包后的文件会生成在dist文件夹中,将dist文件夹需要放到服务器里面,意味着服务有dist静态资源(index.html,css/,js/,img/) 用户在浏览器输入域名&am…...