[机器学习] 监督学习之线性回归与逻辑回归

这里写目录标题

    • 一、监督学习概述
    • 二、线性回归
      • (一)模型表示
      • (二)损失函数
      • (三)梯度下降算法
      • 导入所需库
      • 生成模拟数据(可替换为真实数据)
      • 初始化参数并进行训练
      • 可视化损失函数随迭代次数的变化情况(可选,用于查看训练效果)
      • 使用训练好的模型进行预测(示例预测新的样本,这里可根据实际需求调整)
    • 三、逻辑回归
      • (一)模型表示
      • (二)损失函数
      • (三)梯度下降与参数更新
    • 四、模型评估指标
      • (一)回归问题评估指标
      • (二)分类问题评估指标
    • 五、过拟合与欠拟合
    • 六、正则化

一、监督学习概述

监督学习是利用有标记的数据进行模型训练,使模型能够对未知数据进行预测。训练数据包含输入特征(通常用 (x) 表示)和对应的输出标签(通常用 (y) 表示)。其主要任务可分为回归(预测连续值)和分类(预测离散类别)。

二、线性回归

(超爽中英!) 2024公认最好的【吴恩达机器学习】教程!附课件代码 Machine Learning Specialization

(一)模型表示

单变量线性回归模型: h θ ( x ) = θ 0 + θ 1 x h_{\theta}(x)=\theta_{0}+\theta_{1}x hθ(x)=θ0+θ1x,其中 θ 0 \theta_{0} θ0 为截距, θ 1 \theta_{1} θ1 为斜率。

from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt# 生成模拟数据(这里简单地使用线性关系加一些噪声来模拟)
np.random.seed(0)
x = np.linspace(0, 10, 100).reshape(-1, 1)  # 生成100个在0到10之间均匀分布的x值,并转换为列向量
theta_0_true = 2  # 真实的截距
theta_1_true = 3  # 真实的斜率
y_true = theta_0_true + theta_1_true * x
y = y_true + np.random.normal(0, 2, size=(100, 1))  # 添加一些正态分布的噪声模拟实际观测值# 创建线性回归模型对象并拟合数据
model = LinearRegression()
model.fit(x, y)# 获取拟合的参数
theta_0_fit = model.intercept_[0]
theta_1_fit = model.coef_[0][0]# 定义预测函数(其实可以直接使用model.predict方法进行预测,这里只是为了形式统一展示)
def h_theta(x, theta_0, theta_1):"""根据拟合的参数进行预测"""return theta_0 + theta_1 * x# 使用拟合的模型进行预测
y_pred = h_theta(x, theta_0_fit, theta_1_fit)# 可视化数据和拟合的直线
plt.scatter(x, y, label='Observed Data')
plt.plot(x, y_pred, color='r', label='Fitted Line')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Linear Regression')
plt.legend()
plt.show()

代码中,使用了 sklearn 库中的 LinearRegression 类来拟合线性回归模型,它内部已经实现了高效的最小二乘法计算等逻辑,通过调用 fit 方法传入输入特征 x 和目标值 y 就可以完成模型的拟合,然后可以通过 intercept_ 属性获取截距(对应 theta_0),通过 coef_ 属性获取系数(对应 theta_1)
在这里插入图片描述

多变量线性回归模型: h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + ⋯ + θ n x n = θ T x h_{\theta}(x)=\theta_{0}+\theta_{1}x_{1}+\theta_{2}x_{2}+\cdots+\theta_{n}x_{n}=\theta^{T}x hθ(x)=θ0+θ1x1+θ2x2++θnxn=θTx,这里 x = [ 1 x 1 x 2 ⋮ x n ] x = \begin{bmatrix} 1 \\ x_{1} \\ x_{2} \\ \vdots \\ x_{n} \end{bmatrix} x= 1x1x2xn , θ = [ θ 0 θ 1 θ 2 ⋮ θ n ] \theta = \begin{bmatrix} \theta_{0} \\ \theta_{1} \\ \theta_{2} \\ \vdots \\ \theta_{n} \end{bmatrix} θ= θ0θ1θ2θn

(二)损失函数

损失函数衡量了当前模型预测值与真实目标值之间的差异程度。

均方误差损失函数: J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta)=\frac{1}{2m}\sum_{i = 1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^{2} J(θ)=2m1i=1m(hθ(x(i))y(i))2,其中 (m) 为训练样本数量, x ( i ) x^{(i)} x(i) y ( i ) y^{(i)} y(i) 分别是第 (i) 个训练样本的特征和标签。

def compute_loss(x, y, theta):"""计算均方误差损失函数。参数:x: 特征矩阵,形状为 (m, n+1),m是样本数量,n是特征数量(包含常数项1对应的列)y: 目标值向量,形状为 (m, 1)theta: 参数向量,形状为 (n+1, 1)返回:loss: 计算得到的均方误差损失值"""m = x.shape[0]predictions = np.dot(x, theta)loss = np.sum((predictions - y) ** 2) / (2 * m)return loss

(三)梯度下降算法

梯度下降算法,在每次迭代中,根据当前参数下预测值与真实值的误差来计算梯度,进而按照学习率alpha更新参数theta,同时记录每次迭代的损失值到loss_history列表中,这样可以后续查看损失函数的收敛情况。

参数更新公式: θ j : = θ j − α ∂ J ( θ ) ∂ θ j \theta_{j}:=\theta_{j}-\alpha\frac{\partial J(\theta)}{\partial\theta_{j}} θj:=θjαθjJ(θ)

对于单变量线性回归:
∂ J ( θ ) ∂ θ 0 = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) \frac{\partial J(\theta)}{\partial\theta_{0}}=\frac{1}{m}\sum_{i = 1}^{m}(h_{\theta}(x^{(i)})-y^{(i)}) θ0J(θ)=m1i=1m(hθ(x(i))y(i))
∂ J ( θ ) ∂ θ 1 = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x ( i ) \frac{\partial J(\theta)}{\partial\theta_{1}}=\frac{1}{m}\sum_{i = 1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x^{(i)} θ1J(θ)=m1i=1m(hθ(x(i))y(i))x(i)

对于多变量线性回归:
∂ J ( θ ) ∂ θ j = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \frac{\partial J(\theta)}{\partial\theta_{j}}=\frac{1}{m}\sum_{i = 1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x_{j}^{(i)} θjJ(θ)=m1i=1m(hθ(x(i))y(i))xj(i) j = 0 , 1 , ⋯ , n j = 0, 1,\cdots,n j=0,1,,n,其中 α \alpha α为学习率,控制每次参数更新的步长。

定义梯度下降训练函数(多变量)

def gradient_descent(x, y, theta, alpha, num_iters):"""使用梯度下降算法来更新线性回归的参数theta。参数:x: 特征矩阵,形状为 (m, n+1),m是样本数量,n是特征数量(包含常数项1对应的列)y: 目标值向量,形状为 (m, 1)theta: 参数向量,初始值,形状为 (n+1, 1)alpha: 学习率,控制每次更新的步长num_iters: 迭代次数返回:theta: 经过多次迭代更新后的参数向量loss_history: 每次迭代对应的损失值历史记录,用于查看训练过程损失变化情况"""m = x.shape[0]loss_history = []for _ in range(num_iters):error = np.dot(x, theta) - ygradient = np.dot(x.T, error) / mtheta -= alpha * gradientloss = compute_loss(x, y, theta)loss_history.append(loss)return theta, loss_history

实践
以下是使用Python实践多变量线性回归模型(通过梯度下降法训练参数θ)的完整示例代码,包含了数据生成、模型训练以及预测的过程。

导入所需库

import numpy as np
import matplotlib.pyplot as plt

生成模拟数据(可替换为真实数据)

# 设置随机种子,保证结果可复现
np.random.seed(0)
# 样本数量
m = 100
# 特征数量(不包含截距项对应的特征,这里设为2个特征)
n = 2
# 生成特征矩阵,添加一列全为1的列作为截距项对应的特征
x = np.column_stack((np.ones(m), np.random.rand(m, n)))
# 真实的参数(用于生成模拟的目标值,实际中是未知的)
true_theta = np.array([[2], [3], [4]])
# 生成目标值,添加一些随机噪声模拟真实情况
y = np.dot(x, true_theta) + np.random.randn(m, 1) * 0.5

初始化参数并进行训练

# 初始化theta参数,初始化为全0向量(形状要与特征数量对应,包含截距项对应的参数)
theta_initial = np.zeros((n + 1, 1))
# 学习率
alpha = 0.01
# 迭代次数
num_iters = 1000
# 执行梯度下降训练
theta_trained, loss_history = gradient_descent(x, y, theta_initial, alpha, num_iters)

可视化损失函数随迭代次数的变化情况(可选,用于查看训练效果)

plt.plot(loss_history)
plt.xlabel('Iterations')
plt.ylabel('Loss')
plt.title('Loss Function Convergence')
plt.show()

在这里插入图片描述
迭代次数达到一个值后, 预测值与真实目标值之间的差异程度出现拐点。后面的迭代没有什么成效了。

使用训练好的模型进行预测(示例预测新的样本,这里可根据实际需求调整)

# 生成新的样本数据(这里简单示例,可按需修改)
new_x = np.array([[1, 0.5, 0.6]])
# 进行预测
prediction = np.dot(new_x, theta_trained)
print("预测结果:", prediction)

预测结果: [[5.78208147]]

在上述代码中:

  1. 首先通过numpy库生成了模拟的特征矩阵x和对应的目标值y,模拟了一个多变量线性回归的数据场景,其中真实的参数true_theta是我们自己设定的,但实际应用中是未知的,需要通过训练去估计。
  2. 接着定义了计算损失函数(均方误差)的函数compute_loss,它衡量了当前模型预测值与真实目标值之间的差异程度,是评估模型好坏以及指导梯度下降训练的重要指标。
  3. 然后定义了gradient_descent函数,它实现了梯度下降算法,在每次迭代中,根据当前参数下预测值与真实值的误差来计算梯度,进而按照学习率alpha更新参数theta,同时记录每次迭代的损失值到loss_history列表中,这样可以后续查看损失函数的收敛情况。
  4. 之后初始化了参数theta,设定了学习率和迭代次数,调用gradient_descent函数进行训练,得到训练好的参数theta_trained以及损失值的变化记录loss_history,并通过matplotlib库可视化了损失值随迭代次数的变化,直观查看训练的收敛效果。
  5. 最后,使用训练好的模型对新的样本数据进行预测,展示了模型的应用过程。

三、逻辑回归

(一)模型表示

逻辑回归用于二分类问题,模型假设函数: h θ ( x ) = 1 1 + e − θ T x h_{\theta}(x)=\frac{1}{1 + e^{-\theta^{T}x}} hθ(x)=1+eθTx1,其输出值表示样本属于正类的概率。

(二)损失函数

对数损失函数: J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) ln ⁡ ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) ln ⁡ ( 1 − h θ ( x ( i ) ) ) ] J(\theta)=-\frac{1}{m}\sum_{i = 1}^{m}[y^{(i)}\ln(h_{\theta}(x^{(i)}))+(1 - y^{(i)})\ln(1 - h_{\theta}(x^{(i)}))] J(θ)=m1i=1m[y(i)ln(hθ(x(i)))+(1y(i))ln(1hθ(x(i)))]

(三)梯度下降与参数更新

参数更新同样使用梯度下降算法,其梯度计算为:
∂ J ( θ ) ∂ θ j = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \frac{\partial J(\theta)}{\partial\theta_{j}}=\frac{1}{m}\sum_{i = 1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x_{j}^{(i)} θjJ(θ)=m1i=1m(hθ(x(i))y(i))xj(i)),然后按照 θ j : = θ j − α ∂ J ( θ ) ∂ θ j \theta_{j}:=\theta_{j}-\alpha\frac{\partial J(\theta)}{\partial\theta_{j}} θj:=θjαθjJ(θ) 更新参数。

四、模型评估指标

(一)回归问题评估指标

  • 均方误差(MSE) M S E = 1 m ∑ i = 1 m ( y p r e d ( i ) − y ( i ) ) 2 MSE=\frac{1}{m}\sum_{i = 1}^{m}(y_{pred}^{(i)}-y^{(i)})^{2} MSE=m1i=1m(ypred(i)y(i))2
  • 均方根误差(RMSE) R M S E = 1 m ∑ i = 1 m ( y p r e d ( i ) − y ( i ) ) 2 RMSE=\sqrt{\frac{1}{m}\sum_{i = 1}^{m}(y_{pred}^{(i)}-y^{(i)})^{2}} RMSE=m1i=1m(ypred(i)y(i))2
  • 平均绝对误差(MAE) M A E = 1 m ∑ i = 1 m ∣ y p r e d ( i ) − y ( i ) ∣ MAE=\frac{1}{m}\sum_{i = 1}^{m}\vert y_{pred}^{(i)}-y^{(i)}\vert MAE=m1i=1mypred(i)y(i)
  • (R^{2}) 分数 R 2 = 1 − ∑ i = 1 m ( y p r e d ( i ) − y ( i ) ) 2 ∑ i = 1 m ( y ( i ) − y ˉ ) 2 R^{2}=1-\frac{\sum_{i = 1}^{m}(y_{pred}^{(i)}-y^{(i)})^{2}}{\sum_{i = 1}^{m}(y^{(i)}-\bar{y})^{2}} R2=1i=1m(y(i)yˉ)2i=1m(ypred(i)y(i))2,其中 y ˉ \bar{y} yˉ y ( i ) y^{(i)} y(i) 的均值。

(二)分类问题评估指标

  • 准确率(Accuracy) A c c u r a c y = T P + T N T P + T N + F P + F N Accuracy=\frac{TP + TN}{TP + TN + FP + FN} Accuracy=TP+TN+FP+FNTP+TN,其中 T P TP TP(True Positive)为真阳性, T N TN TN(True Negative)为真阴性,(FP)(False Positive)为假阳性,(FN)(False Negative)为假阴性。
  • 精确率(Precision) P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP + FP} Precision=TP+FPTP
  • 召回率(Recall) R e c a l l = T P T P + F N Recall=\frac{TP}{TP + FN} Recall=TP+FNTP
  • (F1) 分数 F 1 = 2 × P r e c i s i o n × R e c a l l P r e c i s i o n + R e c a l l F1=\frac{2\times Precision\times Recall}{Precision + Recall} F1=Precision+Recall2×Precision×Recall
  • ROC 曲线与 AUC 值:ROC 曲线以假阳性率( F P R = F P T N + F P FPR=\frac{FP}{TN + FP} FPR=TN+FPFP)为横轴,真阳性率( T P R = T P T P + F N TPR=\frac{TP}{TP + FN} TPR=TP+FNTP)为纵轴绘制。AUC(Area Under the Curve)值是 ROC 曲线下的面积,AUC 值越大,模型分类性能越好。

五、过拟合与欠拟合

  • 过拟合:模型过于复杂,在训练数据上表现很好,但在测试数据上表现不佳,泛化能力差,可能是对训练数据中的噪声和细节过度拟合。
  • 欠拟合:模型过于简单,无法捕捉数据中的模式和规律,在训练数据上表现就不理想。

六、正则化

  • L1 正则化 J ( θ ) = J 0 ( θ ) + λ ∑ j = 1 n ∣ θ j ∣ J(\theta)=J_{0}(\theta)+\lambda\sum_{j = 1}^{n}\vert\theta_{j}\vert J(θ)=J0(θ)+λj=1nθj,其中 J 0 ( θ ) J_{0}(\theta) J0(θ) 是原始损失函数, λ \lambda λ 为正则化参数。L1 正则化可导致部分参数为 0,实现特征选择,使模型稀疏。
  • L2 正则化(岭回归) J ( θ ) = J 0 ( θ ) + λ ∑ j = 1 n θ j 2 J(\theta)=J_{0}(\theta)+\lambda\sum_{j = 1}^{n}\theta_{j}^{2} J(θ)=J0(θ)+λj=1nθj2。L2 正则化能防止过拟合,使参数值相对较小,模型更平滑。

正则化后的梯度下降更新公式,对于 L1 正则化:
θ j : = θ j − α ( 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) + λ m sgn ( θ j ) ) \theta_{j}:=\theta_{j}-\alpha\left(\frac{1}{m}\sum_{i = 1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x_{j}^{(i)}+\frac{\lambda}{m}\text{sgn}(\theta_{j})\right) θj:=θjα(m1i=1m(hθ(x(i))y(i))xj(i)+mλsgn(θj)) sgn ( θ j ) \text{sgn}(\theta_{j}) sgn(θj) θ j \theta_{j} θj 的符号函数。

对于 L2 正则化:
θ j : = θ j − α ( 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) + 2 λ m θ j ) \theta_{j}:=\theta_{j}-\alpha\left(\frac{1}{m}\sum_{i = 1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x_{j}^{(i)}+\frac{2\lambda}{m}\theta_{j}\right) θj:=θjα(m1i=1m(hθ(x(i))y(i))xj(i)+m2λθj)

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

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

相关文章

JavaScript柯里化和组合函数以及严格模式介绍

柯里化介绍 柯里化的结构 简化版本 让函数的职责单一 柯里化的复用 对某些逻辑进行复用 打印日志的柯里化 自动化柯里化函数 实现柯理化函数 1.柯里化函数是对函数进行处理的方法,所以参数就为一个函数,这里取名w为fn 2.定义一个函数curried&#xff0…

笔记04--零基础创建个人本地大模型知识库ollama+Dify

ollma安装 官网下载直接下一步下一步即可,没有魔法的朋友可以留言,文章中所用到的文件也给打包了,大家可以直接下载使用通过云盘下载使用。 链接: https://pan.baidu.com/s/12zF9MpQtg1bnMDAQayaSyg 提取码: n9rm 官网地址:http…

ACM:连数问题

任务内容 Description 设有n个正整数,将他们连接成一排,组成一个最大的多位整数。例如:n3 时,3个整数13,312,343,连成的最大整数为:34331213 又如:n4 时,4 个整数 7,13,4,246 连接成的最大整数为7424613 Input N N 个数 Output 连接成的多位数…

Element-ui el-tree 异步加载 懒加载 只能选择一个同级节点

需求 树的数据是通过异步(懒)加载而来,且要求同级节点只能选择一个,一个常见的应用场景是选择住址,选择了山东省不能同时选择河北省,选择了每个节点,显示完整的从根节点到本节点的路径 。 分析 Element-ui的el-tre…

【Linux文件管理】重定向内核级缓冲区用户级缓冲区

文章目录 文件管理文件描述符表(files_struct)重定向重定向概念 文件的内核级缓冲区和用户级缓冲区内核级缓冲区用户级缓冲区 总结 文件管理 文件描述符表(files_struct) 上一期我们将文件描述符讲完了,这期来讲讲文…

【H2O2|全栈】Node.js与MySQL连接

目录 前言 开篇语 准备工作 初始配置 创建连接池 操作数据库 封装方法 结束语 前言 开篇语 本节讲解如何使用Node.js实现与MySQL数据库的连接,并将该过程进行函数封装。 与基础部分的语法相比,ES6的语法进行了一些更加严谨的约束和优化&#…

OpenCV 图像基本操作

OpenCV快速通关 第一章:OpenCV 简介与环境搭建 第二章:OpenCV 图像基本操作 OpenCV 图像基本操作 OpenCV快速通关第二章:OpenCV 图像基本操作一、相关结构体与函数介绍(一)cv::Mat 结构体(二)c…

故障识别 | GADF-CNN-SSA-XGBoost数据分类预测/故障识别(Matlab)

故障识别 | GADF-CNN-SSA-XGBoost数据分类预测/故障识别(Matlab) 目录 故障识别 | GADF-CNN-SSA-XGBoost数据分类预测/故障识别(Matlab)分类效果基本描述程序设计参考资料 分类效果 基本描述 格拉姆角场差(GADF&#…

树莓派4B android 系统添加led灯 Hal 层

本文内容需要用到我上一篇文章做的驱动,可以先看文章https://blog.csdn.net/ange_li/article/details/136759249 一、Hal 层的实现 1.Hal 层的实现一般放在 vendor 目录下,我们在 vendor 目录下创建如下的目录 aosp/vendor/arpi/hardware/interfaces/…

基于Matlab的变压器仿真模型建模方法(9):三相变压器组的建模仿真(续)

1.引言 前一节介绍了基于混合磁链的考虑主磁路饱和情况的三相变压器组的Simulink仿真模型,并应用它对Y,yn接法三相变压器组的瞬态过程进行了仿真计算。这一节建立一个新的基于等效电路的Simulink三相变压器组的仿真模型,并应用它对Y,d11接法的三相变压器组的瞬态过程进行仿…

【Atcoder】【ABC383】A- Humidifier 1加湿器 题解

前言 不知道大家有没有关注过AtCoder 这是小日子那边的一个网站,每周都会有比赛 比起CF等等,最大的优点就是延迟低,题目质量也不错 计划以后每周更新题解了 正文 题目传送门A - Humidifier 1 题目大意 有一个加湿器,给定 …

LeetCode 热题 100_反转链表(23_206_简单_C++)(单链表_递归)

LeetCode 热题 100_反转链表(23_206) 题目描述:输入输出样例:题解:解题思路:思路一(迭代):思路二(简化方法一(迭代)代码):思路三&…

49 基于单片机的湿度和光照监测

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于AT89C52单片机,采用DHT11温湿度传感器检测土壤湿度,光敏电阻连接ADC0832数模转换器作为光敏传感器,然后通过LCD1602显示湿度和光照值,如果湿度低…

【C语言】程序设计--算法

文章目录 1. 判断两个数的大小并交换2. 计算三角形面积3. 根据x的值计算y4. 字符大小写转换5. 百钱百鸡问题6. 计算公式y的值7. 输出所有的水仙花数8. 计算n的阶乘9. 下三角数据10. 斐波那契数列11. 学生成绩统计12. 数组的平均值1. 判断两个数的大小并交换 介绍: 从键盘输入…

嵌入式Linux,字符串的处理,以及相关函数详解

C 语言库函数中已经给我们提供了丰富的字符串处理相关函数,基本常见的字符串处理需求都可 以直接使用这些库函数来实现。 1. 字符串输入/输出 在程序当中,经常需要在程序运行过程中打印出一些信息,譬如调试信息、报错信息、中间产生的变量的…

400G智算网络助力知名自动驾驶企业算力训练提效

根据Gartner的最新趋势预测,自动驾驶技术正迅速发展,预计在未来几年内将带来显著的商业效益,特别是在决策智能和边缘人工智能领域。目前,一家领军企业正积极拥抱基于大模型的数字化转型之路,作为自动驾驶领域的佼佼者&…

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(三)

目录 ARC规则 概要 所有权修饰符 __strong修饰符 __weak修饰符 __unsafe_unretained修饰符 ___autoreleasing修饰符 ARC规则 概要 “引用计数式内存管理”的本质部分在ARC中并没有改变,ARC只是自动地帮助我们处理“引用计数”的相关部分。 在编译单位上可以…

数学活动是什么过程?

有专家说:数学活动是建构的操作过程,建构的过程必须是探索、发现和创造的过程。 什么是建构,建构就是构建,就是建立。明明有让人一看就明白的词,人非得弄得云遮雾绕。 也难怪,现在什么都流行上云。 上云…

windows11安装Linux子系统配置大数据hadoop

zai 1、安装linux子系统 1、启用适用于 Linux 的 Windows 子系统 搜索框里面输入<开发>即可跳转&#xff0c;打开开发人员模式 命令行里面输入systeminfo确定是否电脑已经支持虚拟化&#xff0c;是则可以继续安装: 2、然后先启用“适用于 Linux 的 Windows 子系统”可选…

RPC设计--从reactor设计 (IOthread)

主从reactor架构 一般的一个网络IO库都是主从reactor模式&#xff0c;即主线程中有一个MainReactor&#xff0c;其负责监听ListenFd&#xff0c;当接受到新的用户连接时&#xff0c;返回的clientfd并不会加入的MainReacotr&#xff0c;而是在子线程&#xff08;这里称为IO线程&…