【数据挖掘实战】 房价预测
本次对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 和 R²。
由于数据量较小,很容易过拟合,因此加入了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
Id SalePrice 0 1461 128989.106316 1 1462 155402.491796 2 1463 173423.163568 3 1464 184025.799434 4 1465 200870.139148 ... ... ... 1454 2915 84714.331635 1455 2916 89781.868635 1456 2917 171236.073006 1457 2918 121141.145259 1458 2919 220957.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
相关文章:

【数据挖掘实战】 房价预测
本次对kaggle中的入门级数据集,房价回归数据集进行数据挖掘,预测房屋价格。 本人主页:机器学习司猫白 机器学习专栏:机器学习实战 PyTorch入门专栏:PyTorch入门 深度学习实战:深度学习 ok,话不多…...

我的创作纪念日,纪念我的第512天
目录 年末 年初 入围 博客 变动 生活 期待 年末 很快,2024年已经过去了,本想在跨年夜的时候营造一点小小的仪式感,结果也因为身体的原因放弃了,浑身感觉疼痛,躺在床上,闭上眼睛,什么也不…...

【科研建模】Pycaret自动机器学习框架使用流程及多分类项目实战案例详解
Pycaret自动机器学习框架使用流程及项目实战案例详解 1 Pycaret介绍2 安装及版本需求3 Pycaret自动机器学习框架使用流程3.1 Setup3.2 Compare Models3.3 Analyze Model3.4 Prediction3.5 Save Model4 多分类项目实战案例详解4.1 ✅ Setup4.2 ✅ Compare Models4.3 ✅ Experime…...
PHP语言的网络编程
PHP语言的网络编程 网络编程是现代软件开发中不可或缺的一部分,尤其是在日益发展的互联网时代。PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本语言,专门用于Web开发。它的灵活性、易用性以及强大的社区支持使得PHP在网络…...

计算机的错误计算(二百一十八)
摘要 大模型能确定 sin(2.6^100) 的符号吗?实验表明,大模型给的结论是正确的,但其证明过程是错误百出。大模型的推理实在是不敢恭维。 就同样题目,测试一下另外一个大模型。 例1. 能确定 sin(2.6^100) 的符号吗? 下…...
《鸿蒙Next原生应用的独特用户体验之旅》
界面设计与交互方面 简洁性与一致性:iOS界面以简洁统一著称,而鸿蒙Next的界面设计同样主打简洁,各部件采用悬浮效果,营造出空间感,如天气App的展示更加逼真。安卓系统由于不同厂商的定制化程度较高,导致用户…...
MDX语言的字符串处理
MDX语言的字符串处理 引言 MDX(Multidimensional Expressions)是一种专门用于多维数据库查询和分析的语言,特别是在Microsoft SQL Server Analysis Services(SSAS)中使用广泛。MDX不仅用于查询多维数据,还…...

游戏AI,让AI 玩游戏有什么作用?
让 AI 玩游戏这件事远比我们想象的要早得多。追溯到 1948 年,图灵和同事钱伯恩共同设计了国际象棋程序 Turochamp。之所以设计这么个程序,图灵是想说明,机器理论上能模拟人脑能做的任何事情,包括下棋这样复杂的智力活动。 可惜的是…...
Java 设计模式 二 单例模式 (Singleton Pattern)
单例模式 (Singleton Pattern) 是一种常见的设计模式,属于创建型模式。它的核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。通常用于那些需要全局控制的场景,比如配置管理、日志系统、数据库连接池等。 1. 单例模式的…...
Java 中 final 关键字的奥秘
目录 一、final 修饰类:封印的 “永恒之石” 二、final 修饰变量:锁定的 “不变之值” 三、final 修饰方法:不可撼动的 “坚固堡垒” 四、总结 在 Java 编程的世界里,final 关键字就像一把神奇的 “锁”,一旦使用&…...
C# 通用缓存类开发:开启高效编程之门
引言 嘿,各位 C# 开发者们!在当今快节奏的软件开发领域,提升应用程序的性能就如同给跑车装上涡轮增压,能让你的项目在激烈的竞争中脱颖而出。而构建一个高效的 C# 通用缓存类,无疑是实现这一目标的强大武器。 想象一…...

电脑办公技巧之如何在 Word 文档中添加文字或图片水印
Microsoft Word是全球最广泛使用的文字处理软件之一,它为用户提供了丰富的编辑功能来美化和保护文档。其中,“水印”是一种特别有用的功能,它可以用于标识文档状态(如“草稿”或“机密”)、公司标志或是版权信息等。本…...

记录一下OpenCV Contrib 编译踩的坑
最近有需要采用OpenCV Contrib 里面的函数做一下处理,要重新编译,一路编译两三个小时了,记录一下备忘吧。 1、编译前先准备好如下环境 ①visual studio已安装,具体版本和型号根据需求经验来,我看常用的是VS2015、VS201…...
01.04、回文排序
01.04、[简单] 回文排序 1、题目描述 给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。 2、解题思路 回文串的特点: 一个回文串在…...

[创业之路-259]:《向流程设计要效率》-1-让成功成熟业务交给流程进行复制, 把创新产品新业务新客户交给精英和牛人进行探索与创造
标题:成功与创新的双轨并行:以流程复制成熟,以精英驱动新知 在当今这个日新月异的商业环境中,企业要想持续繁荣发展,就必须在稳定与创新之间找到完美的平衡点。一方面,成熟业务的稳定运营是企业生存和发展的…...
如何使用usememo和usecallback进行性能优化,什么时候使用usecallback,什么时候使用usememo
React useMemo 和 useCallback 性能优化总结以及使用场景 基本概念 useMemo 用于缓存计算结果,避免在每次渲染时重复进行昂贵的计算。 useCallback 用于缓存函数引用,避免在每次渲染时创建新的函数引用。 使用时机对比 useMemo 适用场景 复杂计算…...
22. C语言 输入与输出详解
本章目录: 前言1. 输入输出的基础概念1.1 标准输入输出流1.2 输入输出函数 2. 格式化输出与输入2.1 使用 printf() 进行输出示例 1: 输出字符串示例 2: 输出整数示例 3: 输出浮点数 2.2 使用 scanf() 进行输入示例 4: 读取整数和字符改进方案:使用getchar()清理缓冲…...

WPF实战案例 | C# WPF实现计算器源码
WPF实战案例 | C# WPF实现计算器源码 一、设计来源计算器应用程序讲解1.1 主界面1.2 计算界面 二、效果和源码2.1 界面设计(XAML)2.2 代码逻辑(C#)2.3 实现步骤总结 源码下载更多优质源码分享 作者:xcLeigh 文章地址&a…...

AutoGen入门——快速实现多角色、多用户、多智能体对话系统
1.前言 如https://github.com/microsoft/autogen所述,autogen是一多智能体的框架,属于微软旗下的产品。 依靠AutoGen我们可以快速构建出一个多智能体应用,以满足我们各种业务场景。 本文将以几个示例场景,使用AutoGen快速构建出…...

LeetCode 热题 100_全排列(55_46_中等_C++)(递归(回溯))
LeetCode 热题 100_两数之和(55_46) 题目描述:输入输出样例:题解:解题思路:思路一(递归(回溯)): 代码实现代码实现(思路一(…...
湖北理元理律师事务所:债务优化中的“生活锚点”设计
在债务重组领域,一个常被忽视的核心矛盾是:还款能力与生存需求的冲突。过度压缩生活支出还债,可能导致收入中断;放任债务膨胀,又加剧精神压力。湖北理元理律师事务所通过“三步平衡法”,尝试在法理框架内破…...
c/c++的opencv椒盐噪声
在 C/C 中实现椒盐噪声 椒盐噪声(Salt-and-Pepper Noise),也称为脉冲噪声(Impulse Noise),是数字图像中常见的一种噪声类型。它的特点是在图像中随机出现纯白色(盐)或纯黑色&#x…...

计算机视觉入门:OpenCV与YOLO目标检测
计算机视觉入门:OpenCV与YOLO目标检测 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 计算机视觉入门:OpenCV与YOLO目标检测摘要引言技术原理对比1. OpenCV:传统图像处理与机器学…...

计算机网络-MPLS VPN应用场景与组网
上一篇文章我们通过一个基础实验实现了企业分支间的MPLS VPN互联,如果还不理解的可以多看几遍前面的文章或者多敲下实验。今天来学习几种常见的MPLS VPN应用场景与这些场景下MPLS VPN的部署方法。 一、MPLS VPN典型应用 目前,MPLS VPN的主要应用包括企…...
JavaScript性能优化实战的技术文-——仙盟创梦IDE
JavaScript性能优化实战技术文章大纲 性能优化的核心原则 减少代码执行时间降低内存消耗优化网络请求提升用户体验 代码层面的优化 减少全局变量使用,避免命名冲突和内存泄漏使用节流(throttle)和防抖(debounce)优…...
组合型回溯+剪枝
本篇基于b站灵茶山艾府。 77. 组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]示例 2&#…...

【C++ Qt】容器类(GroupBox、TabWidget)内附思维导图 通俗易懂
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” ✍️绪论: 本章主要介绍了 Qt 中 QGroupBox 与 QTabWidget 控件。QGroupBox 是带标题的分组框,能容纳其他控件,有标题、对齐方式、是否…...

Axios 如何通过配置实现通过接口请求下载文件
前言 今天,我写了 《Nodejs 实现 Mysql 数据库的全量备份的代码演示》 和 《NodeJS 基于 Koa, 开发一个读取文件,并返回给客户端文件下载》 两篇文章。在这两篇文章中,我实现了数据库的备份,和提供数据库下载等接口。 但是&…...

使用java实现word转pdf,html以及rtf转word,pdf,html
word,rtf的转换有以下方案,想要免费最靠谱的是LibreOffice方案, LibreOffice 是一款 免费、开源、跨平台 的办公软件套件,旨在为用户提供高效、全面的办公工具,适用于个人、企业和教育机构。它支持多种操作系统(Windows、macOS、…...
01 NLP的发展历程和挑战
1.人工智能行业介绍 ANI、AGI、ASI 以下是弱人工智能(ANI)、强人工智能(AGI)和超强人工智能(ASI)的对比表格: 类型定义当前状态弱人工智能(ANI)专注于特定任务&#x…...