机器学习项目实战-能源利用率 Part-5(模型解释)

news2024/12/22 16:15:09

博主前期相关的博客可见下:
机器学习项目实战-能源利用率 Part-1(数据清洗)
机器学习项目实战-能源利用率 Part-2(探索性数据分析)
机器学习项目实战-能源利用率 Part-3(特征工程与特征筛选)
机器学习项目实战-能源利用率 Part-4(模型构建)
这部分进行的是:模型解释。

导入建模数据

# import warning
# warning.filterwarning('ignore')

import pandas as pd
import numpy as np
pd.options.mode.chained_assignment = None
pd.set_option('display.max_columns', 50)

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams['font.size'] = 24
sns.set(font_scale = 2)

train_features = pd.read_csv('data/training_features.csv')
test_features = pd.read_csv('data/testing_features.csv')
train_labels = pd.read_csv('data/training_labels.csv')
test_labels = pd.read_csv('data/testing_labels.csv')

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy = 'median')
imputer.fit(train_features)
X = imputer.transform(train_features)
X_test = imputer.transform(test_features)

from sklearn.preprocessing import MinMaxScaler
minmax_scaler = MinMaxScaler().fit(X)
X = minmax_scaler.transform(X)
X_test = minmax_scaler.transform(X_test)

y = np.array(train_labels).reshape((-1, ))
y_test = np.array(test_labels).reshape((-1, ))

def mae(y_true, y_pred):
	return np.mean(abs(y_true - y_pred))

from sklearn.ensemble import GradientBoostingRegressor

model = GradientBoostingRegressor(loss = 'lad', max_depth = 6, max_features = None,
                                 min_samples_leaf = 4, min_samples_split = 10, n_estimators = 550, random_state = 42)
model.fit(X, y)

model_pred = model.predict(X_test)
model_mae = mae(y_test, model_pred)
print('Final Model Performance on the test set: MAE = %.4f' % model_mae)

在这里插入图片描述

这段代码用于构建一个梯度提升回归模型,并在测试数据集上评估其性能。

  • import pandas as pdimport numpy as nppd.options.mode.chained_assignment = Nonepd.set_option('display.max_columns', 50)import matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline:导入所需的Python库,并设置显示选项。
  • plt.rcParams['font.size'] = 24sns.set(font_scale = 2):设置字体大小和缩放比例。
  • from sklearn.impute import SimpleImputerimputer = SimpleImputer(strategy = 'median'):从sklearn.impute模块中导入SimpleImputer类,用于填补缺失值。创建一个SimpleImputer对象imputer,使用中位数策略来填补缺失值,即将每个特征的缺失值替换为该特征的中位数。
  • imputer.fit(train_features):使用训练特征数据集train_features来拟合imputer对象,计算每个特征的中位数。
  • X = imputer.transform(train_features)X_test = imputer.transform(test_features):使用imputer对象对训练特征数据集train_features和测试特征数据集test_features进行缺失值填补,分别将填补后的特征数据存储在名为XX_test的NumPy数组中。
  • from sklearn.preprocessing import MinMaxScalerminmax_scaler = MinMaxScaler().fit(X):从sklearn.preprocessing模块中导入MinMaxScaler类,用于将特征数据进行标准化。创建一个MinMaxScaler对象minmax_scaler并使用训练特征数据集X来拟合minmax_scaler对象,计算每个特征的最小值和最大值。
  • X = minmax_scaler.transform(X)X_test = minmax_scaler.transform(X_test):使用minmax_scaler对象对训练特征数据集X和测试特征数据集X_test进行标准化处理,分别将标准化后的特征数据存储在名为XX_test的NumPy数组中。
  • y = np.array(train_labels).reshape((-1, ))y_test = np.array(test_labels).reshape((-1, )):将训练标签数据集train_labels和测试标签数据集test_labels转换为NumPy数组,并将它们展平为一维数组,分别存储在名为yy_test的变量中。
  • def mae(y_true, y_pred): return np.mean(abs(y_true - y_pred)):定义一个计算平均绝对误差(MAE)的函数mae,其中y_true表示真实标签,y_pred表示预测标签。
  • from sklearn.ensemble import GradientBoostingRegressormodel = GradientBoostingRegressor(loss = 'lad', max_depth = 6, max_features = None, min_samples_leaf = 4, min_samples_split = 10, n_estimators = 550, random_state = 42):从sklearn.ensemble模块中导入GradientBoostingRegressor类,用于构建梯度提升回归模型。创建一个GradientBoostingRegressor对象model,并使用指定的参数对模型进行初始化,包括损失函数为lad(最小绝对误差),最大树深度为6,最大特征数为None(即使用所有特征),最小叶节点样本数为4,最小分裂节点样本数为10,估计器的数量为550,随机种子为42。
  • model.fit(X, y):使用训练特征数据集X和训练标签数据集y来拟合model对象,训练梯度提升回归模型。
  • model_pred = model.predict(X_test):使用测试特征数据集X_test来进行预测,生成预测结果,存储在名为model_pred的变量中。
  • model_mae = mae(y_test, model_pred):使用测试标签数据集y_test和模型预测的结果model_pred来计算模型的MAE,将结果存储在名为model_mae的变量中。
  • print('Final Model Performance on the test set: MAE = %.4f' % model_mae):将模型在测试数据集上的MAE输出到控制台。

模型解释

从下面三个方面进行解释:

  • 特征重要性
  • Locally Interpretable Model-agnostic Explainer (LIME)
  • 建立一颗树模

特征重要性

在所有树模型中平均节点不纯度的减少

特征重要性排序

feature_results = pd.DataFrame({'feature': list(train_features.columns),
                               'importance': model.feature_importances_})
feature_results = feature_results.sort_values('importance', ascending = False).reset_index(drop = True)
feature_results.head(8)

在这里插入图片描述

这段代码用于计算并输出梯度提升回归模型中每个特征的重要性分数,以及显示具有最高重要性分数的前8个特征。

  • feature_results = pd.DataFrame({'feature': list(train_features.columns), 'importance': model.feature_importances_}):创建一个名为feature_results的数据框,其中包含两列:featureimportancefeature列包含训练特征数据集中的所有特征的名称,使用list(train_features.columns)来获取特征名称列表;importance列包含每个特征的重要性分数,使用model.feature_importances_来获取模型的特征重要性分数。
  • feature_results = feature_results.sort_values('importance', ascending = False).reset_index(drop = True):按照特征的重要性分数对feature_results数据框进行降序排序,即从高到低排序。'importance'表示按照重要性分数进行排序,ascending=False表示降序排列。排序后使用reset_index函数将索引重置为默认值,并将drop参数设置为True以删除旧索引列,将排序后的结果存储回feature_results数据框中。
  • feature_results.head(8):输出具有最高重要性分数的前8个特征。使用head函数选择前8行,这里的8是作为函数的参数传递进去的,因此可以自定义显示的行数,这里是选择前8行。
from IPython.core.pylabtools import figsize
figsize(12, 10)
plt.style.use('ggplot')

feature_results.loc[:9, :].plot(x = 'feature', y = 'importance', edgecolor = 'k',
                               kind = 'barh', color = 'blue')
plt.xlabel('Relative Importance', fontsize = 18); plt.ylabel('')
# plt.yticks(fontsize = 12); plt.xticks(fontsize = 14)
plt.title('Feature Importances from Random Forest', size = 26)

在这里插入图片描述

上图是将特征重要性绘制成图

cumulative_importances = np.cumsum(feature_results['importance'])

plt.figure(figsize = (20, 6))
plt.plot(list(range(feature_results.shape[0])), cumulative_importances.values, 'b-')
plt.hlines(y=0.95, xmin=0, xmax=feature_results.shape[0], color='r', linestyles='dashed')
# plt.xticks(list(range(feature_results.shape[0])), feature_results.feature, rotation=60)
plt.xlabel('Feature', fontsize = 18)
plt.ylabel('Cumulative importance', fontsize = 18)
plt.title('Cumulative Importances', fontsize = 26)

这段代码用于绘制累积特征重要性曲线图,以展示所有特征对目标变量的总贡献度,并标记出贡献度达到95%的阈值。

  • cumulative_importances = np.cumsum(feature_results['importance']):计算每个特征对目标变量的重要性分数的累积总和,使用np.cumsum函数将特征重要性分数进行累加,将结果存储在名为cumulative_importances的变量中。
  • plt.figure(figsize = (20, 6)):创建一个名为figure的图形对象,大小为20英寸×6英寸。
  • plt.plot(list(range(feature_results.shape[0])), cumulative_importances.values, 'b-'):绘制累积特征重要性曲线,使用plt.plot函数绘制,横坐标是特征的序号,纵坐标是特征的重要性分数的累积总和,颜色为蓝色,线型为实线。
  • plt.hlines(y=0.95, xmin=0, xmax=feature_results.shape[0], color='r', linestyles='dashed'):在y=0.95处绘制一条水平线,表示累积重要性分数达到95%的阈值。使用plt.hlines函数绘制水平线,y=0.95表示水平线的高度,xmin=0表示x轴的起点,xmax=feature_results.shape[0]表示x轴的终点,即特征的个数。颜色为红色,线型为虚线。
  • plt.xlabel('Feature', fontsize = 18)plt.ylabel('Cumulative importance', fontsize = 18)plt.title('Cumulative Importances', fontsize = 26):设置x轴标签为“Feature”,y轴标签为“Cumulative importance”,图形标题为“Cumulative Importances”,并分别设置它们的字体大小为18和26。

在这里插入图片描述

most_num_importances = np.where(cumulative_importances > 0.95)[0][0] + 1
print('Number of features for 95% importance: ', most_num_importances)

累计的特征超过0.95

在这里插入图片描述

根据特征重要性筛选特征

most_important_features = feature_results['feature'][:13]
indices = [list(train_features.columns).index(x) for x in most_important_features]
X_reduced = X[:, indices]
X_test_reduced = X_test[:, indices]

print('Most import training features shape: ', X_reduced.shape)
print('Most import testing feature shape: ', X_test_reduced.shape)

在这里插入图片描述

根据特征重要性筛选特征

from sklearn.ensemble import RandomForestRegressor
rfr = RandomForestRegressor(random_state = 42)

rfr.fit(X, y)
rfr_full_pred = rfr.predict(X_test)

rfr.fit(X_reduced, y)
rfr_reduced_pred = rfr.predict(X_test_reduced)

print('Random Forest Full Results: MAE =    %.4f.' % mae(y_test, rfr_full_pred))
print('Random Forest Reduced Results: MAE = %.4f.' % mae(y_test, rfr_reduced_pred))

from sklearn.linear_model import LinearRegression
lr = LinearRegression()

lr.fit(X, y)
lr_full_pred = lr.predict(X_test)

lr.fit(X_reduced, y)
lr_reduced_pred = lr.predict(X_test_reduced)

print('Linear Regression Full Results: MAE =    %.4f.' % mae(y_test, lr_full_pred))
print('Linear Regression Reduced Results: MAE = %.4f.' % mae(y_test, lr_reduced_pred))

这段代码用于比较使用完整特征集和精简特征集分别训练的随机森林回归模型和线性回归模型在测试数据集上的性能差异。

  • from sklearn.ensemble import RandomForestRegressorrfr = RandomForestRegressor(random_state = 42):从sklearn.ensemble模块中导入RandomForestRegressor类,用于构建随机森林回归模型。创建一个RandomForestRegressor对象rfr,并使用指定的参数对模型进行初始化,包括随机种子为42。
  • rfr.fit(X, y)rfr_full_pred = rfr.predict(X_test):使用完整特征集X和训练标签数据集y来拟合rfr对象,训练随机森林回归模型。使用测试特征数据集X_test进行预测,生成预测结果,存储在名为rfr_full_pred的变量中。
  • rfr.fit(X_reduced, y)rfr_reduced_pred = rfr.predict(X_test_reduced):使用精简特征集X_reduced和训练标签数据集y来拟合rfr对象,训练随机森林回归模型。使用精简特征集X_test_reduced进行预测,生成预测结果,存储在名为rfr_reduced_pred的变量中。
  • print('Random Forest Full Results: MAE = %.4f.' % mae(y_test, rfr_full_pred))print('Random Forest Reduced Results: MAE = %.4f.' % mae(y_test, rfr_reduced_pred)):分别打印输出随机森林回归模型在测试数据集上的MAE(平均绝对误差)评估结果。第一行输出使用完整特征集训练的模型的评估结果,第二行输出使用精简特征集训练的模型的评估结果。mae函数用于计算预测结果和真实标签的MAE值。
  • from sklearn.linear_model import LinearRegressionlr = LinearRegression():从sklearn.linear_model模块中导入LinearRegression类,用于构建线性回归模型。创建一个LinearRegression对象lr,用于训练线性回归模型。
  • lr.fit(X, y)lr_full_pred = lr.predict(X_test):使用完整特征集X和训练标签数据集y来拟合lr对象,训练线性回归模型。使用测试特征数据集X_test进行预测,生成预测结果,存储在名为lr_full_pred的变量中。
  • lr.fit(X_reduced, y)lr_reduced_pred = lr.predict(X_test_reduced):使用精简特征集X_reduced和训练标签数据集y来拟合lr对象,训练线性回归模型。使用精简特征集X_test_reduced进行预测,生成预测结果,存储在名为lr_reduced_pred的变量中。
  • print('Linear Regression Full Results: MAE = %.4f.' % mae(y_test, lr_full_pred))print('Linear Regression Reduced Results: MAE = %.4f.' %mae(y_test, lr_reduced_pred)):分别打印输出线性回归模型在测试数据集上的MAE(平均绝对误差)评估结果。第一行输出使用完整特征集训练的模型的评估结果,第二行输出使用精简特征集训练的模型的评估结果。mae函数用于计算预测结果和真实标签的MAE值。
    在这里插入图片描述

试验结果发现效果还不如原来
但仅考虑更少的特征就能得到一个还不错的效果

model_reduced = GradientBoostingRegressor(loss = 'lad', max_depth = 6, max_features = None,
                                 min_samples_leaf = 4, min_samples_split = 10,
                                 n_estimators = 550, random_state = 42)
model_reduced.fit(X_reduced, y)
model_reduced_pred = model_reduced.predict(X_test_reduced)

print('Gradient Boosting Reduced Results: MAE = %.4f.' % mae(y_test, model_reduced_pred))

在这里插入图片描述

在这里是9.48;之前的case是9.12
更多的特征会得到更好的效果

LIME

Locally Interpretable Model-agnostic Explanations

“局部可解释的模型无关解释”,简称LIME。它是一种用于解释机器学习模型预测的方法,可以在不需要了解模型内部结构的情况下,对模型的预测结果进行可解释的解释。
GitHub - LIME to explain individual predictions

最差预测的解释

import lime
import lime.lime_tabular

residuals = abs(model_reduced_pred - y_test) # 残差
wrong = X_test_reduced[np.argmax(residuals), :] # 最差的预测
right = X_test_reduced[np.argmin(residuals), :] # 最好的预测

# 最差预测位置的预测值与真实值
print('Prediction: %.4f' % model_reduced.predict(wrong.reshape(1, -1)))
print('Actual Value: %.4f' % y_test[np.argmax(residuals)])

# Create a lime explainer object
explainer = lime.lime_tabular.LimeTabularExplainer(training_data = X_reduced, mode = 'regression',
            training_labels = y, feature_names = list(most_important_features))

# 最差预测的解释
wrong_exp = explainer.explain_instance(data_row = wrong, predict_fn = model_reduced.predict)

# 预测的解释画图
wrong_exp.as_pyplot_figure()
plt.title('Explanation of Prediction', fontsize = 24)
plt.xlabel('Effect on Prediction', fontsize = 20)

这段代码用于使用LIME(局部可解释的模型无关解释)对机器学习模型中最糟糕的预测进行解释,并生成一个解释图。

  • import limeimport lime.lime_tabular:导入limelime.lime_tabular模块,用于构建和解释LIME模型。
  • residuals = abs(model_reduced_pred - y_test):计算机器学习模型在测试集上的预测残差,即预测值与真实值之间的差值的绝对值,使用abs函数计算。将结果存储在名为residuals的变量中。
  • wrong = X_test_reduced[np.argmax(residuals), :]right = X_test_reduced[np.argmin(residuals), :]:分别找到机器学习模型中预测残差最大和最小的测试样本。使用np.argmaxnp.argmin函数找到残差数组residuals中最大值和最小值的索引,然后使用索引在测试特征数据集X_test_reduced中找到对应的样本特征,将最差的预测存储在名为wrong的变量中,将最好的预测存储在名为right的变量中。
  • print('Prediction: %.4f' % model_reduced.predict(wrong.reshape(1, -1)))print('Actual Value: %.4f' % y_test[np.argmax(residuals)]):分别打印输出最差预测位置的预测值和真实值。使用model_reduced.predict方法对wrong进行预测,将预测结果输出到屏幕上,使用y_test数组中最差预测的索引输出真实值。如果模型预测值与真实值相差很大,则该预测可能是错误的。
  • explainer = lime.lime_tabular.LimeTabularExplainer(training_data = X_reduced, mode = 'regression', training_labels = y, feature_names = list(most_important_features)):创建一个LIME解释器对象explainer。使用lime.lime_tabular.LimeTabularExplainer类构建解释器,指定训练数据集X_reduced、训练标签数据集y、特征名称列表most_important_features和模型类型mode = 'regression'。这里使用的是基于表格数据的LIME解释器。
  • wrong_exp = explainer.explain_instance(data_row = wrong, predict_fn = model_reduced.predict):使用LIME解释器对象explainer对最差的预测进行解释。使用explain_instance方法对wrong进行解释,并将预测函数model_reduced.predict传递给predict_fn参数,以便LIME解释器可以近似原始模型的预测结果,并生成一个解释对象wrong_exp
  • wrong_exp.as_pyplot_figure()plt.title('Explanation of Prediction', fontsize = 24):将解释对象wrong_exp转换为Matplotlib图形对象,并显示在屏幕上。使用as_pyplot_figure方法将LIME解释器对象wrong_exp转换为Matplotlib图形对象,并使用plt.title方法设置图形标题为“Explanation of Prediction”,字体大小为24。

在这里插入图片描述

wrong_exp.show_in_notebook(show_predicted_value = False)

这段代码用于在Jupyter Notebook中显示最差预测的LIME解释图,并隐藏预测值。

  • wrong_exp.show_in_notebook(show_predicted_value = False):将最差预测的LIME解释图显示在Jupyter Notebook中,并将预测值隐藏。使用show_in_notebook方法将LIME解释对象wrong_exp显示为一个可交互的解释图。该方法有一个名为show_predicted_value的参数,用于控制是否在图形中显示预测值。这里将该参数设置为False,以隐藏预测值。

在这里插入图片描述

最好预测的解释

# 最好预测位置的预测值与真实值
print('Prediction: %0.4f' % model_reduced.predict(right.reshape(1, -1)))
print('Actual Value: %0.4f' % y_test[np.argmin(residuals)])

# 最好预测的解释
right_exp = explainer.explain_instance(data_row = right, predict_fn = model_reduced.predict, num_features = 10)

# 预测的解释画图
right_exp.as_pyplot_figure()
plt.title('Explanation of Prediction', size = 26)
plt.xlabel('Effect on Prediction', size = 20)

在这里插入图片描述

right_exp.show_in_notebook(show_predicted_value = False)

在这里插入图片描述

单棵树模型观察

from sklearn import tree
import pydotplus
from IPython.display import display, Image

single_tree = model_reduced.estimators_[100][0]

dot_data = tree.export_graphviz(single_tree, out_file = None, rounded = True,
                    feature_names = most_important_features, filled = True)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_png('sigle_tree_1.png')

这段代码用于将随机森林模型中的单个决策树可视化为一张图。

  • from sklearn import treeimport pydotplus:导入sklearn中的tree模块和pydotplus模块,用于可视化决策树。
  • from IPython.display import display, Image:从IPython.display模块中导入displayImage函数,用于在Jupyter Notebook中显示图像。
  • single_tree = model_reduced.estimators_[100][0]:从随机森林模型中提取第100个决策树,并将其存储在名为single_tree的变量中。model_reduced是随机森林模型对象,estimators_属性包含了随机森林中所有的决策树。
  • dot_data = tree.export_graphviz(single_tree, out_file = None, rounded = True, feature_names = most_important_features, filled = True):将单个决策树转换为Graphviz格式的数据,并将其存储在名为dot_data的变量中。使用tree.export_graphviz函数将single_tree转换为Graphviz格式的数据,设置out_file参数为None,以便将数据存储在内存中,设置rounded参数为True,以便在输出的节点框中使用圆角,设置feature_names参数为most_important_features,以便在决策树中使用特征名称,设置filled参数为True,以便在输出的节点框中使用填充色。
  • graph = pydotplus.graph_from_dot_data(dot_data):将Graphviz格式的数据转换为pydotplus中的图形对象,并将其存储在名为graph的变量中。使用pydotplus.graph_from_dot_data方法将dot_data转换为pydotplus中的图形对象,该对象可以用于生成PNG或PDF格式的图像。
  • graph.write_png('sigle_tree_1.png'):将单个决策树的图像保存为PNG格式的文件。使用write_png方法将graph对象保存为PNG格式的图像文件,并将文件名设置为sigle_tree_1.png

在这里插入图片描述

太密集了,限制下深度

dot_data = tree.export_graphviz(single_tree, out_file = None, rounded = True,
                    max_depth = 3, feature_names = most_important_features, filled = True)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_png('sigle_tree_2.png')

在这里插入图片描述

End

Reference

机器学习项目实战-能源利用率 Part-1(数据清洗)

机器学习项目实战-能源利用率 Part-2(探索性数据分析)

机器学习项目实战-能源利用率 Part-3(特征工程与特征筛选)

机器学习项目实战-能源利用率 Part-4(模型构建)

机器学习项目实战-能源利用率3-分析

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

匿名通信 Windows 客户端的设计与实现

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 本课题基于 U-TRI 匿名通信系统,设计一个 Windows 匿名通信客户端。该客户端在匿名通信系统中扮演了重要角色,实现了两个重要功能:第一,实现匿名通信协议,拦截/修改主…

TCP 三次握手与四次挥手

1 三次握手 三次握手的过程如下图: 一开始,客户端和服务端都处于 CLOSE 状态。先是服务端主动监听某个端口,处于 LISTEN 状态 客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中…

如何在 iPhone 上恢复已删除的应用程序数据

您是不小心删除了重要应用程序并且似乎无法在您的设备上找到它的 iPhone 用户吗?别担心,你并不孤单。在 iPhone 上丢失应用程序可能会令人沮丧,但幸运的是,有一些方法可以恢复它们。在本文中,我们将通过分步说明向您展…

你真的懂Java中的Cloneable接口和深拷贝么?

Cloneable接口 和 深拷贝 💐文章导读 这篇文章就为大家讲讲什么是Cloneable接口,接口的用法以及什么是深拷贝和浅拷贝,如果有不足的地方,还望读者在评论区提出!!! 上篇文章讲过用Comparable接口…

单模光纤的特征方程以及MATLAB求解

在之前的文章中,我们写出了单模光纤的特征方程以及对应的导波模式 这里我们在MATLAB中求解特征方程并表示出几个归一化参数的变化曲线 用到的公式是单模光纤导波模式的特征方程: clear close all tic Vmax 10; N 100;for j 1:NV(j) j/N*Vmax;Vtemp …

电脑微信占用100多GB空间 解决办法来了:重回清爽流畅

这几天微信吃内存的话题又上热搜了,作为一款10亿用户的国民级APP,微信的真是让人又爱又恨,不用几乎不可能,用起来槽点又多,光是磁盘占用就是个头疼的问题。 不论是工作还是日常沟通,微信里面的文件及语音、…

python中的类型转换

文章目录 类型转换简介int()float()str()bool() 类型转换简介 所谓的类型转换,将一个类型的对象转换为其他对象。 类型转换不是改变对象本身的类型,而是将对象的值转换为新的对象。 类型转换四个函数 int() 、 float() 、 str() 、 bool() int() int()…

cpp11实现线程池(一)——项目介绍

项目介绍 线程池是库的形式提供给用户,是必须放到代码中,不能单独运行,亦称为基础组件 第一版线程池任务对象使用继承技术,提供一个抽象基类Task,里面有一个纯虚函数run(),使用时继承该类,并重…

第二篇:强化学习中的7个基础概念

你好,我是zhenguo(郭震) 这是强化学习第二篇:强化学习7个基础概念 在强化学习中,智能体需要在不断尝试和错误的过程中学习,通过观察环境的反馈(奖励或惩罚)来调整自己的行为&#xf…

windows系统安装curl

下载安装包 https://curl.se/windows/ 2.如图所示,把下载的zip包解压到C盘某个目录下 把bin目录配置到系统环境变量Path里 在命令行里直接输入curl即可开始使用 5.curl测试访问百度 6.curl 测试ip端口连通性 用法:curl -v ip:port

推荐一款C端的低代码产品

目录 写在前面 低代码平台 平台怎么选 各平台区别 为什么选它 写在前面 大家都知道低代码这个叫法是从B端叫起来的,也就是说不管是业务人员还是开发人员,都是企业内部使用。那么有没有C端的,且免费使用的低代码产品呢? 低代码…

Matlab论文插图绘制模板第93期—带类别标签的散点图

在之前的文章中,分享了很多Matlab散点图的绘制模板: 进一步,再来分享一种特殊的散点图:带类别标签的散点图。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中,加群的朋友请…

数据库基础5-复合查询

文章目录 多表查询自连接子查询合并查询 基础查询中,再补充一个点: 在使用年薪进行降序排序中,我们有以下语句 //A: select ename, sal*12ifnull(comm,0) as 年薪 from emp order by 年薪 desc;查询到的结果: //B: select ename,…

Leetcode 剑指 Offer II 027. 回文链表

题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个链表的 头节点 head ,请判断其是否为回文链表…

ROS 开发环境搭建(虚拟机版本)(一)

相关工具,以及镜像(以后有用) 链接:https://pan.baidu.com/s/1xgtp-XGFFNCACV_-0TJO2A 提取码:ar1w 1. 下载vm虚拟机(我选择的官方最新的vm虚拟机),安装好 2.安装百度网盘里面的…

办公智慧化风起云涌,华为MateBook X Pro 2023是最短距离

今年以来,我们几乎每个月,甚至每星期都可以看到大模型应用,在办公场景下推陈出新。 办公智慧化已成必然,大量智力工作正在被自动化。一个普遍共识是:AI能力范围之内的职业岌岌可危,AI 能力范围之外的职业欣…

【TES710D】基于复旦微的FMQL10S400全国产化ARM核心模块

板卡概述 TES710D是一款基于上海复旦微电子FMQL10S400的全国产化核心模块。该核心模块将复旦微的FMQL10S400(兼容FMQL20S400)的最小系统集成在了一个50*70mm的核心板上,可以作为一个核心模块,进行功能性扩展,特别是用…

第二章、认识用户体验五要素(本文作用是通俗讲解,让你更容易理解)

1.用户体验要素分五个层面,分别是战略层、范围层、结构层、框架层、表现层。 战略层:指的是产品所要解决的社会问题,和公司在这个产品上的收益目标。也就是大家所说的产品战略。 范围层:指的是我们要做的业务范围,我…

零基础学Java——基础part01

java基础第一篇 今日任务: 1、什么是软件开发 2、人机交互 3、常用的dos命令(了解) 4、什么是计算机语言 5、Java三种技术架构(了解) 6、Java语言特性(跨平台原理) (了解) 7、Java开发环境搭…