【数据挖掘实战】 房价预测

本次对kaggle中的入门级数据集,房价回归数据集进行数据挖掘,预测房屋价格。

本人主页:机器学习司猫白

机器学习专栏:机器学习实战

PyTorch入门专栏:PyTorch入门

深度学习实战:深度学习

ok,话不多说,我们进入正题吧

概述

本次竞赛有 79 个解释变量(几乎)描述了爱荷华州艾姆斯住宅的各个方面,需要预测每套住宅的最终价格。

数据集描述

本次数据集已经上传,大家可以自行下载尝试

文件说明

  • train.csv - 训练集

  • test.csv - 测试集

  • data_description.txt - 每列的完整描述,最初由 Dean De Cock 准备,但经过轻微编辑以匹配此处使用的列名称

  • Sample_submission.csv - 根据销售年份和月份、地块面积和卧室数量的线性回归提交的基准

建模思路

本次预测是预测房屋价格,很明显是一个回归预测。这里考虑使用线性回归和树模型的回归进行尝试并优化其中参数,选择最佳的一个模型进行预测,输出每个房屋的预测价格。

Python源码

一,打开数据文件,查看数据的基本情况。
import numpy as np 
import pandas as pd train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')
train_data.info()

输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1460 entries, 0 to 1459
Data columns (total 81 columns):#   Column         Non-Null Count  Dtype  
---  ------         --------------  -----  0   Id             1460 non-null   int64  1   MSSubClass     1460 non-null   int64  2   MSZoning       1460 non-null   object 3   LotFrontage    1201 non-null   float644   LotArea        1460 non-null   int64  5   Street         1460 non-null   object 6   Alley          91 non-null     object 7   LotShape       1460 non-null   object 8   LandContour    1460 non-null   object 9   Utilities      1460 non-null   object 10  LotConfig      1460 non-null   object 11  LandSlope      1460 non-null   object 12  Neighborhood   1460 non-null   object 13  Condition1     1460 non-null   object 14  Condition2     1460 non-null   object 15  BldgType       1460 non-null   object 16  HouseStyle     1460 non-null   object 17  OverallQual    1460 non-null   int64  18  OverallCond    1460 non-null   int64  19  YearBuilt      1460 non-null   int64  20  YearRemodAdd   1460 non-null   int64  21  RoofStyle      1460 non-null   object 22  RoofMatl       1460 non-null   object 23  Exterior1st    1460 non-null   object 24  Exterior2nd    1460 non-null   object 25  MasVnrType     588 non-null    object 26  MasVnrArea     1452 non-null   float6427  ExterQual      1460 non-null   object 28  ExterCond      1460 non-null   object 29  Foundation     1460 non-null   object 30  BsmtQual       1423 non-null   object 31  BsmtCond       1423 non-null   object 32  BsmtExposure   1422 non-null   object 33  BsmtFinType1   1423 non-null   object 34  BsmtFinSF1     1460 non-null   int64  35  BsmtFinType2   1422 non-null   object 36  BsmtFinSF2     1460 non-null   int64  37  BsmtUnfSF      1460 non-null   int64  38  TotalBsmtSF    1460 non-null   int64  39  Heating        1460 non-null   object 40  HeatingQC      1460 non-null   object 41  CentralAir     1460 non-null   object 42  Electrical     1459 non-null   object 43  1stFlrSF       1460 non-null   int64  44  2ndFlrSF       1460 non-null   int64  45  LowQualFinSF   1460 non-null   int64  46  GrLivArea      1460 non-null   int64  47  BsmtFullBath   1460 non-null   int64  48  BsmtHalfBath   1460 non-null   int64  49  FullBath       1460 non-null   int64  50  HalfBath       1460 non-null   int64  51  BedroomAbvGr   1460 non-null   int64  52  KitchenAbvGr   1460 non-null   int64  53  KitchenQual    1460 non-null   object 54  TotRmsAbvGrd   1460 non-null   int64  55  Functional     1460 non-null   object 56  Fireplaces     1460 non-null   int64  57  FireplaceQu    770 non-null    object 58  GarageType     1379 non-null   object 59  GarageYrBlt    1379 non-null   float6460  GarageFinish   1379 non-null   object 61  GarageCars     1460 non-null   int64  62  GarageArea     1460 non-null   int64  63  GarageQual     1379 non-null   object 64  GarageCond     1379 non-null   object 65  PavedDrive     1460 non-null   object 66  WoodDeckSF     1460 non-null   int64  67  OpenPorchSF    1460 non-null   int64  68  EnclosedPorch  1460 non-null   int64  69  3SsnPorch      1460 non-null   int64  70  ScreenPorch    1460 non-null   int64  71  PoolArea       1460 non-null   int64  72  PoolQC         7 non-null      object 73  Fence          281 non-null    object 74  MiscFeature    54 non-null     object 75  MiscVal        1460 non-null   int64  76  MoSold         1460 non-null   int64  77  YrSold         1460 non-null   int64  78  SaleType       1460 non-null   object 79  SaleCondition  1460 non-null   object 80  SalePrice      1460 non-null   int64  
dtypes: float64(3), int64(35), object(43)
memory usage: 924.0+ KB

根据输出结果,我们可以看到数据集中存在缺失值。缺失值如果不处理,会影响后续建模过程,甚至可能导致模型报错。这里有一个具体的情况需要说明:假设缺失值出现在object类型的特征中,通常情况下,我们会使用独热编码(One-Hot Encoding)将分类数据转化为数值。如果我们直接对包含缺失值的列进行独热编码,可能会生成一列专门表示缺失值(通常是NaN的列)。这样会导致训练数据和后续用于预测的实际数据维度不一致,进而无法使用模型进行预测。

此外,一些模型对NaN值非常敏感,因为NaN表示缺失数据,而不是数值类型。如果模型在训练时遇到NaN值,很多模型会因此报错,因为它们无法处理非数值的输入数据。因此,在建模前,我们需要先处理缺失值,确保数据的一致性和模型能够正确训练。常见的处理方法包括填充缺失值(如使用均值、中位数或众数填充)或者删除包含缺失值的行或列。

数据维度一致性:训练数据和预测数据的特征维度必须完全一致,否则模型无法正确应用于新数据。

二,数据处理和特征工程

# 计算每个特征的缺失值比例
missing_values = train_data.isnull().sum()  # 计算每一列的缺失值数量
total_values = train_data.shape[0]  # 获取总行数# 计算每一列缺失值的比例
missing_percentage = (missing_values / total_values) * 100# 显示缺失值比例超过50%的特征
high_missing_features = missing_percentage[missing_percentage > 50]# 输出缺失值比例超过50%的特征
high_missing_features

输出:

Alley          93.767123
MasVnrType     59.726027
PoolQC         99.520548
Fence          80.753425
MiscFeature    96.301370
dtype: float64

这里计算了缺失值的比例。

train_data2 = train_data.drop(['MiscFeature', 'Fence', 'PoolQC',  'MasVnrType', 'Alley','Id'], axis=1)
test_data2 = test_data.drop(['MiscFeature', 'Fence', 'PoolQC', 'MasVnrType', 'Alley','Id'], axis=1)
id = test_data['Id']
train_data2.shape, test_data2.shape

删除缺失值过多的列,剩下的列采用填充的方法进行处理。

# 处理测试集中的缺失值
for column in test_data2.columns:if test_data2[column].dtype == 'object':# 对象类型,使用训练集的众数填充test_data2[column].fillna(train_data2[column].mode()[0], inplace=True)else:# 数值类型,使用训练集的中位数填充test_data2[column].fillna(train_data2[column].median(), inplace=True)# 处理训练集中的缺失值
for column in train_data2.columns:if train_data2[column].dtype == 'object':# 对象类型,使用训练集的众数填充train_data2[column].fillna(train_data2[column].mode()[0], inplace=True)else:# 数值类型,使用训练集的中位数填充train_data2[column].fillna(train_data2[column].median(), inplace=True)# 查看处理后的训练集和测试集
print(train_data2.shape)
print(test_data2.shape)

输出:

(1460, 75)
(1459, 74)

缺失值处理完毕,接下来就可以划分目标变量和特征。

train_data3=train_data2.drop(['SalePrice'], axis=1)label=train_data2['SalePrice']
train_data3.shape

输出:

(1460, 74)

这里可以看到,特征较多,考虑尝试使用相关性去除一部分。

import seaborn as sns
import matplotlib.pyplot as plt# 选择所有数值类型的列
numerical_data = train_data3.select_dtypes(include=['number'])# 计算相关性矩阵
correlation_matrix = numerical_data.corr()# 设置绘图的尺寸
plt.figure(figsize=(15, 8))# 使用seaborn绘制热图
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt='.1f', linewidths=0.5)# 设置标题
plt.title('Correlation Heatmap of Numerical Features')# 显示热图
plt.show()

有点看不太清,那就直接使用阈值,去除相关性大于0.8的列。

# 设置相关性阈值
threshold = 0.8# 找到相关性大于阈值的列对
to_drop = set()  # 用于存储要删除的列
for i in range(len(correlation_matrix.columns)):for j in range(i):if abs(correlation_matrix.iloc[i, j]) > threshold:colname = correlation_matrix.columns[i]# 仅当当前列未被标记删除时才进行删除操作if colname not in to_drop:to_drop.add(correlation_matrix.columns[j])list(to_drop)

输出:

['GarageCars', 'GrLivArea', 'TotalBsmtSF']
# 删除相关性较强的列
train_data4 = train_data3.drop(columns=to_drop)
test_data4 = test_data2.drop(columns=to_drop)print(train_data4.shape)
print(test_data4.shape)
from sklearn.preprocessing import LabelEncoder# 创建每个类别特征进行编码
for column in train_data4.select_dtypes(include=['object']).columns:# 合并训练集和测试集的类别,以创建一个包含所有可能类别的编码器all_categories = pd.concat([train_data4[column], test_data4[column]]).unique()encoder = LabelEncoder()encoder.fit(all_categories)# 使用编码器对训练集和测试集进行编码train_data4[column] = encoder.transform(train_data4[column])test_data4[column] = encoder.transform(test_data4[column])# 查看处理后的训练集和测试集
print(train_data4.shape)
print(test_data4.shape)

这里对object类型的列进行编码,使其变为数值,至于为什么使用标签编码,后续我会出一个有关特征编码的文章,这里不多进行赘述。

三,模型训练与评估

先考虑使用线性回归中的岭回归,来看看效果。

import numpy as np
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_splitX = train_data4  # 特征数据
y = label  # 目标变量# 划分数据集为训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)# 定义岭回归模型
ridge_model = Ridge()# 设置待调优的超参数范围,这里我们主要调节 alpha(正则化参数)
param_grid = {'alpha': np.logspace(-6, 6, 13)}  # alpha 的范围通常是从 1e-6 到 1e6# 使用交叉验证来选择最佳的 alpha 参数
grid_search = GridSearchCV(ridge_model, param_grid, cv=5, scoring='neg_mean_squared_error')  # 5折交叉验证,使用负均方误差作为评分标准# 拟合模型
grid_search.fit(X_train, y_train)# 输出最佳参数
print("Best alpha parameter:", grid_search.best_params_)# 获取最佳模型
best_ridge_model = grid_search.best_estimator_# 使用最佳模型在验证集上评估
score = best_ridge_model.score(X_val, y_val)
print("Model R^2 score on validation set:", score)# 输出交叉验证的结果
print("Best cross-validation score:", grid_search.best_score_)
Best alpha parameter: {'alpha': 100.0}
Model R^2 score on validation set: 0.8496053872702527
Best cross-validation score: -1348455440.2012005

再使用lightgbm,树模型来看看效果。

import optuna
import lightgbm as lgb
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_scoreX = train_data4  # 特征数据
y = label  # 目标变量# 划分训练集和验证集
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=42)def objective(trial):# 使用Optuna选择超参数params = {'objective': 'regression',  # 回归任务'boosting_type': 'gbdt',  # 梯度提升决策树'num_leaves': trial.suggest_int('num_leaves', 20, 100),  # 树的最大叶子数'learning_rate': trial.suggest_float('learning_rate', 1e-5, 1e-1, log=True),  # 学习率,使用对数均匀分布'n_estimators': trial.suggest_int('n_estimators', 50, 500),  # 树的数量'max_depth': trial.suggest_int('max_depth', 3, 15),  # 树的最大深度'subsample': trial.suggest_float('subsample', 0.5, 1.0),  # 数据采样率'colsample_bytree': trial.suggest_float('colsample_bytree', 0.5, 1.0),  # 特征采样率'min_child_samples': trial.suggest_int('min_child_samples', 5, 100),  # 每个叶子的最小样本数'reg_alpha': trial.suggest_float('reg_alpha', 1e-5, 1.0, log=True),  # L1 正则化'reg_lambda': trial.suggest_float('reg_lambda', 1e-5, 1.0, log=True)  # L2 正则化}# 创建LightGBM模型model = lgb.LGBMRegressor(**params, verbose=-1)# 训练模型model.fit(X_train, y_train)# 进行预测y_pred = model.predict(X_valid)# 计算RMSE(均方根误差)rmse = np.sqrt(mean_squared_error(y_valid, y_pred))return rmse  # Optuna将根据最小化RMSE来寻找最佳超参数# 创建Optuna的Study对象
study = optuna.create_study(direction='minimize')  # 最小化RMSE# 开始超参数优化
study.optimize(objective, n_trials=50)  # 尝试100次# 输出最佳超参数和对应的RMSE值
print(f"Best trial: {study.best_trial.params}")
print(f"Best RMSE: {study.best_value}")# 使用最佳超参数训练最终模型
best_params = study.best_trial.params
final_model = lgb.LGBMRegressor(**best_params, verbose=-1)# 训练最终模型时
final_model.fit(X_train, y_train)# 在验证集上进行预测并计算RMSE和R2
y_pred_final = final_model.predict(X_valid)
final_rmse = np.sqrt(mean_squared_error(y_valid, y_pred_final))
final_r2 = r2_score(y_valid, y_pred_final)print(f"Final RMSE on validation set: {final_rmse}")
print(f"Final R2 on validation set: {final_r2}")
Best trial: {'num_leaves': 97, 'learning_rate': 0.013163137448188754, 'n_estimators': 372, 'max_depth': 11, 'subsample': 0.8474988867349187, 'colsample_bytree': 0.7064845955811748, 'min_child_samples': 5, 'reg_alpha': 0.0011685340064003379, 'reg_lambda': 0.041584313394230084}
Best RMSE: 26248.97344413891
Final RMSE on validation set: 26248.97344413891
Final R2 on validation set: 0.910172189779164

根据输出结果,初步发现lightgbm模型效果会更好。这里解释以下回归模型的评估,比如这里的RMSE,虽然说这个指标是越小越好,小到多少是好,大到多少是不好,这里要讲的是RMSE更像是一个相对指标,比如第一次运行RMSE为1000,第二次运行RMSE是998,那么第二次运行的就是更优的,并没有一个绝对的数值来评判,而是相对的比较。

1. 这里使用 Optuna 对 LightGBM 回归模型的超参数进行优化,目的是找到能够最小化 RMSE 的最佳参数组合。

2. 优化的超参数包括树的深度、叶子数、学习率等。

3. 最终训练并评估了一个基于最佳超参数的回归模型,并计算了其在验证集上的 RMSE 和 

由于数据量较小,很容易过拟合,因此加入了l1和l2正则化,并进行超参数优化,可以看到训练集RMSE和测试集RMSE非常接近,说明并没有过度拟合。

四,使用真实的数据运行模型,预测房屋的价格
y_pred_test = final_model.predict(test_data4)
# 将预测结果转换为 DataFrame
y_pred_df = pd.DataFrame({'Id': test_data['Id'],'SalePrice': y_pred_test
})# 保存预测结果到 CSV 文件
y_pred_df.to_csv('predictions.csv', index=False)
y_pred_df
IdSalePrice
01461128989.106316
11462155402.491796
21463173423.163568
31464184025.799434
41465200870.139148
.........
1454291584714.331635
1455291689781.868635
14562917171236.073006
14572918121141.145259
14582919220957.998442

1459 rows × 2 columns

这样模型的预测结果就保存为了csv文件。

五,展示特征重要性

import matplotlib.pyplot as plt
# 绘制特征重要性图
lgb.plot_importance(final_model, importance_type='split', max_num_features=10, figsize=(10, 6))
plt.title('Feature Importance (Split)')
plt.show()

根据特征重要性图可以发现,影响房屋价格的最大因素是1stFlrSF,也就是房租第一层的面积。

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=5mtxxtr44v7

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

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

相关文章

HTML 表单和输入标签详解

HTML 表单是网页与用户交互的重要工具&#xff0c;它允许用户输入数据并将其提交到服务器。表单在网页中的应用非常广泛&#xff0c;例如登录、注册、搜索、评论等功能都离不开表单。本文将详细介绍 HTML 表单及其相关标签的使用方法&#xff0c;帮助你全面掌握表单的设计与实现…

华为EC6110T-海思Hi3798MV310_安卓9.0_通刷-强刷固件包

华为EC6110T-海思Hi3798MV310_安卓9.0_通刷-强刷固件包 刷机教程说明&#xff1a; 适用机型&#xff1a;华为EC6110-T、华为EC6110-U、华为EC6110-M 破解总分为两个部分&#xff1a;拆机短接破解&#xff08;保留IPTV&#xff09;和OTT卡刷&#xff08;不保留IPTV&#xff09…

在centos上编译安装opensips【初级-默认安装】

环境&#xff1a;centos9 last opensips3.2 dnf update -y dnf install -y gcc make git automake libtool pcre-devel libxml2-devel \libcurl-devel postgresql-devel \bzip2-devel zlib-devel ncurses-devel libuuid-devel \libpcap-devel # 有报错的直接删除cd /usr/lo…

线性规划:机器学习中的优化利器

一、线性规划的基本概念 线性规划&#xff08;Linear Programming, LP&#xff09;是运筹学中数学规划的一个重要分支&#xff0c;用于在一组线性不等式的约束条件下&#xff0c;找到线性目标函数的最大值或最小值。其问题可以表述为&#xff1a; 在一组线性约束条件 s.t.&am…

基于AutoDL云计算平台+LLaMA-Factory训练平台微调本地大模型

1. 注册与认证 访问AutoDL官网&#xff1a;前往 AutoDL官网。 注册账号&#xff1a;完成注册流程。 实名认证&#xff1a;按照要求完成实名认证&#xff0c;以确保账号的合规性。 2. 选择GPU资源 进入算力市场&#xff1a;在官网首页点击“算力市场”菜单。 挑选GPU&#x…

04JavaWeb——Maven-SpringBootWeb入门

Maven 课程内容 初识Maven Maven概述 Maven模型介绍 Maven仓库介绍 Maven安装与配置 IDEA集成Maven 依赖管理 01. Maven课程介绍 1.1 课程安排 学习完前端Web开发技术后&#xff0c;我们即将开始学习后端Web开发技术。做为一名Java开发工程师&#xff0c;后端Web开发…

Linux内核编程(二十一)USB驱动开发-键盘驱动

一、驱动类型 USB 驱动开发主要分为两种&#xff1a;主机侧的驱动程序和设备侧的驱动程序。一般我们编写的都是主机侧的USB驱动程序。 主机侧驱动程序用于控制插入到主机中的 USB 设备&#xff0c;而设备侧驱动程序则负责控制 USB 设备如何与主机通信。由于设备侧驱动程序通常与…

< OS 有关 > 阿里云:轻量应用服务器 的使用 安装 Tailscale 后DNS 出错, 修复并替换 apt 数据源

VPS 配置 主机&#xff1a;vCPU x2, 512MB, 20GB位置&#xff1a;阿里云&#xff0c;日本.东京OS&#xff1a; ubuntu24.20 原因&#xff1a; 这篇是操作过程的记录文章。 2 个月前&#xff0c; 在阿里云买了台 vps 。当时本想放到韩国&#xff0c;因为它离北京近。 但最便…

【STM32-学习笔记-11-】RTC实时时钟

文章目录 RTC实时时钟一、RTC简介二、RTC框图三、RTC基本结构四、RTC操作注意事项五、RTC函数六、配置RTCMyRTC.c 七、示例&#xff1a;实时时钟①、main.c②、MyRTC.c③、MyRTC.h RTC实时时钟 一、RTC简介 RTC&#xff08;Real Time Clock&#xff09;实时时钟 RTC是一个独立…

Hadoop•搭建完全分布式集群

听说这里是目录哦 一、安装Hadoop&#x1f955;二、配置Hadoop系统环境变量&#x1f96e;三、验证Hadoop系统环境变量是否配置成功&#x1f9c1;四、修改Hadoop配置文件&#x1f36d;五、分发Hadoop安装目录&#x1f9cb;六、分发系统环境变量文件&#x1f368;七、格式化HDFS文…

网络通信---MCU移植LWIP

使用的MCU型号为STM32F429IGT6&#xff0c;PHY为LAN7820A 目标是通过MCU的ETH给LWIP提供输入输出从而实现基本的Ping应答 OK废话不多说我们直接开始 下载源码 LWIP包源码&#xff1a;lwip源码 -在这里下载 ST官方支持的ETH包&#xff1a;ST-ETH支持包 这里下载 创建工程 …

将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(3.纯python的实惠版)

前情&#xff1a; 将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch&#xff08;1.标准版&#xff09;-CSDN博客 将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch&#xff08;2.换掉付费的Event Hubs&#xff09;-CSDN博客 python脚本实现 厉害的…

Kafka-常见的问题解答

讲一讲分布式消息中间件 问题 什么是分布式消息中间件&#xff1f;消息中间件的作用是什么&#xff1f;消息中间件的使用场景是什么&#xff1f;消息中间件选型&#xff1f; 分布式消息是一种通信机制&#xff0c;和 RPC、HTTP、RMI 等不一样&#xff0c;消息中间件采用分布式…

Android系统开发(六):从Linux到Android:模块化开发,GKI内核的硬核科普

引言&#xff1a; 今天我们聊聊Android生态中最“硬核”的话题&#xff1a;通用内核镜像&#xff08;GKI&#xff09;与内核模块接口&#xff08;KMI&#xff09;。这是内核碎片化终结者的秘密武器&#xff0c;解决了内核和供应商模块之间无尽的兼容性问题。为什么重要&#x…

数据结构-二叉树

树的相关概念&#xff1a; 1、节点的度&#xff1a;树中一个节点的孩子个数称为该节点的度&#xff0c; 所有节点的度的最大值是树的度 2、分支节点&#xff1a;度大于0的节点称为分支节点 3、叶子结点&#xff1a;度为0的节点称为叶子结点 4、节点的层次&#xff08;深度&…

他把智能科技引入现代农业领域

江苏田倍丰农业科技有限公司&#xff08;以下简称“田倍丰”&#xff09;是一家专注于粮油种植的农业科技公司&#xff0c;为拥有300亩以上田地的大户提供全面的解决方案。田倍丰通过与当地政府合作&#xff0c;将土地承包给大户&#xff0c;并提供农资和技术&#xff0c;实现利…

python进程池、线程池

Python广为使用的并发处理库futures使用入门与内部原理_concurrent.futures-CSDN博客 ThreadPoolExecutor(max_workers1) 池中至多创建max_workers个线程的池来同时异步执行&#xff0c;返回Executor实例、支持上下文&#xff0c;进入时返回自己&#xff0c;退出时调用 submit(…

51c~SLAM~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12327374 #GSLAM 自动驾驶相关~~~ 一个通用的SLAM架构和基准 GSLAM&#xff1a;A General SLAM Framework and Benchmark 开源代码&#xff1a;https://github.com/zdzhaoyong/GSLAM SLAM技术最近取得了许多成功&am…

Node.js 完全教程:从入门到精通

Node.js 完全教程&#xff1a;从入门到精通 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;允许开发者在服务器端使用 JavaScript。它的非阻塞 I/O 和事件驱动架构使得 Node.js 非常适合于构建高性能的网络应用。本文将详细介绍 Node.js 的安装、基本语…

【JVM-9】Java性能调优利器:jmap工具使用指南与应用案例

在Java应用程序的性能调优和故障排查中&#xff0c;jmap&#xff08;Java Memory Map&#xff09;是一个不可或缺的工具。它可以帮助开发者分析Java堆内存的使用情况&#xff0c;生成堆转储文件&#xff08;Heap Dump&#xff09;&#xff0c;并查看内存中的对象分布。无论是内…