回归实战详细代码+解析:预测新冠感染人数
回归实战:预测新冠感染人数
先回顾下回归是个啥玩意
- 首先需要一组训练集,说人话就是通过一系列x[x1,x2…xn]通过神秘计算得到y的过程,当然人和机器现在都不知道什么计算是什么,这是一个黑箱。
- 黑箱比喻:把模型想象成自动售货机,投币(输入特征x)→ 内部神秘机制(模型计算)→ 吐出饮料(预测值y^)。
- 核心任务:通过不断调整内部零件(参数w),让售货机吐出的饮料尽可能接近真实需求(真实值y)。
-
然后我们先随机的选定一系列参数,然后把参数和x带入神秘公式,计算出预测值y^
-
将y与实际的y进行计算,得到误差loss,预测y与实际y相聚越远,loss显然越大,所以我们可以通过loss来评价一个模型的好坏
-
光知道这模型不准还没用,我们需要让预测值越来越接近,具体来说,就要使用梯度下降来将误差反馈给参数w
for example:
w = w - d(loss)/d(w) * lr
-
在这循环往复的过程中,实现了机器的自主学习(额额。。参数不调好,也会越学越垃圾的,就像人学新知识也常常伴随踩雷和反复)
训练过程
- 随机初始化:给售货机随便装一堆零件(随机初始参数w)
- 预测试错:投币测试,记录误差(计算预测y^与真实y的Loss)
- 梯度下降:根据误差反向调整零件(w = w - 梯度×学习率)
- 循环迭代:重复投币→调整→测试,直到误差最小
实战代码主要部分解析
样例所属的项目kaggle地址
import timeimport matplotlib.pyplot as plt
import torch
import numpy as np
import csv
import pandas as pd
from sklearn.feature_selection import SelectKBest, chi2
from torch.utils.data import DataLoader, Dataset
import torch.nn as nn
from torch import optimdef get_feature_importance(feature_data, label_data, k =4,column = None):"""特征重要性选择函数Parameters:feature_data : 特征数据矩阵label_data : 对应标签数据k : 选择的最佳特征数量column : 特征名称列表(可选)Returns:X_new : 选择后的特征数据indices : 被选特征的列索引"""# 使用卡方检验选择特征model = SelectKBest(chi2, k=k) #定义一个选择k个最佳特征的函数feature_data = np.array(feature_data, dtype=np.float64) # 确保数据类型为float64以满足sklearn要求# label_data = np.array(label_data, dtype=np.float64)X_new = model.fit_transform(feature_data, label_data) #用这个函数选择k个最佳特征#feature_data是特征数据,label_data是标签数据,该函数可以选择出k个特征print('x_new', X_new)scores = model.scores_ # scores即每一列与结果的相关性# 按重要性排序,选出最重要的 k 个indices = np.argsort(scores)[::-1] #[::-1]表示反转一个列表或者矩阵。# argsort这个函数, 可以矩阵排序后的下标。 比如 indices[0]表示的是,scores中最小值的下标。if column: # 如果需要打印选中的列k_best_features = [column[i+1] for i in indices[0:k].tolist()] # 选中这些列 打印print('k best features are: ',k_best_features)return X_new, indices[0:k] # 返回选中列的特征和他们的下标。"""COVID数据加载器"""
class CovidDataset(Dataset):"""Parameters:file_path : 数据文件路径mode : 数据集模式(train/val/test)all_feature : 是否使用全部特征feature_dim : 选择特征维度"""# 数据预处理:给模型喂“干净粮食”def __init__(self, file_path, mode="train", all_feature=False, feature_dim=6):with open(file_path, "r") as f:ori_data = list(csv.reader(f))column = ori_data[0]csv_data = np.array(ori_data[1:])[:, 1:].astype(float)feature = np.array(ori_data[1:])[:, 1:-1]label_data = np.array(ori_data[1:])[:, -1]if all_feature:col = np.array([i for i in range(0, 93)])else:_, col = get_feature_importance(feature, label_data, feature_dim, column)col = col.tolist()if mode == "train": # 80%训练集indices = [i for i in range(len(csv_data)) if i % 5 != 0]data = torch.tensor(csv_data[indices, :-1])self.y = torch.tensor(csv_data[indices, -1])elif mode == "val": # 20%验证集indices = [i for i in range(len(csv_data)) if i % 5 == 0]data = torch.tensor(csv_data[indices, :-1])self.y = torch.tensor(csv_data[indices, -1])else: # test模式indices = [i for i in range(len(csv_data))]data = torch.tensor(csv_data[indices])# 数据标准化处理(将不同尺度的数据变为同一尺度)data = data[:, col]self.data = (data - data.mean(dim=0, keepdim=True)) / data.std(dim=0, keepdim=True)self.mode = mode"""获取单条数据"""def __getitem__(self, idx):if self.mode != "test":return self.data[idx].float(), self.y[idx].float()else:return self.data[idx].float()def __len__(self):return len(self.data)# 以上是数据装载部分class MyModel(nn.Module):"""自定义全连接神经网络"""def __init__(self, inDim):"""Parameters:inDim : 输入特征维度"""super(MyModel, self).__init__()self.fc1 = nn.Linear(inDim, 64)self.relu1 = nn.ReLU()self.fc2 = nn.Linear(64, 1)def forward(self, x): # 模型前向过程"""前向传播"""x = self.fc1(x)x = self.relu1(x)x = self.fc2(x)if len(x.size()) > 1:return x.squeeze(1)return xdef train_val(model, train_loader, val_loader, device, epochs, optimizer, loss, save_path):"""模型训练与验证函数Parameters:model : 待训练模型train_loader: 训练数据加载器val_loader : 验证数据加载器device : 计算设备(CPU/GPU)epochs : 训练轮数optimizer : 优化器loss : 损失函数save_path : 模型保存路径"""model = model.to(device)plt_train_loss = [] # 记录所有轮次的训练lossplt_val_loss = [] # 验证loss记录min_val_loss = 9999999999999999 # 最佳验证损失初始化for epoch in range(epochs): # 开始训练train_loss = 0.0val_loss = 0.0start_time = time.time()model.train() # 模型调整为训练模式for batch_x, batch_y in train_loader:x, target = batch_x.to(device), batch_y.to(device)pred = model(x) # 前向传播train_bat_loss = loss(pred, target, model)train_bat_loss.backward() # 反向传播optimizer.step() # 更新模型optimizer.zero_grad()train_loss += train_bat_loss.cpu().item()plt_train_loss.append(train_loss / train_loader.__len__())# 验证阶段model.eval()with torch.no_grad():for batch_x, batch_y in val_loader:x, target = batch_x.to(device), batch_y.to(device)pred = model(x)val_bat_loss = loss(pred, target, model)val_loss += val_bat_loss.cpu().item()plt_val_loss.append(val_loss / val_loader.__len__())# 保存最佳模型if val_loss < min_val_loss:torch.save(model, save_path)min_val_loss = val_lossprint("[%03d/%03d] %2.2f sec(s) Trainloss: %.6f | Valloss: %.6f" % \(epoch, epochs, time.time() - start_time, plt_train_loss[-1], plt_val_loss[-1]))# 损失曲线可视化plt.plot(plt_train_loss)plt.plot(plt_val_loss)plt.title("loss")plt.legend(["train", "val"])plt.show()def evaluate(save_path, test_loader, device, rel_path): # 得出测试结果文件# 加载最佳模型model = torch.load(save_path).to(device)rel = []# 预测结果with torch.no_grad():for x in test_loader:pred = model(x.to(device))rel.append(pred.cpu().item())print(rel)# 保存CSV结果with open(rel_path, "w", newline='') as f:csvWriter = csv.writer(f)csvWriter.writerow(["id", "tested_positive"])for i, value in enumerate(rel):csvWriter.writerow([str(i), str(value)])print("文件已保存到{}".format(rel_path))# 配置参数
all_feature = False # 是否使用全部特征
feature_dim = 6 # 特征维度
if all_feature:feature_dim = 93
else:feature_dim = 6config = {"lr": 0.001, # 学习率"epochs": 20, # 训练轮数"momentum": 0.9, # 动量系数"save_path": "model_save/best_model.pth", # 模型保存路径"rel_path": "pred.csv" # 预测结果路径
}# 设备检测
device = "cuda" if torch.cuda.is_available() else "cpu"
print(device)# 数据加载
train_file = "covid.train.csv"
test_file = "covid.test.csv"
train_dataset = CovidDataset(train_file, "train", all_feature, feature_dim)
val_dataset = CovidDataset(train_file, "val", all_feature, feature_dim)
test_dataset = CovidDataset(test_file, "test", all_feature, feature_dim)
# for data in train_dataset:
# print(data)# 创建数据加载器
batch_size = 16
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) # 随机梯度下降
val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=True) # 随机梯度下降
test_loader = DataLoader(test_dataset, batch_size=1, shuffle=False) # 随机梯度下降
# for batch_x, batch_y in train_loader:
# print(batch_x, batch_y)def mseLoss_with_reg(pred, target, model):loss = nn.MSELoss(reduction='mean')''' Calculate loss '''regularization_loss = 0 # 正则项for param in model.parameters():# TODO: you may implement L1/L2 regularization here# 使用L2正则项# regularization_loss += torch.sum(abs(param))regularization_loss += torch.sum(param ** 2) # 计算所有参数平方return loss(pred, target) + 0.00075 * regularization_loss # 返回损失。model = MyModel(inDim=feature_dim).to(device) # 向硬件挂载任务
# loss = nn.MSELoss() # Loss函数
loss = mseLoss_with_reg
optimizer = optim.SGD(model.parameters(), lr=config["lr"], momentum=config["momentum"]) # 优化器train_val(model, train_loader, val_loader, device, config["epochs"], optimizer, loss, config["save_path"])evaluate(config["save_path"], test_loader, device, config["rel_path"])
1. 数据读取
其实对基本的模型来说,训练过程都是一样的,而最麻烦的是数据的输入,我们在输入过程中有时可以剔除部分不需要的数据,来更好的构建模型,但哪些重要哪些不重要,又是一个问题。。。
看看代码吧
def get_feature_importance(feature_data, label_data, k =4,column = None):"""特征重要性选择函数Parameters:feature_data : 特征数据矩阵label_data : 对应标签数据k : 选择的最佳特征数量column : 特征名称列表(可选)Returns:X_new : 选择后的特征数据indices : 被选特征的列索引"""# 使用卡方检验选择特征model = SelectKBest(chi2, k=k) #定义一个选择k个最佳特征的函数feature_data = np.array(feature_data, dtype=np.float64) # 确保数据类型为float64以满足sklearn要求# label_data = np.array(label_data, dtype=np.float64)X_new = model.fit_transform(feature_data, label_data) #用这个函数选择k个最佳特征#feature_data是特征数据,label_data是标签数据,该函数可以选择出k个特征print('x_new', X_new)scores = model.scores_ # scores即每一列与结果的相关性# 按重要性排序,选出最重要的 k 个indices = np.argsort(scores)[::-1] #[::-1]表示反转一个列表或者矩阵。# argsort这个函数, 可以矩阵排序后的下标。 比如 indices[0]表示的是,scores中最小值的下标。if column: # 如果需要打印选中的列k_best_features = [column[i+1] for i in indices[0:k].tolist()] # 选中这些列 打印print('k best features are: ',k_best_features)return X_new, indices[0:k] # 返回选中列的特征和他们的下标。
get_feature_importance()在所有的特征中 通过SelectKBest算法来找到K个影响最大的特征,借此排除无效计算
"""COVID数据加载器"""
class CovidDataset(Dataset):"""Parameters:file_path : 数据文件路径mode : 数据集模式(train/val/test)all_feature : 是否使用全部特征feature_dim : 选择特征维度"""# 数据预处理:给模型喂“干净粮食”def __init__(self, file_path, mode="train", all_feature=False, feature_dim=6):with open(file_path, "r") as f:ori_data = list(csv.reader(f))column = ori_data[0]csv_data = np.array(ori_data[1:])[:, 1:].astype(float)feature = np.array(ori_data[1:])[:, 1:-1]label_data = np.array(ori_data[1:])[:, -1]if all_feature:col = np.array([i for i in range(0, 93)])else:_, col = get_feature_importance(feature, label_data, feature_dim, column)col = col.tolist()if mode == "train": # 80%训练集indices = [i for i in range(len(csv_data)) if i % 5 != 0]data = torch.tensor(csv_data[indices, :-1])self.y = torch.tensor(csv_data[indices, -1])elif mode == "val": # 20%验证集indices = [i for i in range(len(csv_data)) if i % 5 == 0]data = torch.tensor(csv_data[indices, :-1])self.y = torch.tensor(csv_data[indices, -1])else: # test模式indices = [i for i in range(len(csv_data))]data = torch.tensor(csv_data[indices])# 数据标准化处理(将不同尺度的数据变为同一尺度)data = data[:, col]self.data = (data - data.mean(dim=0, keepdim=True)) / data.std(dim=0, keepdim=True)self.mode = mode"""获取单条数据"""def __getitem__(self, idx):if self.mode != "test":return self.data[idx].float(), self.y[idx].float()else:return self.data[idx].float()def __len__(self):return len(self.data)
CovidDataset类是数据装载需要用到的
- __init__函数对CovidDataset进行了初始化,将文件读入,并排除无用的行列之后,转化为张量的形式,同时根据训练的模式来选择传出全部数据还是部分关键数据,并且自动分割训练集和测试集。
说实话读数据的代码看着还不算难,但是自己写还真是一次写不出来。。
入门没有练度的时候,看这些东西都不知道为什么要设计这个环节
数据标准化:公平对待每个特征
- 为什么要做:身高(170cm)和体重(70kg)单位不同,直接比较会扭曲模型判断。
- 操作方法:对每个特征列,减去均值、除以标准差 → 数据服从标准正态分布(代码中的
(data - data.mean)/datastd
)。
2. 核心模型
class MyModel(nn.Module):"""自定义全连接神经网络"""def __init__(self, inDim):"""Parameters:inDim : 输入特征维度"""super(MyModel, self).__init__()self.fc1 = nn.Linear(inDim, 64)self.relu1 = nn.ReLU()self.fc2 = nn.Linear(64, 1)def forward(self, x): # 模型前向过程"""前向传播"""x = self.fc1(x)x = self.relu1(x)x = self.fc2(x)if len(x.size()) > 1:return x.squeeze(1)return x
这是模型本身的算法类,这里直接使用nn现成的算法,不用再自己造轮子了
使用了Linear来线性预测,ReLu作为激活函数
先从输入数据个参数,降到64个,最后直接降到1个,即输出本身
3. 训练模块
def train_val(model, train_loader, val_loader, device, epochs, optimizer, loss, save_path):"""模型训练与验证函数Parameters:model : 待训练模型train_loader: 训练数据加载器val_loader : 验证数据加载器device : 计算设备(CPU/GPU)epochs : 训练轮数optimizer : 优化器loss : 损失函数save_path : 模型保存路径"""model = model.to(device)plt_train_loss = [] # 记录所有轮次的训练lossplt_val_loss = [] # 验证loss记录min_val_loss = 9999999999999999 # 最佳验证损失初始化for epoch in range(epochs): # 开始训练train_loss = 0.0val_loss = 0.0start_time = time.time()model.train() # 模型调整为训练模式for batch_x, batch_y in train_loader:x, target = batch_x.to(device), batch_y.to(device)pred = model(x) # 前向传播train_bat_loss = loss(pred, target, model)train_bat_loss.backward() # 反向传播optimizer.step() # 更新模型optimizer.zero_grad()train_loss += train_bat_loss.cpu().item()plt_train_loss.append(train_loss / train_loader.__len__())# 验证阶段model.eval()with torch.no_grad():for batch_x, batch_y in val_loader:x, target = batch_x.to(device), batch_y.to(device)pred = model(x)val_bat_loss = loss(pred, target, model)val_loss += val_bat_loss.cpu().item()plt_val_loss.append(val_loss / val_loader.__len__())# 保存最佳模型if val_loss < min_val_loss:torch.save(model, save_path)min_val_loss = val_lossprint("[%03d/%03d] %2.2f sec(s) Trainloss: %.6f | Valloss: %.6f" % \(epoch, epochs, time.time() - start_time, plt_train_loss[-1], plt_val_loss[-1]))# 损失曲线可视化plt.plot(plt_train_loss)plt.plot(plt_val_loss)plt.title("loss")plt.legend(["train", "val"])plt.show()
4. 输出模型结果
def evaluate(save_path, test_loader, device, rel_path): # 得出测试结果文件# 加载最佳模型model = torch.load(save_path).to(device)rel = []# 预测结果with torch.no_grad():for x in test_loader:pred = model(x.to(device))rel.append(pred.cpu().item())print(rel)# 保存CSV结果with open(rel_path, "w", newline='') as f:csvWriter = csv.writer(f)csvWriter.writerow(["id", "tested_positive"])for i, value in enumerate(rel):csvWriter.writerow([str(i), str(value)])print("文件已保存到{}".format(rel_path))
5. 优化:正则化 loss = loss+ W*W
def mseLoss_with_reg(pred, target, model):loss = nn.MSELoss(reduction='mean')''' Calculate loss '''regularization_loss = 0 # 正则项for param in model.parameters():# TODO: you may implement L1/L2 regularization here# 使用L2正则项# regularization_loss += torch.sum(abs(param))regularization_loss += torch.sum(param ** 2) # 计算所有参数平方return loss(pred, target) + 0.00075 * regularization_loss # 返回损失。
我们如果直接使用MSELoss来计算loss,容易造成过拟合
这是因为MSE的计算公式loss(xi,yi)=(xi−yi)^2,如果出现了一个非常离谱的噪声y,就会产生巨大的loss,模型就会努力的扭曲函数,让他勾到这个奇怪的噪声点,造成曲线的失真
相对而言的:
通过正则化的MSE:loss = loss+ W*W,(W为参数)能使曲线更为平滑,能避免过拟合。
我们想想,模型的目标是追求更低的loss,如果模型为了去抓任性的噪声而随意地变更参数w,由于此时w对loss造成的影响是指数上升的,所以会抑制w的无端突变,从而达成平滑曲线的目的
避坑指南:新手常见错误
- 特征未标准化 → 模型被大范围特征(如人口数)主导,忽视小范围特征(如温度)。
- 忽略验证集 → 模型在训练集表现完美,实际预测一塌糊涂。
- 学习率过大 → Loss剧烈震荡无法收敛(如下右)。
总结:回归实战四步曲
- 数据预处理:清洗 → 特征选择 → 标准化(给模型喂干净数据)
- 模型设计:输入层 → 隐藏层(+ReLU) → 输出层(搭积木式构建)
- 训练调参:Loss监控 → 梯度下降 → 早停机制(防止过拟合,这里还没有写)
- 结果分析:Loss曲线 → 正则化效果 → 模型推理测试
相关文章:

回归实战详细代码+解析:预测新冠感染人数
回归实战:预测新冠感染人数 先回顾下回归是个啥玩意 首先需要一组训练集,说人话就是通过一系列x[x1,x2…xn]通过神秘计算得到y的过程,当然人和机器现在都不知道什么计算是什么,这是一个黑箱。 黑箱比喻:把模型想象成自…...

AI人工智能机器学习之聚类分析
1、概要 本篇学习AI人工智能机器学习之聚类分析,以KMeans、AgglomerativeClustering、DBSCAN为例,从代码层面讲述机器学习中的聚类分析。 2、聚类分析 - 简介 聚类分析是一种无监督学习的方法,用于将数据集中的样本划分为不同的组ÿ…...

(下:补充——五个模型的理论基础)深度学习——图像分类篇章
目录 1.1 卷积神经网络基础 3.1 AlexNet网络结构详解与花分类数据集下载 4.1 VGG网络详解及感受野的计算 5.1 GoogLeNet网络详解 6.1 ResNet网络结构,BN以及迁移学习详解 总结(可以直接看总结) 1.1 卷积神经网络基础 视频讲解…...
使用Python自动生成图文并茂的网页分析报告
在数据分析中,不管是市场研究还是科学分析,经常需要使用Python进行数据分析并生成图表报告。一般使用Python生成和展示图表时都是使用matplotlib 库生成静态图片文件,这种方式不便之处是不方便跟动态文字段落结合在一起,也不方便分…...

uniapp-原生android插件开发摘要
uni-app在App侧的原生扩展插件,支持使用java、object-c等原生语言编写,从HBuilderX 3.6起,新增支持了使用uts来开发原生插件。 基础项目 UniPlugin-Hello-AS工程请在App离线SDK中查找 基础项目(App离线SDK)已经配置好了自定义插件所需要的…...

GIT工具学习【1】:基本操作
目录 0.本地代码分区1.配置自己的个人信息(设置一次即可)2.新建仓库3.提交代码到暂存区(加入购物车)4.从暂存区撤回(不会改变工作区文件)5.恢复指定版本(会改变工作区文件)5.1&#…...
《国密算法开发实战:从合规落地到性能优化》
前言 随着信息技术的飞速发展,信息安全已成为全球关注的焦点。在数字化时代,数据的保密性、完整性和可用性直接关系到国家、企业和个人的利益。为了保障信息安全,密码技术作为核心支撑,发挥着至关重要的作用。国密算法,即国家密码算法,是我国自主设计和推广的一系列密码…...

【语法】C++中string类中的两个问题及解答
贴主在学习string类时遇到过两个困扰我的问题,今天拿出来给大家分享一下我是如何解决的 一、扩容时capacity的增长问题 在string的capacity()接口中,调用的是这个string对象的容量(可以存多少个有效字符),而size()是调用的string对象现在有…...
LeetCode-154. 寻找旋转排序数组中的最小值 II
1、题目描述: 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,…...
2.数据结构:1.Tire 字符串统计
1.Tire 字符串统计 #include<algorithm> #include<cstring> #include<iostream>using namespace std;const int N100010; int son[N][26];//至多 N 层,每一层至多 26 个节点(字母) int cnt[N];//字符串至多 N 个ÿ…...
C语言复习4:有关数组的基础常见算法
# 数组的常见算法 - 查找算法 1. 基本查找/顺序查找 2. 二分查找/折半查找 3. 插值查找 4. 分块查找 5. 哈希查找 6. 树表查找 7. 斐波那契查找 - 排序算法(顾名思义,就是把没有顺序的…...
Ubuntu从零创建Hadoop集群
目录 前言 前提准备 1.设置网关和网段 2.查看虚拟机IP及检查网络 3.Ubuntu相关配置 镜像源配置 下载 vim编辑器 4.设置静态IP和SSH免密(可选) 设置静态IP SSH免密 5.JDK环境部署 6.Hadoop环境部署 7.配置 Hadoop 配置文件 HDFS集群规划 HDFS集群配置 1.配…...

GPIO概念
GPIO通用输入输出口 在芯片内部存在多个GPIO,每个GPIO用于管理多个芯片进行输入,输出工作 引脚电平 0v ~3.3v,部分引脚可容任5v 输出模式下可控制端口输出高低电平,可以驱动LED,控制蜂鸣器,模拟通信协议&a…...
Node.js, Bun, Deno 比较概述
以下是 Node.js、Bun 和 Deno 的对比分析 概览 对比维度Node.jsDenoBun首次发布200920202022创始人Ryan DahlRyan Dahl(Node.js 原作者)Jarred Sumner运行时引擎V8(Chrome)V8(Chrome)JavaScriptCore&#…...

C# 类库打包dll文件
目录 前言操作流程注意事项 前言 在C#中,有多种方式可以对代码进行加密,以保护源代码不被轻易查看或修改,这篇文章主要介绍将C# cs类文件加密为dll文件的方式进行保护。 操作流程 在 Visual Studio 中,选择“创建新项目”。 选…...

Linux中的UDP编程接口基本使用
UDP编程接口基本使用 本篇介绍 在前面网络基础部分已经介绍了网络的基本工作模式,有了这些理论基础之后,下面先从UDP编程开始从操作部分深入网络 在本篇中,主要考虑下面的内容: 创建并封装服务端:了解创建服务端的…...

RAG项目实战:金融问答系统
需求痛点 私有知识很多,如何让大模型只选择跟问题有关的知识进行参考呢? 需求分析 是否可以使用关键词匹配呢?以前的搜索主要使用关键词匹配,这个要求太高了,需要提前抽取准备好关键词,有点像以前SEO的工…...
大白话React第十一章React 相关的高级特性以及在实际项目中的应用优化
假设我们已经对 React 前端框架的性能和可扩展性评估有了一定了解,接下来的阶段可以深入学习 React 相关的高级特性以及在实际项目中的应用优化,以下是详细介绍及代码示例: 1. React 高级特性的深入学习 1.1 React 并发模式(Con…...
虚拟机Linux操作(持续更新ing)
虚拟机操作(持续更新ing) 虚拟机基本操作(Linux) # Linux # 立刻关机 poweroff # 立刻关机,可以选择数字或者具体时间 shutdown -h now # 立刻重启,可以选择数字或者具体时间 shutdown -r now # 立刻重启 reboot # cd 切换目录,下面用根目录举例 cd /…...
【开源-线程池(Thread Pool)项目对比】
一些实现**线程池(Thread Pool)**功能的开源项目的对比分析。 线程池功能的开源项目 项目名称语言优点缺点适用场景开源代码链接ThreadPoolC简单易用,代码简洁;适合快速原型开发。功能较为基础,不支持动态调整线程数…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...