• 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

一、进阶说明

针对于特征对模型结果的影响我们做了特征分析

特征选择

1. SelectFromModel
  • 工作原理:基于模型的特征选择方法,使用基础评估器(如决策树)的feature_importances_coef_属性来衡量特征的重要性,并根据设定的阈值选择重要性得分超过该阈值的特征。
  • 适用场景:当需要基于预训练模型的特征重要性快速筛选特征时,适合快速特征过滤。
  • 优点:简单易用,适合快速特征筛选。
  • 缺点:无法直接控制最终选择的特征数量,不如RFE精确。
2. RFE (Recursive Feature Elimination)
  • 工作原理:递归地移除最不重要的特征。每次训练模型后,根据特征的重要性评分移除最不重要的特征,直到剩下指定数量的特征。
  • 适用场景:当需要精确控制最终选择的特征数量时,适合精细特征选择。
  • 优点:可以精确控制最终选择的特征数量,在每轮迭代中考虑所有剩余特征的整体贡献。
  • 缺点:计算成本较高,因为需要多次训练模型,尤其在数据集大或模型复杂时。
总结
  • SelectFromModel:适用于基于预定义重要性阈值快速简化模型的场景。
  • RFE:适用于需要直接控制最终特征数量且愿意接受更高计算成本的场景。

本文使用的方法

该代码使用了两种特征选择方法:

RFE (Recursive Feature Elimination)

RFE 是递归特征消除方法,它使用递归的方式逐步移除最不重要的特征,直到保留指定数量的特征为止。代码中利用 RFE 从数据集中选择了前20个重要特征:

from sklearn.feature_selection import RFE# 使用 RFE 来选择特征
rfe_selector = RFE(estimator=tree, n_features_to_select=20)  # 选择前20个特征
rfe_selector.fit(X, y)
X_new = rfe_selector.transform(X)
feature_names = np.array(X.columns)
selected_feature_names = feature_names[rfe_selector.support_]
print(selected_feature_names)

手动指定特征选择

代码中还手动指定了一个特征列表feature_selection,将数据集中特定的20个特征作为最终的特征集用于后续建模:

feature_selection = ['年龄', '种族', '教育水平', '身体质量指数(BMI)', '酒精摄入量', '体育活动时间', '饮食质量评分','睡眠质量评分', '心血管疾病', '收缩压', '舒张压', '胆固醇总量', '低密度脂蛋白胆固醇(LDL)', '高密度脂蛋白胆固醇(HDL)', '甘油三酯', '简易精神状态检查(MMSE)得分', '功能评估得分', '记忆抱怨', '行为问题', '日常生活活动(ADL)得分']
X = data_df[feature_selection]

总结来说,代码中使用了 RFE 方法自动选择前20个重要特征,并在后续建模中使用了手动指定的20个特征进行训练和预测。这两种方法可以结合使用,也可以单独使用其中一种,具体取决于数据特性和任务需求。

二、代码实现

1.导入库函数

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset
from sklearn.preprocessing import LabelEncoder

2.导入数据

plt.rcParams["font.sans-serif"] = ["Microsoft YaHei"]  # 显示中文
plt.rcParams['axes.unicode_minus'] = False  # 显示负号data_df = pd.read_csv("./data/alzheimers_disease_data.csv")#data_df.head()data_df.rename(columns={"Age":"年龄", "Gender":"性别", "Ethnicity":"种族", "EducationLevel":"教育水平", "BMI":"身体质量指数(BMI)", "Smoking":"吸烟情况", "AlcoholConsumption":"酒精摄入量", "PhysicalActivity":"体育活动时间", "DietQuality":"饮食质量评分", "SleepQuality":"睡眠质量评分", "FamilyHistoryAlzheimers":"家族阿尔茨海默病史", "CardiovascularDisease":"心血管疾病", "Diabetes":"糖尿病", "Depression":"抑郁症史", "HeadInjury":"头部受伤", "Hypertension":"高血压", "SystolicBP":"收缩压", "DiastolicBP":"舒张压", "CholesterolTotal":"胆固醇总量", "CholesterolLDL":"低密度脂蛋白胆固醇(LDL)", "CholesterolHDL":"高密度脂蛋白胆固醇(HDL)", "CholesterolTriglycerides":"甘油三酯","MMSE":"简易精神状态检查(MMSE)得分","FunctionalAssessment":"功能评估得分","MemoryComplaints":"记忆抱怨","BehavioralProblems":"行为问题","ADL":"日常生活活动(ADL)得分","Confusion":"混乱与定向障碍","Disorientation":"迷失方向","PersonalityChanges":"人格变化","DifficultyCompletingTasks":"完成任务困难","Forgetfulness":"健忘","Diagnosis":"诊断状态","DoctorInCharge":"主诊医生"},inplace=True)
print(data_df.columns)
Index(['PatientID', '年龄', '性别', '种族', '教育水平', '身体质量指数(BMI)', '吸烟情况', '酒精摄入量','体育活动时间', '饮食质量评分', '睡眠质量评分', '家族阿尔茨海默病史', '心血管疾病', '糖尿病', '抑郁症史','头部受伤', '高血压', '收缩压', '舒张压', '胆固醇总量', '低密度脂蛋白胆固醇(LDL)','高密度脂蛋白胆固醇(HDL)', '甘油三酯', '简易精神状态检查(MMSE)得分', '功能评估得分', '记忆抱怨', '行为问题','日常生活活动(ADL)得分', '混乱与定向障碍', '迷失方向', '人格变化', '完成任务困难', '健忘', '诊断状态','主诊医生'],dtype='object')

3.数据处理

print(data_df.isnull().sum())```python
PatientID           0
年龄                  0
性别                  0
种族                  0
教育水平                0
身体质量指数(BMI)         0
吸烟情况                0
酒精摄入量               0
体育活动时间              0
饮食质量评分              0
睡眠质量评分              0
家族阿尔茨海默病史           0
心血管疾病               0
糖尿病                 0
抑郁症史                0
头部受伤                0
高血压                 0
收缩压                 0
舒张压                 0
胆固醇总量               0
低密度脂蛋白胆固醇(LDL)      0
高密度脂蛋白胆固醇(HDL)      0
甘油三酯                0
简易精神状态检查(MMSE)得分    0
功能评估得分              0
记忆抱怨                0
行为问题                0
日常生活活动(ADL)得分       0
混乱与定向障碍             0
迷失方向                0
人格变化                0
完成任务困难              0
健忘                  0
诊断状态                0
主诊医生                0

创建 LabelEncoder 实例

label_encoder = LabelEncoder()

对非数值型列进行标签编码

data_df[‘主诊医生’] = label_encoder.fit_transform(data_df[‘主诊医生’])
data_df.head()


## 4.数据集构建```python
# 计算是否患病,人数
counts = data_df["诊断状态"].value_counts()# 计算百分比
sizes = counts / counts.sum() * 100# 绘制环形图
fig, ax = plt.subplots()
wedges, texts, autotexts = ax.pie(sizes, labels=sizes.index, autopct='%1.2f%%', startangle=90, wedgeprops=dict(width=0.2))
plt.title("患病占比(1患病, 0没有患病)")
plt.show()

5.患病占比

class model_rnn(nn.Module):def __init__(self):super(model_rnn, self).__init__()self.rnn0 = nn.RNN(input_size=32, hidden_size=200,num_layers=1, batch_first=True)self.fc0 = nn.Linear(200, 50)self.fc1 = nn.Linear(50, 2)def forward(self, x):out, hidden1 = self.rnn0(x)out = self.fc0(out)out = self.fc1(out)return outmodel = model_rnn().to(device)

在这里插入图片描述

6.相关性分析

plt.figure(figsize=(40, 35))
sns.heatmap(data_df.corr(), annot=True, fmt=".2f")
plt.show()

在这里插入图片描述

7. 年龄与患病探究

data_df['年龄'].min(), data_df['年龄'].max()
age_bins = range(60, 91)
grouped = data_df.groupby('年龄').agg({'诊断状态': ['sum', 'size']})
grouped.columns = ['患病', '总人数']
grouped['不患病'] = grouped['总人数'] - grouped['患病']  # 计算不患病的人数# 设置绘图风格
sns.set(style="whitegrid")plt.figure(figsize=(12, 5))# 获取x轴标签(即年龄)
x = grouped.index.astype(str)  # 将年龄转换为字符串格式便于显示# 画图
plt.bar(x, grouped["不患病"], 0.35, label="不患病", color="skyblue")
plt.bar(x, grouped["患病"], 0.35, label="患病", color="salmon")# 设置标题
plt.title("患病年龄分布", fontproperties='Microsoft YaHei')
plt.xlabel("年龄", fontproperties='Microsoft YaHei')
plt.ylabel("人数", fontproperties='Microsoft YaHei')# 如果需要对图例也应用相同的字体
plt.legend(prop={'family': 'Microsoft YaHei'})# 展示
plt.tight_layout()
plt.show()

在这里插入图片描述

8.特征选择

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_reportdata = data_df.copy()X = data_df.iloc[:, 1:-2]
y = data_df.iloc[:, -2]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 标准化
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)# 模型创建
tree = DecisionTreeClassifier()
tree.fit(X_train, y_train)
pred = tree.predict(X_test)
reporter = classification_report(y_test, pred)
print(reporter)
              precision    recall  f1-score   support0       0.91      0.92      0.92       2771       0.85      0.84      0.84       153accuracy                           0.89       430macro avg       0.88      0.88      0.88       430
weighted avg       0.89      0.89      0.89       430

9.构建数据集

feature_selection = ['年龄', '种族', '教育水平', '身体质量指数(BMI)', '酒精摄入量', '体育活动时间', '饮食质量评分','睡眠质量评分', '心血管疾病', '收缩压', '舒张压', '胆固醇总量', '低密度脂蛋白胆固醇(LDL)', '高密度脂蛋白胆固醇(HDL)', '甘油三酯', '简易精神状态检查(MMSE)得分', '功能评估得分', '记忆抱怨', '行为问题', '日常生活活动(ADL)得分']
X = data_df[feature_selection]# 标准化,标准化其实对应连续性数据,分类数据不适合,由于特征中只有种族是分类数据,这里我偷个“小懒”
sc = StandardScaler()
X = sc.fit_transform(X)X = torch.tensor(np.array(X), dtype=torch.float32)
y = torch.tensor(np.array(y), dtype=torch.long)# 再次进行特征选择
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

10.模型构建

batch_size = 32train_dl = DataLoader(TensorDataset(X_train, y_train),batch_size=batch_size,shuffle=True
)test_dl = DataLoader(TensorDataset(X_test, y_test),batch_size=batch_size,shuffle=False
)class Rnn_Model(nn.Module):def __init__(self):super().__init__()# 调用rnnself.rnn = nn.RNN(input_size=20, hidden_size=200, num_layers=1, batch_first=True)self.fc1 = nn.Linear(200, 50)self.fc2 = nn.Linear(50, 2)def forward(self, x):x, hidden1 = self.rnn(x)x = self.fc1(x)x = self.fc2(x)return x# 数据不大,cpu即可
device = "cpu"model = Rnn_Model().to(device)
model

11.构建训练集和测试集

def train(data, model, loss_fn, opt):size = len(data.dataset)batch_num = len(data)train_loss, train_acc = 0.0, 0.0for X, y in data:X, y = X.to(device), y.to(device)pred = model(X)loss = loss_fn(pred, y)# 反向传播opt.zero_grad()  # 梯度清零loss.backward()  # 求导opt.step()      # 设置梯度train_loss += loss.item()train_acc += (pred.argmax(1) == y).type(torch.float).sum().item()train_loss /= batch_numtrain_acc /= sizereturn train_acc, train_lossdef test(data, model, loss_fn):size = len(data.dataset)batch_num = len(data)test_loss, test_acc = 0.0, 0.0with torch.no_grad():for X, y in data:X, y = X.to(device), y.to(device)pred = model(X)loss = loss_fn(pred, y)test_loss += loss.item()test_acc += (pred.argmax(1) == y).type(torch.float).sum().item()test_loss /= batch_numtest_acc /= sizereturn test_acc, test_loss

12.训练

loss_fn = nn.CrossEntropyLoss()  # 损失函数
learn_lr = 1e-4                 # 超参数
optimizer = torch.optim.Adam(model.parameters(), lr=learn_lr)  # 优化器train_acc = []
train_loss = []
test_acc = []
test_loss = []epochs = 50for i in range(epochs):model.train()epoch_train_acc, epoch_train_loss = train(train_dl, model, loss_fn, optimizer)model.eval()epoch_test_acc, epoch_test_loss = test(test_dl, model, loss_fn)train_acc.append(epoch_train_acc)train_loss.append(epoch_train_loss)test_acc.append(epoch_test_acc)test_loss.append(epoch_test_loss)# 输出template = ('Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%, Test_loss:{:.3f}')print(template.format(i + 1, epoch_train_acc*100, epoch_train_loss, epoch_test_acc*100, epoch_test_loss))print("Done")
Epoch: 1, Train_acc:65.7%, Train_loss:0.650, Test_acc:68.4%, Test_loss:0.612
Epoch: 2, Train_acc:68.1%, Train_loss:0.580, Test_acc:70.5%, Test_loss:0.555
Epoch: 3, Train_acc:74.2%, Train_loss:0.526, Test_acc:76.7%, Test_loss:0.497
Epoch: 4, Train_acc:79.3%, Train_loss:0.473, Test_acc:80.9%, Test_loss:0.451
Epoch: 5, Train_acc:83.1%, Train_loss:0.429, Test_acc:81.9%, Test_loss:0.421
Epoch: 6, Train_acc:83.8%, Train_loss:0.402, Test_acc:83.3%, Test_loss:0.406
Epoch: 7, Train_acc:83.8%, Train_loss:0.386, Test_acc:83.3%, Test_loss:0.398
Epoch: 8, Train_acc:84.8%, Train_loss:0.378, Test_acc:83.5%, Test_loss:0.400
Epoch: 9, Train_acc:84.2%, Train_loss:0.376, Test_acc:84.9%, Test_loss:0.399
Epoch:10, Train_acc:84.9%, Train_loss:0.372, Test_acc:83.5%, Test_loss:0.404
Epoch:11, Train_acc:83.5%, Train_loss:0.377, Test_acc:83.7%, Test_loss:0.401
Epoch:12, Train_acc:84.4%, Train_loss:0.373, Test_acc:84.0%, Test_loss:0.399
Epoch:13, Train_acc:84.4%, Train_loss:0.371, Test_acc:83.5%, Test_loss:0.401
Epoch:14, Train_acc:84.9%, Train_loss:0.372, Test_acc:83.3%, Test_loss:0.397
Epoch:15, Train_acc:84.8%, Train_loss:0.370, Test_acc:84.0%, Test_loss:0.396
Epoch:16, Train_acc:85.2%, Train_loss:0.373, Test_acc:83.7%, Test_loss:0.400
Epoch:17, Train_acc:84.6%, Train_loss:0.373, Test_acc:84.0%, Test_loss:0.403
Epoch:18, Train_acc:84.6%, Train_loss:0.371, Test_acc:83.5%, Test_loss:0.401
Epoch:19, Train_acc:85.0%, Train_loss:0.368, Test_acc:83.3%, Test_loss:0.402
Epoch:20, Train_acc:84.5%, Train_loss:0.372, Test_acc:83.3%, Test_loss:0.403
Epoch:21, Train_acc:85.9%, Train_loss:0.371, Test_acc:83.0%, Test_loss:0.404
Epoch:22, Train_acc:84.6%, Train_loss:0.373, Test_acc:82.6%, Test_loss:0.400
Epoch:23, Train_acc:84.2%, Train_loss:0.374, Test_acc:82.8%, Test_loss:0.400
Epoch:24, Train_acc:84.2%, Train_loss:0.372, Test_acc:83.5%, Test_loss:0.400
Epoch:25, Train_acc:84.6%, Train_loss:0.372, Test_acc:83.0%, Test_loss:0.397
Epoch:26, Train_acc:85.0%, Train_loss:0.370, Test_acc:83.3%, Test_loss:0.400
Epoch:27, Train_acc:84.8%, Train_loss:0.373, Test_acc:83.0%, Test_loss:0.398
Epoch:28, Train_acc:84.4%, Train_loss:0.373, Test_acc:84.0%, Test_loss:0.398
Epoch:29, Train_acc:85.0%, Train_loss:0.369, Test_acc:83.7%, Test_loss:0.395
Epoch:30, Train_acc:84.6%, Train_loss:0.370, Test_acc:83.3%, Test_loss:0.397
Epoch:31, Train_acc:84.9%, Train_loss:0.369, Test_acc:84.7%, Test_loss:0.396
Epoch:32, Train_acc:84.9%, Train_loss:0.370, Test_acc:84.2%, Test_loss:0.395
Epoch:33, Train_acc:84.9%, Train_loss:0.370, Test_acc:84.2%, Test_loss:0.395
Epoch:34, Train_acc:84.8%, Train_loss:0.369, Test_acc:84.0%, Test_loss:0.398
Epoch:35, Train_acc:84.1%, Train_loss:0.373, Test_acc:84.4%, Test_loss:0.395
Epoch:36, Train_acc:85.0%, Train_loss:0.370, Test_acc:83.0%, Test_loss:0.400
Epoch:37, Train_acc:84.9%, Train_loss:0.371, Test_acc:83.3%, Test_loss:0.398
Epoch:38, Train_acc:85.0%, Train_loss:0.372, Test_acc:83.7%, Test_loss:0.398
Epoch:39, Train_acc:84.9%, Train_loss:0.369, Test_acc:83.3%, Test_loss:0.398
Epoch:40, Train_acc:85.4%, Train_loss:0.367, Test_acc:84.2%, Test_loss:0.396
Epoch:41, Train_acc:84.8%, Train_loss:0.368, Test_acc:84.0%, Test_loss:0.399
Epoch:42, Train_acc:84.6%, Train_loss:0.370, Test_acc:83.7%, Test_loss:0.396
Epoch:43, Train_acc:84.8%, Train_loss:0.369, Test_acc:83.7%, Test_loss:0.396
Epoch:44, Train_acc:84.8%, Train_loss:0.371, Test_acc:83.3%, Test_loss:0.401
Epoch:45, Train_acc:84.8%, Train_loss:0.372, Test_acc:84.2%, Test_loss:0.399
Epoch:46, Train_acc:85.1%, Train_loss:0.371, Test_acc:83.7%, Test_loss:0.397
Epoch:47, Train_acc:84.9%, Train_loss:0.369, Test_acc:83.5%, Test_loss:0.397
Epoch:48, Train_acc:85.1%, Train_loss:0.371, Test_acc:83.0%, Test_loss:0.397
Epoch:49, Train_acc:84.7%, Train_loss:0.372, Test_acc:83.3%, Test_loss:0.397
Epoch:50, Train_acc:85.0%, Train_loss:0.371, Test_acc:83.7%, Test_loss:0.397
Done

13.模型评估

import matplotlib.pyplot as plt
# 隐藏警告
import warnings
warnings.filterwarnings("ignore")  # 忽略警告信息
from datetime import datetime
current_time = datetime.now()  # 获取当前时间epochs_range = range(epochs)plt.figure(figsize=(12, 3))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, train_acc, label='Training Accuracy')
plt.plot(epochs_range, test_acc, label='Test Accuracy')
plt.legend(loc='lower right')
plt.title('Training Accuracy')
plt.xlabel(current_time) # 打卡请带上时间戳,否则代码截图无效plt.subplot(1, 2, 2)
plt.plot(epochs_range, train_loss, label='Training Loss')
plt.plot(epochs_range, test_loss, label='Test Loss')
plt.legend(loc='upper right')
plt.title('Training Loss')
plt.show()

在这里插入图片描述

14.混淆矩阵

from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplaypred = model(X_test.to(device)).argmax(1).cpu().numpy()# 计算混淆矩阵
cm = confusion_matrix(y_test, pred)# 计算
plt.figure(figsize=(6, 5))
sns.heatmap(cm, annot=True, fmt="d", cmap="Blues")
# 标题
plt.title("混淆矩阵")
plt.xlabel("Predicted Label")
plt.ylabel("True Label")plt.tight_layout()  # 自适应
plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913964.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913964.shtml
英文地址,请注明出处:http://en.pswp.cn/news/913964.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI的欧几里得要素时刻:从语言模型到可计算思维

引言 人工智能正在经历一个关键的转折点。就像欧几里得的《几何原本》为数学奠定了公理化基础一样,AI也正在寻找自己的"要素时刻"——一个能够将当前的语言模型能力转化为真正可计算、可验证思考的转变。 最近发表的论文《AI’s Euclid’s Elements Momen…

番外-linux系统运行.net framework 4.0的项目

基础环境:linux系统,.net framework 4.0,npgsql 2.2.5.0 (版本不同,构建可能失败) 方法背景:linux不支持运行.net framework 4.0,高版本mono不支持npgsql 2.x 主要使用&#xff1a…

国内AI训练都有哪些企业?:技术深耕与场景实践

国内AI训练都有哪些企业?当人工智能从实验室走向产业一线,AI 训练就像为智能系统 “施肥浇水” 的关键环节,让技术根系在各行业土壤里扎得更深。国内一批 AI 训练企业正各展所长,有的专攻技术优化,有的深耕场景应用。它…

微算法科技基于格密码的量子加密技术,融入LSQb算法的信息隐藏与传输过程中,实现抗量子攻击策略强化

随着量子计算技术的发展,传统加密算法面临被量子计算机破解的风险,LSQb 算法也需考虑应对未来可能的量子攻击。微算法科技基于格密码的量子加密技术,融入LSQb算法的信息隐藏与传输过程中,实现抗量子攻击策略强化。格密码在面对量子…

xAI发布Grok4+代码神器Grok4 Code,教你如何在国内升级订阅SuperGrok并使用到Grok4教程

就在今天,马斯克旗下xAI发布了其最新的旗舰AI模型Grok4,并同步推出专为开发者打造的编程利器 Grok 4 Code,还推出了一项全新的AI订阅计划——每月300美元的SuperGrokHeavy。 那最新发布的Grok4以及有哪些特性呢?以及如何才能使用…

Rust 变量遮蔽(Variable Shadowing)

在 Rust 中,变量遮蔽(Variable Shadowing) 是一种在同一作用域内重新声明同名变量的特性。它允许你创建一个新变量覆盖之前的同名变量,新变量与旧变量类型可以不同,且旧变量会被完全隐藏。核心特点允许同名变量重复声明…

【VScode | 快捷键】全局搜索快捷键(ctrl+shift+f)失效原因及解决方法

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 😎金句分享😎&a…

Windows 与 Linux 内核安全及 Metasploit/LinEnum 在渗透测试中的综合应用

目录 🛠️ 1. 内核安全如何助力渗透测试与黑客行业 1.1 内核安全的战略价值 1.2 结合 Metasploit 与 LinEnum 的作用 🔍 2. Metasploit 信息收集模块及其在内核安全中的应用 2.1 Windows 信息收集模块 2.2 Linux 信息收集模块 2.3 使用步骤 Wind…

京东携手HarmonyOS SDK首发家电AR高精摆放功能

在电商行业的演进中,商品的呈现方式不断升级:从文字、图片到视频,再到如今逐渐兴起的3D与AR技术。作为XR应用探索的先行者,京东正站在这场体验革新的最前沿,不断突破商品展示的边界,致力于通过创新技术让消…

瞄准Win10难民,苹果正推出塑料外壳、手机CPU的MacBook

最近有消息称,苹果正在研发一款定位“低价”的MacBook,售价可能低于800美元(约合人民币5800元),采用的是A18 Pro芯片,也就是未来iPhone 16 Pro同款的“手机芯片”,而不是现有的M系列。这款产品预…

原子级 macOS 信息窃取程序升级:新增后门实现持久化控制

臭名昭著的 Atomic macOS Stealer(AMOS,原子级 macOS 窃取程序)恶意软件近期完成危险升级,全球 Mac 用户面临更严峻威胁。这款与俄罗斯有关联的窃密程序首次植入后门模块,使攻击者能维持对受感染系统的持久访问、执行远…

Shader面试题100道之(81-100)

Shader面试题(第81-100题) 以下是第81到第100道Shader相关的面试题及答案: 81. Unity中如何实现屏幕空间的热扭曲效果(Heat Distortion)? 热扭曲效果可以通过GrabPass抓取当前屏幕图像,然后在片…

C#洗牌算法

洗牌算法是一种将序列(如数组、列表)元素随机打乱的经典算法,核心目标是让每个元素在打乱后出现在任意位置的概率均等。在 C# 中,常用的洗牌算法有Fisher-Yates 洗牌算法(也称 Knuth 洗牌算法),…

Python PDFplumber详解:从入门到精通的PDF处理指南

一、PDFplumber核心优势解析 在数字化办公场景中,PDF文档处理是数据分析师和开发者的必备技能。相较于PyPDF2、pdfminer等传统库,PDFplumber凭借其三大核心优势脱颖而出: 精准表格提取:采用流式布局分析算法,支持复杂表…

Flutter 与 Android 的互通几种方式

Flutter 与 Android 的互通主要通过以下几种方式实现,每种方式适用于不同的场景:1. 平台通道(Platform Channels) Flutter 与原生 Android 代码通信的核心方式,支持双向调用。 类型: MethodChannel&#xf…

全新开源AI知识库系统!PandaWiki一键构建智能文档,支持AI问答、创作与搜索!

传统 Wiki 工具像一本厚重的“死书”,虽能存储信息,却无法主动「思考」。而在当今AI席卷各个行业的浪潮中,知识管理也迎来了智能化的巨大飞跃。最近开源圈悄然走红的 PandaWiki,就用 AI 大模型为知识库注入了 灵魂, 它…

Rust 结构体

Rust 结构体 引言 Rust 是一种系统编程语言,以其内存安全、并发支持和零成本抽象而闻名。结构体(struct)是 Rust 中用于创建自定义数据类型的工具。本文将深入探讨 Rust 结构体的概念、用法以及其在实际编程中的应用。 结构体的定义 在 Rust 中,结构体是一种复合类型,…

lstm 数据输入问题

lstm 我有 20*6 条数据,20个样本,每个样本6条历史数据,每条数据有5个值,我送给网络输入时应该是20*6*5 还是 6*20*5你的数据是:20 个样本(batch size 20)每个样本有 6 条历史数据(s…

WPF打包exe应用的图标问题

目录 1、WPF打包方法 2、图标问题 1、WPF打包方法 使用Microsoft Visual Studio Installer Projects 2022工具打包(成功),需要新建Setup Project项目进行打包 (46 封私信) [C#.net资料]visual studio打包可安装的exe程序(添加配置文件)&am…

Qt中处理多个同类型对象共享槽函数应用

一.Qt中处理多个同类型对象共享槽函数应用场景数字键盘按钮处理动态生成的控件管理工具栏按钮响应游戏中的网格点击处理使用时需特别注意对象生命周期管理和类型安全,现代Qt开发中更推荐使用Lambda表达式替代sender()机制。二.示例1.本文示例功能在ui界面添加5个&am…