基于pytorch的steam游戏评分的线性回归问题分析

请添加图片描述

前言

  • 相信已经暑假一个月的大家肯定并不陌生上面这个学习软件(),面对琳琅满目的游戏总是让人不知道挑选什么,这时候一个游戏的评分往往便成为了一个玩家选择下载的原因,那么今天我们就来研究研究,steam上一个游戏的种种数据,是如何影响到其最终评分。
  • 本文将使用pytorch对steam_datasets数据集进行线性回归分析,并在文章结尾尝试加入非线性优化模型。
  • 本文仅提供处理此问题的一种思路,并不是最优,如有错误,请多多指正。
  • 数据集链接

问题阐述

  • 以下是数据集steam_datasets.csv的一小部分截图,它包含以下几个信息
    请添加图片描述

    • Column1:行数
    • game:游戏名
    • release:发行日期(1)
    • peak_players:巅峰玩家数 (2)
    • positive_reviews:好评(3)
    • negative_reviews:差评(4)
    • total_reviews: 总评价数
    • primary_genre: 游戏分类 (5)
    • detected_technologies 游戏开发平台(6)
    • review_percentage:玩家对游戏的总体满意程度(7)
    • players_right_now:当前玩家数(8)
    • 24_hour_peak:24小时玩家巅峰数(9)
    • all_time_peak:总玩家巅峰数(10)
    • rating:游戏打分(输出)
  • 要求根据上述提供的数据集完成下述要求:

    1. 标签选取:以上述10个标签作为线性回归的输入,尝试对rating进行线性回归预测
    2. 读取数据集:自行从csv数据集挑选合适数量的数据集(请不要全拿进去)作为训练集(注意数据预处理和错误数据的剔除)
    3. 选择合适的模型及其优化算法对模型进行训练
    4. 要求使用pytorch实现上述代码

数据预处理

数据解码
  • 在拿到数据集steam_datasets.csv并对其进行回归处理之前,我们首先需要对数据进行读取,在对数据进行读取之前,我们可以使用chardet库(这是一个用于检测文本数据的字符编码的库),对数据集进行编码检测,从而在使用pandas对数据集读取时指定正确的编码格式。
import chardet  
with open('./steam_datasets.csv', 'rb') as f:  result = chardet.detect(f.read())  # 编码检测  
print(result['encoding'])  # 输出编码格式
  • 此外,GB2312GBKGB18030,着三个编码格式是兼容的,包含的字符个数:GB2312 <GBK< GB18030,这里chardet库给出的结果是GB2312,但是使用这个编码格式进行读取会遇到报错,故我们往上选择GBK进行数据解码。

数据读取
  • Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。这里我们使用Pandascsv数据集进行读取,并指定编码格式。
import pandas as pd
raw_data=pd.read_csv('./steam_datasets.csv',encoding="GBK")
print(raw_data)

请添加图片描述


异常数据清理
  • 在完成数据转换之后,我们需要进行数据清洗,这包括处理缺失值、异常值和不必要的列。
  1. 处理缺失值: 对于缺失值,可以选择填充、删除含有缺失值的行或者使用模型预测缺失值。这里我们直接丢失。
raw_data = raw_data.dropna()
  1. 删除不必要的列:对于不是10标签输入的列,我们选择删除。
raw_data = raw_data.drop(['game','Column1','total_reviews'], axis=1)
raw_data = raw_data.dropna()
  1. 剔除非数值数据:对于标签peak_players, positive_reviews, negative_reviews, review_percentage, players_right_now, 24_hour_peak, all_time_peak, rating这8列都应该是数据类型,我们观察csv文件可以发现在这些标签中,混杂着非数值类型的日期和字符串,为此我们需要进行删除。
    • 如下出现了ratingall_time_peak出现非法值的情况请添加图片描述
def to_numeric_if_possible(x):  try:  return pd.to_numeric(x)  except (ValueError, TypeError):  return pd.NA  
check_labels=['peak_players', 'positive_reviews', 'negative_reviews', 'review_percentage', 'players_right_now', '24_hour_peak', 'all_time_peak', 'rating']  
# 指定列名并应用自定义函数  
raw_data[check_labels] = raw_data[check_labels].applymap(to_numeric_if_possible)  raw_data = raw_data.dropna()

数据分析–非数据类型标签转换
  • 通过观察上述10标签中,我们注意到release,primary_genre,detected_technologies着三个标签属于非数值,对于非数值类型的标签,我们需要转换为数值类型的标签来进行线性回归。
日期类数据处理
  • 观察release2023/1/26,属于日期类数据类型,我们可以将日期转换为距离某个特定日期的天数,这样可以作为一个连续变量用于回归。
  • 这里需要注意数据集中包含无法解析的日期类型,需要当作异常数据剔除。
from datetime import datetime  
# 尝试将 'release' 列转换为日期,无法解析的设置为 NaT
raw_data['release'] = pd.to_datetime(raw_data['release'], errors='coerce', format='%Y/%m/%d')  # 删除包含 NaT 的行  
raw_data = raw_data.dropna(subset=['release'])  
# 选择2005-01-01作为参考点
specific_date = datetime.strptime('2005-01-01', '%Y-%m-%d')  
raw_data['release'] = pd.to_datetime(raw_data['release']).map(lambda date: (date - specific_date).days)  
print(raw_data['release'])  
# 计算依次最大最小值是为了检查是否出现非法值,此外根据最大最小值调整参考日期
print(max(raw_data['release']))  
print(min(raw_data['release']))

字符型数据处理
  • 这里先介绍几种常见的非数值类型编码方式:
    • 哑编码(独热编码,One-Hot Encoding): 独热编码是一种将分类变量转换为一系列二进制列的过程,其中每列对应一个可能的类别值。这些列中的值通常为0或1,表示某个特定类别是否存在。
      • 当分类变量的类别数量较少时,独热编码是一种有效的处理方法。
    • 分解(Factorization):分解是将分类数据转换为整数的过程。每个类别被分配一个唯一的整数。这种方法不会产生独热编码那样的稀疏矩阵,但它可能会丢失一些类别间的信息,因为它只保留了一个整数而不是整个类别结构。
      • 当类别数量较多,且不需要保留原始类别结构时,分解是一种节省空间的处理方法。
    • 标签编码(Label Encoding):类别编码是将类别转换为数值的方法
  • 那么我们现在来观察这两个字符型数据,首先来观察primary_genre
    • 请添加图片描述

    • 观察可以发现,每个游戏分类都已经分配好对应的序号,且继续观察多标签的行数基本上都属于错误数据,都已经被剔除,故这里只需要提取出单分类的游戏分类对应的数据即可

  • 我们导入正则表达式re库对括号的数字进行提取,并对其中是否为单数字进行检测
import re  
# 使用正则表达式提取括号中的数字,并将它们转换为逗号分隔的字符串  
raw_data['primary_genre'] = raw_data['primary_genre'].apply(  lambda x: ','.join(re.findall(r'\((\d+)\)', x)))  is_single_digit = raw_data['primary_genre'].apply(lambda x: all(len(str(item)) == 1 for item in x))  
# 检查是否全部为单数字  
all_single_digit = is_single_digit.all()  
print(all_single_digit)  
print(raw_data['primary_genre'])  
# 将字符串转换为数字,使用之前的函数
raw_data['primary_genre'] = raw_data['primary_genre'].apply(to_numeric_if_possible)  
raw_data = raw_data.dropna()  print(raw_data['primary_genre'])  
# 输出最大最小值进行确认
print(max(raw_data['primary_genre']))  
print(min(raw_data['primary_genre']))

  • 然后接着我们来看detected_technologies
  • 观察发现,detected_technologies由好几种开发工具组成,为此我们使用代码进行统计请添加图片描述
primary_genre_str = raw_data['detected_technologies'].str.cat(sep=';')  # split 分割文本  
entries = [entry for line in primary_genre_str.split("\n") for entry in line.split(";")]  
all_categories=set()  
for entry in entries:  entry = entry.strip()  # 移除前后的空白字符  if '.' in entry:  all_categories.add(entry.split('.')[0])  
print(all_categories)
  • 通过统计字符.前面的字符串,我们得到了所有字符的分类请添加图片描述

  • 这里我们对所有标签进行统计,计算总类别数

all_categories=set()  
# 遍历每个条目,检查是否以 all_categories_label 中的某个标签开头  
for entry in entries:  entry = entry.strip()  for label in all_categories_label:  if entry.startswith(label):  all_categories.add(entry)  break  
print("all_categories ", all_categories)  
print("Number of all_categories:", len(all_categories))
  • 一共151类,够多的…这么看来使用独热编码是不太现实的,这里我采用标签编码 请添加图片描述
# 进行标签编码  
all_categories_dict = {label: idx for idx, label in enumerate(sorted(all_categories))}  
print(all_categories_dict)
  • 如下顾名思义请添加图片描述

  • 紧接着我们对原数据中的标签进行替换

# 使用正则表达式检查是否为数字  
data_as_lists = []  
for entry in raw_data['detected_technologies']:  # 分割字符串  split_entries = entry.split('; ')  # 只保留数字部分  numeric_entries = [int(num) for num in split_entries if re.match(r'^\d+$', num)]  data_as_lists.append(numeric_entries)  
raw_data['detected_technologies']=data_as_lists  print(raw_data['detected_technologies'])
  • 原始数据detected_technologies就完成了非字符型的处理的第一步请添加图片描述

  • 仔细观察,上述detected_technologies的数据的每一行是一个长度不定的输入,对于线性模型,在不想增加其输入维度的情况下,这里我采用PCA降维

  • 主成分分析(PCA,Principal Component Analysis)是一种统计方法,它通过正交变换将一组可能相关的变量转换为一组线性不相关的变量,这组变量称为主成分。PCA的主要目的是降维,即在尽可能保留原始数据信息的前提下,减少数据的特征维度。

from sklearn.decomposition import PCA  
import numpy as np  # 找到最长的列表长度  
max_length = max(len(lst) for lst in raw_data['detected_technologies'])  # 使用列表推导式和列表的extend方法来填充列表,确保所有列表长度一致  
padded_technologies = [x + [0]*(max_length - len(x)) for x in raw_data['detected_technologies']]  technologies_array = np.array(padded_technologies)  
# 应用PCA降维到1维  
pca = PCA(n_components=1)  
technologies_pca = pca.fit_transform(technologies_array)  
print(technologies_pca)  
raw_data['detected_technologies']=technologies_pca
  • 降维后我们得到:请添加图片描述

最终检查
  • 最终再确认一下
all_label=['rating','release','peak_players','positive_reviews','negative_reviews','primary_genre','detected_technologies','review_percentage','players_right_now','24_hour_peak','all_time_peak']  
# 再次检查每一列的数据类型  
for col in all_label:  print(f"{col}: {raw_data[col].dtype}")  
# 确保所有列都是数值类型  
for col in all_label:  if col=='detected_technologies':  continue  if raw_data[col].dtype == object:  # 尝试将非数值类型转换为数值类型  raw_data[col] = pd.to_numeric(raw_data[col], errors='coerce')  # 删除任何仍然包含 NaN 值的行  
raw_data = raw_data.dropna(subset=all_label)  
# 再次检查每一列的数据类型  
for col in all_label:  print(f"{col}: {raw_data[col].dtype}")  print(raw_data)


模型训练

  • 那么我们正式开始训练模型…
生成训练集/测试集
  • 数据标准化(Standardization):数据标准化旨在调整数据的尺度,使每个特征具有相同的数值范围,从而消除特征之间的量纲影响,确保数据在训练过程中被平等对待
  • 训练集(Training Set)-用于训练模型,即通过迭代优化模型的参数(如权重和偏置)来最小化损失函数。(有时候还会进行训练集验证集的划分)
  • 测试集(Test Set): 用于评估模型在未见过的数据上的表现,即模型的泛化能力。
import torch  
from sklearn.model_selection import train_test_split  
import torch.nn as nn  
from sklearn.preprocessing import StandardScaler  # 选择除了 'rating' 之外的所有列作为特征  
X = raw_data.drop(columns=['rating']).values  
# 标准化
scaler = StandardScaler()  
X = scaler.fit_transform(X)  
y = raw_data['rating'].values  # 划分训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)   
# 将数据转换为PyTorch张量  
X_train_tensor = torch.tensor(X_train, dtype=torch.float32)  
y_train_tensor = torch.tensor(y_train, dtype=torch.float32).view(-1, 1)  
X_test_tensor = torch.tensor(X_test, dtype=torch.float32)  
y_test_tensor = torch.tensor(y_test, dtype=torch.float32).view(-1, 1)

定义模型
  • 这边定义了一个简单的线性模型,继承自nn模组,需要重写forward用于前向传播
class LinearRegressionModel(nn.Module):  def __init__(self, input_dim):  super(LinearRegressionModel, self).__init__()  self.linear = nn.Linear(input_dim, 1)  def forward(self, x):  return self.linear(x)  # 实例化模型  
input_dim = X_train.shape[1]  
model = LinearRegressionModel(input_dim)

定义损失函数和优化器
  • 均方误差损失(MSELoss)
    • MSELoss计算预测值和真实值之间差的平方的平均值。
    • 它适用于回归问题,特别是当输出是连续值时。
    • 数学表达式为:MSELoss=1𝑛∑𝑖=1𝑛(𝑦𝑖−𝑦𝑖)2MSELoss=n1​∑i=1n​(yi​−y​i​)2 其中,𝑦𝑖yi​ 是真实值,𝑦𝑖y​i​ 是预测值,𝑛n 是样本数量。
  • 随机梯度下降(SGD)
    • SGD是一种常见的优化算法,用于寻找使损失函数最小化的参数。
    • model.parameters() 是模型中所有可学习参数的迭代器。
    • lr 是学习率(learning rate),它控制了参数更新的步长大小。学习率的选择对模型训练至关重要,太低的学习率可能导致训练缓慢,而太高的学习率可能导致训练过程不稳定或越过最小值。
criterion = nn.MSELoss()  
optimizer = torch.optim.SGD(model.parameters(), lr=0.004)

模型训练
  • 模型的训练很简单,如下,需要记得手动进行梯度清零和设置反向传播优化即可
# 训练模型  
num_epochs = 1000  
for epoch in range(num_epochs):  model.train()  optimizer.zero_grad()  # 前向传播  outputs = model(X_train_tensor)  # 计算损失  loss = criterion(outputs, y_train_tensor)  # 反向传播和优化  loss.backward()  optimizer.step()  if (epoch+1) % 100 == 0:  print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

模型测试
  • 在测试集上进行测试
# 在测试集上验证模型  
model.eval()  
with torch.no_grad():  predictions = model(X_test_tensor)  test_loss = criterion(predictions, y_test_tensor)  print(f'Test Loss: {test_loss.item():}')

获取结果
  • 通过输出权重和偏差,我们可以得到我们的方程
weights = model.linear.weight.data  
bias = model.linear.bias.data  
print(f"Weights: {weights}")  
print(f"Bias: {bias}")
  • 如下我们得到10输入的权重和偏差值请添加图片描述

  • 通过上述步骤,我们观察到损失在逐渐减小最后稳定请添加图片描述


总结和优化-加入非线性

加入ReLu激活函数和BN
  • 可以看得出来,上述线性模型的效果并没用达到很好的效果,这时我们考虑引入非线性
class ComplexModel(nn.Module):  def __init__(self, input_size):  super(ComplexModel, self).__init__()  self.fc = nn.Linear(input_size, 64)  self.bn = nn.BatchNorm1d(64)  self.relu = nn.ReLU()  self.fc2 = nn.Linear(64, 1)  def forward(self, x):  out = self.fc(x)  out = self.bn(out)  out = self.relu(out)  out = self.fc2(out)  return out
  • 批量归一化(Batch Normalization,简称BN)是一种用于加速深度网络训练的技术,同时也可以作为一种正则化手段,提高模型的泛化能力。
  • ReLU(Rectified Linear Unit)激活函数是目前深度学习中使用最广泛的激活函数之一
    • 𝑓(𝑥)=max⁡(0,𝑥)f(x)=max(0,x)
    • 非线性:ReLU函数为网络引入了非线性特性,这对于神经网络能够捕捉复杂的数据模式至关重要。
更换优化器Adam
  • 同时我们更换优化器为Adam:Adam算法通过计算梯度的一阶矩估计(即均值)和二阶矩估计(即未中心化的方差)来适应性地调整每个参数的学习率。
optimizer = torch.optim.Adam(model.parameters(), lr=0.4)
增加迭代轮数
  • 我们稍微增加以下迭代轮数
num_epochs = 50000
结果
  • 通过训练结果可以看到,相比于线性模型,非线性的引入使模型的loss下降了,虽然还有一些参数和模型可以调整进一步优化(懒了不想做啦)
    请添加图片描述

总结

  • 从上述我们可以看出,数据预处理实际上远远比模型训练更重要也更关键,往往成败就在数据处理种
  • 非线性的引入会使模型损失大大减小
  • 本文仅提供处理此问题的一种思路,并不是最优,还有参数可以调整,如有错误,请多多指正。

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

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

相关文章

【window10/window11】解决任务管理器有进程无法强制结束情况

以管理员身份启动控制台窗体&#xff0c;然后从任务管理器中查询到你要结束的进程名&#xff0c;然后运行以下命令&#xff08;UniAccessAgent.exe替换成你要结束的进程&#xff09;&#xff1a; wmic process where nameUniAccessAgent.exe delete 此方法可以解决在任务管理…

快速体验LLaMA-Factory 私有化部署和高效微调Llama3模型(曙光超算互联网平台异构加速卡DCU)

序言 本文以 LLaMA-Factory 为例&#xff0c;在超算互联网平台SCNet上使用异构加速卡AI 显存64GB PCIE&#xff0c;私有化部署Llama3模型&#xff0c;并对 Llama3-8B-Instruct 模型进行 LoRA 微调、推理和合并。 快速体验基础版本&#xff0c;请参考另一篇博客&#xff1a;快…

Animate软件基础:在时间轴中标识动画

FlashASer&#xff1a;AdobeAnimate2021软件零基础入门教程https://zhuanlan.zhihu.com/p/633230084 FlashASer&#xff1a;实用的各种Adobe Animate软件教程https://zhuanlan.zhihu.com/p/675680471 FlashASer&#xff1a;Animate教程及作品源文件https://zhuanlan.zhihu.co…

React--》掌握styled-components重塑React样式管理

想象一下&#xff0c;如果你的React组件不仅能自描述其逻辑&#xff0c;还能直接声明自己的样式&#xff0c;这种“所见即所得”的编程体验是不是让人心动不已&#xff1f;styled-components正是这样一把钥匙&#xff0c;它彻底颠覆了我们对React样式管理的传统认知&#xff0c…

CH571F蓝牙orUSB摇杆鼠标

演示视频&#xff1a; 短视频刷个爽 程序基本上是基于官方的例程上改的&#xff0c;用到的例程有&#xff1a;蓝牙的HID_Mouse,USB的CompoundDev&#xff0c;还有ADC&#xff0c;按键中断。 主要原理 就是ADC采集采集摇杆电压&#xff0c;通过蓝牙HID或者USB的HID发送给电脑或…

Java中操作文件

认识⽂件 我们先来认识狭义上的⽂件(file)。针对硬盘这种持久化存储的I/O设备&#xff0c;当我们想要进⾏数据保存时&#xff0c; 往往不是保存成⼀个整体&#xff0c;⽽是独⽴成⼀个个的单位进⾏保存&#xff0c;这个独⽴的单位就被抽象成⽂件的概 念&#xff0c;就类似办公桌…

Parallels Desktop19让你的Mac无缝运行Windows!

大家好&#xff0c;我是你们的科技小伙伴&#xff0c;今天我要给大家安利一款神奇的软件——Parallels Desktop 19虚拟机。这款产品真的是让我眼前一亮&#xff0c;用起来简直不能更爽&#xff01; 让我们来聊聊为什么我们需要一个虚拟机。 想象一下&#xff0c;你是一个Mac用…

多租户系统数据隔离方案

目录 前言 数据行 数据表 基于业务场景 基于数据量 数据库 数据源表 动态数据源 前言 多租户系统是一种将多个客户的数据和应用程序分开的系统&#xff0c;每个客户被视为一个独立的租户&#xff0c;互不干扰。实现多租户系统的关键之一是确保数据的隔离。 数据隔离的…

[云原生]三、Kubernetes(1.18)

主要内容: 1、kubernetes 简介 2、kubernetes 集群搭建  方式搭建  二进制方式搭建 3、 kubeadm kubernetes 核心技术  YAML 文件详解  kubectl 命令工具  Pod  Label  Controller 控制器 …

职业教育大数据实验实训室建设应用案例

大数据作为一种重要的信息技术&#xff0c;对各行各业产生了深远的影响。职业教育作为培养应用型人才的摇篮&#xff0c;建设大数据实验实训室&#xff0c;对于提高学生的数据分析能力和解决实际问题的能力具有重要意义。唯众作为一家专注于教育技术领域的企业&#xff0c;凭借…

从零开始:MySQL安装与配置完全指南

前言 哇&#xff0c;终于进入到令人激动的MySQL环节了 它可以说是你编程生涯中的最佳朋友&#xff0c;因为它总是能存储你的数据&#xff0c;从不说&#xff1a;“我忘记了你的信 息”。而且&#xff0c;它是免费的&#xff0c;不像一些昂贵的数据库&#xff0c;它从不让你的…

量产部落SM2258XT开卡软件,SM2258XT主控128G SSD固态卡死修复

故障现象&#xff1a;连接此固态硬盘后电脑就会卡死&#xff0c;拔掉重新连接概率性显示盘符&#xff0c;显示了之后也不能正常操作&#xff0c;一点击打开&#xff0c;电脑就立马卡死。 解决过程&#xff1a;下载了很多款量产工具&#xff0c;都不能开卡成功&#xff0c;点击…

Elasticsearch 未授权访问漏洞

Elasticsearch 未授权访问漏洞 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流行的企业级搜索…

iAppv3无白银会员使用SDK

前言 一个实用小技巧分享给大家。 工具 iapp&#xff1a;百度或点我获取 Mt管理器&#xff1a;百度或点我获取 教程 1.移出“项目路径/apk/lib/”内的全部文件 2.在iapp内测试打包&#xff0c;打包完成后直接返回&#xff0c;不要安装 3.在mt管理器里面点击“项目路径/b…

【课程总结】Day18:Seq2Seq的深入了解

前言 在上一章【课程总结】Day17&#xff08;下&#xff09;&#xff1a;初始Seq2Seq模型中&#xff0c;我们初步了解了Seq2Seq模型的基本情况及代码运行效果&#xff0c;本章内容将深入了解Seq2Seq模型的代码&#xff0c;梳理代码的框架图、各部分组成部分以及运行流程。 框…

【大模型系列】LanguageBind(ICLR2024.01)

Paper&#xff1a;https://arxiv.org/abs/2310.01852Github&#xff1a;https://github.com/PKU-YuanGroup/LanguageBindHuggingface&#xff1a;https://huggingface.co/spaces/LanguageBind/LanguageBindAuthor&#xff1a;Bin Zhu et al. 北大袁粒团队 文章目录 1 LanguageB…

入门mem0.NET

入门mem0.NET 安装包 如果你的项目使用了EntityFrameworkCore,那么你可以跟随这个教程走 <ItemGroup><PackageReference Include"mem0.NET" Version"0.1.7" /><PackageReference Include"mem0.NET.Qdrant" Version"0.1.7…

软件测试需要具备的基础知识【功能测试】---前端知识(一)

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 为了更好的学习软件测试的相关技能&#xff0c;需要具备一定的基础知识。需要学习的基础知识包括&#xff1a; 1、计算机基础 2、前端知识 3、后端知识 4、软件测试理论 后期分四篇文章进行编写&#xff0c;这是第二篇 …

【精选】通信与感知(ISAC)必读好文

微信公众号&#xff1a;EW Frontier 个人博客&#xff1a;106.54.201.174 QQ交流群&#xff1a;949444104 简介 通信与感知&#xff08;ISAC&#xff09;也被称为联合雷达通信 (JRC) / 联合通信和雷达传感 (JCAS) / 双功能雷达通信 (DFRC) 定义&#xff1a;将传感和通信系统集…

记录一次学习过程(msf、cs的使用、横向渗透等等)

目录 用python搭建一个简单的web服务器 代码解释 MSF msfvenom 功能 用途 查看payloads列表 msfconsole 功能 用途 msfvenom和msfconsole配合使用 来个例子 msf会话中用到的一些命令 在windows中net user用法 列出所有用户账户 显示单个用户账户信息 创建用户账…