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

回归实战详细代码+解析:预测新冠感染人数

回归实战:预测新冠感染人数

先回顾下回归是个啥玩意

image-20250302175207806

  1. 首先需要一组训练集,说人话就是通过一系列x[x1,x2…xn]通过神秘计算得到y的过程,当然人和机器现在都不知道什么计算是什么,这是一个黑箱
  • 黑箱比喻:把模型想象成自动售货机,投币(输入特征x)→ 内部神秘机制(模型计算)→ 吐出饮料(预测值y^)。
  • 核心任务:通过不断调整内部零件(参数w),让售货机吐出的饮料尽可能接近真实需求(真实值y)。
  1. 然后我们先随机的选定一系列参数,然后把参数和x带入神秘公式,计算出预测值y^

  2. 将y与实际的y进行计算,得到误差loss,预测y与实际y相聚越远,loss显然越大,所以我们可以通过loss来评价一个模型的好坏

  3. 光知道这模型不准还没用,我们需要让预测值越来越接近,具体来说,就要使用梯度下降来将误差反馈给参数w

    for example:

    ​ w = w - d(loss)/d(w) * lr

  4. 在这循环往复的过程中,实现了机器的自主学习(额额。。参数不调好,也会越学越垃圾的,就像人学新知识也常常伴随踩雷和反复)

训练过程

  1. 随机初始化:给售货机随便装一堆零件(随机初始参数w)
  2. 预测试错:投币测试,记录误差(计算预测y^与真实y的Loss)
  3. 梯度下降:根据误差反向调整零件(w = w - 梯度×学习率)
  4. 循环迭代:重复投币→调整→测试,直到误差最小

image-20250302191203412


实战代码主要部分解析

样例所属的项目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作为激活函数

image-20250302193042383

先从输入数据个参数,降到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,容易造成过拟合

image-20250302202213888

这是因为MSE的计算公式loss(xi,yi)=(xi−yi)^2,如果出现了一个非常离谱的噪声y,就会产生巨大的loss,模型就会努力的扭曲函数,让他勾到这个奇怪的噪声点,造成曲线的失真

相对而言的:

通过正则化的MSE:loss = loss+ W*W,(W为参数)能使曲线更为平滑,能避免过拟合。

我们想想,模型的目标是追求更低的loss,如果模型为了去抓任性的噪声而随意地变更参数w,由于此时w对loss造成的影响是指数上升的,所以会抑制w的无端突变,从而达成平滑曲线的目的

image-20250302203410195


避坑指南:新手常见错误

  1. 特征未标准化 → 模型被大范围特征(如人口数)主导,忽视小范围特征(如温度)。
  2. 忽略验证集 → 模型在训练集表现完美,实际预测一塌糊涂。
  3. 学习率过大 → Loss剧烈震荡无法收敛(如下右)。

img


总结:回归实战四步曲

  1. 数据预处理:清洗 → 特征选择 → 标准化(给模型喂干净数据)
  2. 模型设计:输入层 → 隐藏层(+ReLU) → 输出层(搭积木式构建)
  3. 训练调参:Loss监控 → 梯度下降 → 早停机制(防止过拟合,这里还没有写)
  4. 结果分析:Loss曲线 → 正则化效果 → 模型推理测试

相关文章:

回归实战详细代码+解析:预测新冠感染人数

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

AI人工智能机器学习之聚类分析

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

(下:补充——五个模型的理论基础)深度学习——图像分类篇章

目录 1.1 卷积神经网络基础 3.1 AlexNet网络结构详解与花分类数据集下载 4.1 VGG网络详解及感受野的计算 5.1 GoogLeNet网络详解 6.1 ResNet网络结构&#xff0c;BN以及迁移学习详解 总结&#xff08;可以直接看总结&#xff09; 1.1 卷积神经网络基础 视频讲解&#xf…...

使用Python自动生成图文并茂的网页分析报告

在数据分析中&#xff0c;不管是市场研究还是科学分析&#xff0c;经常需要使用Python进行数据分析并生成图表报告。一般使用Python生成和展示图表时都是使用matplotlib 库生成静态图片文件&#xff0c;这种方式不便之处是不方便跟动态文字段落结合在一起&#xff0c;也不方便分…...

uniapp-原生android插件开发摘要

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

GIT工具学习【1】:基本操作

目录 0.本地代码分区1.配置自己的个人信息&#xff08;设置一次即可&#xff09;2.新建仓库3.提交代码到暂存区&#xff08;加入购物车&#xff09;4.从暂存区撤回&#xff08;不会改变工作区文件&#xff09;5.恢复指定版本&#xff08;会改变工作区文件&#xff09;5.1&#…...

《国密算法开发实战:从合规落地到性能优化》

前言 随着信息技术的飞速发展,信息安全已成为全球关注的焦点。在数字化时代,数据的保密性、完整性和可用性直接关系到国家、企业和个人的利益。为了保障信息安全,密码技术作为核心支撑,发挥着至关重要的作用。国密算法,即国家密码算法,是我国自主设计和推广的一系列密码…...

【语法】C++中string类中的两个问题及解答

贴主在学习string类时遇到过两个困扰我的问题&#xff0c;今天拿出来给大家分享一下我是如何解决的 一、扩容时capacity的增长问题 在string的capacity()接口中&#xff0c;调用的是这个string对象的容量(可以存多少个有效字符)&#xff0c;而size()是调用的string对象现在有…...

LeetCode-154. 寻找旋转排序数组中的最小值 II

1、题目描述&#xff1a; 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [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 层&#xff0c;每一层至多 26 个节点&#xff08;字母&#xff09; int cnt[N];//字符串至多 N 个&#xff…...

C语言复习4:有关数组的基础常见算法

# 数组的常见算法 - 查找算法 1. 基本查找/顺序查找 2. 二分查找/折半查找 3. 插值查找 4. 分块查找 5. 哈希查找 6. 树表查找 7. 斐波那契查找 - 排序算法&#xff08;顾名思义&#xff0c;就是把没有顺序的…...

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&#xff0c;每个GPIO用于管理多个芯片进行输入&#xff0c;输出工作 引脚电平 0v ~3.3v&#xff0c;部分引脚可容任5v 输出模式下可控制端口输出高低电平&#xff0c;可以驱动LED&#xff0c;控制蜂鸣器&#xff0c;模拟通信协议&a…...

Node.js, Bun, Deno 比较概述

以下是 Node.js、Bun 和 Deno 的对比分析 概览 对比维度Node.jsDenoBun首次发布200920202022创始人Ryan DahlRyan Dahl&#xff08;Node.js 原作者&#xff09;Jarred Sumner运行时引擎V8&#xff08;Chrome&#xff09;V8&#xff08;Chrome&#xff09;JavaScriptCore&#…...

C# 类库打包dll文件

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

Linux中的UDP编程接口基本使用

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

RAG项目实战:金融问答系统

需求痛点 私有知识很多&#xff0c;如何让大模型只选择跟问题有关的知识进行参考呢&#xff1f; 需求分析 是否可以使用关键词匹配呢&#xff1f;以前的搜索主要使用关键词匹配&#xff0c;这个要求太高了&#xff0c;需要提前抽取准备好关键词&#xff0c;有点像以前SEO的工…...

大白话React第十一章React 相关的高级特性以及在实际项目中的应用优化

假设我们已经对 React 前端框架的性能和可扩展性评估有了一定了解&#xff0c;接下来的阶段可以深入学习 React 相关的高级特性以及在实际项目中的应用优化&#xff0c;以下是详细介绍及代码示例&#xff1a; 1. React 高级特性的深入学习 1.1 React 并发模式&#xff08;Con…...

虚拟机Linux操作(持续更新ing)

虚拟机操作(持续更新ing) 虚拟机基本操作(Linux) # Linux # 立刻关机 poweroff # 立刻关机&#xff0c;可以选择数字或者具体时间 shutdown -h now # 立刻重启&#xff0c;可以选择数字或者具体时间 shutdown -r now # 立刻重启 reboot # cd 切换目录,下面用根目录举例 cd /…...

【开源-线程池(Thread Pool)项目对比】

一些实现**线程池&#xff08;Thread Pool&#xff09;**功能的开源项目的对比分析。 线程池功能的开源项目 项目名称语言优点缺点适用场景开源代码链接ThreadPoolC简单易用&#xff0c;代码简洁&#xff1b;适合快速原型开发。功能较为基础&#xff0c;不支持动态调整线程数…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

ESP32读取DHT11温湿度数据

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

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...