【机器学习】线性回归与逻辑回归的极致解析:从数学理论到实战案例

AI3.png

1. 引言

  • 在当今数据驱动的世界中,机器学习已经成为推动技术进步的重要引擎。无论是在医疗诊断、金融分析、图像识别,还是自然语言处理等领域,机器学习算法都扮演着至关重要的角色。其中,分类与回归任务是机器学习中的两个核心问题,它们分别用于解决二分类、多分类问题以及连续变量预测问题。对于初学者和从业者而言,深入理解这些基础算法,不仅有助于掌握更复杂的模型和技术,也能够在实际项目中灵活应用这些算法。
  • 线性回归逻辑回归是机器学习中最经典的两种算法,它们在各自的领域中占据着举足轻重的地位。线性回归主要用于预测连续的数值输出,而逻辑回归则用于解决二元分类问题。尽管它们在处理问题的类型上有所不同,但这两种算法都依赖于数据特征和模型之间的线性关系。通过掌握这两种算法,读者不仅可以理解回归与分类的基本概念,还可以掌握如何在实际场景中进行模型的训练、评估与优化。
  • 本文将从基本概念入手,系统地介绍线性回归和逻辑回归的工作原理、数学推导、优缺点,并通过实例与代码实现展示它们的应用。同时,本文还将探讨如何在不同的应用场景中选择合适的算法,并对常见问题和调优技巧进行详细说明。通过对这些内容的学习,读者将能够在实际项目中更好地应用线性回归和逻辑回归,从而提升机器学习模型的性能与实用性。

Python 代码示例

在本文的示例部分,将使用Python语言来实现线性回归与逻辑回归的具体算法。Python作为当前最流行的数据科学与机器学习编程语言,提供了丰富的库与工具,可以简化模型的构建与调试过程。下文中的代码示例将使用以下几个关键库:

  • NumPy: 用于数值计算,处理矩阵和数组运算。
  • Pandas: 用于数据处理与分析,特别是数据的加载与预处理。
  • Scikit-Learn: 机器学习库,提供了丰富的算法与评估工具。
  • MatplotlibSeaborn: 用于数据的可视化,帮助理解模型的表现。

通过实际的代码实现,读者将能够更直观地理解线性回归和逻辑回归的核心思想,并掌握如何在真实数据上应用这些算法。
AI5.4.png

2. 线性回归

2.1 线性回归的基本概念

线性回归的定义

线性回归是一种统计方法,用于研究因变量(目标变量)与一个或多个自变量(特征变量)之间的线性关系。通过拟合一条直线,线性回归模型试图找到最优的线性函数,使得预测值与实际观测值之间的误差最小。这条拟合的直线被称为“回归线”。
简单线性回归(Simple Linear Regression)是指只有一个自变量的情况,而多元线性回归(Multiple Linear Regression)则涉及多个自变量。无论是简单还是多元,线性回归的目标都是找到一个线性模型,即:
y ​ = β 0 ​ + β 1 ​ x 1 ​ + β 2 ​ x 2 ​ + ⋯ + β n ​ x n ​ y ^ ​ =β 0 ​ +β 1 ​ x 1 ​ +β 2 ​ x 2 ​ +⋯+β n ​ x n ​ y=β0​+β1​x1​+β2​x2​++βnxn
其中:
image.png

数学表达式及模型假设

在线性回归中,模型假设非常关键,它决定了线性回归的适用范围及其效果:

  1. 线性假设:自变量和因变量之间必须存在线性关系。即,因变量可以通过自变量的线性组合来表示。
  2. 独立性假设:观测值之间相互独立。尤其是对于时间序列数据,独立性假设尤为重要。
  3. 同方差性假设(Homoscedasticity):自变量的不同值对应的因变量的误差项具有相同的方差。这意味着残差的分布不应该随着自变量的变化而变化。
  4. 正态性假设:残差项应该服从正态分布,尤其是在构建置信区间和进行显著性检验时,这一假设尤为重要。

2.2 线性回归的工作原理

最小二乘法(Ordinary Least Squares, OLS)

最小二乘法是线性回归的核心算法之一,它的目标是通过最小化观测值与回归线之间的误差平方和来找到最佳拟合线。这些误差平方和称为残差(Residuals)。数学上,可以通过下式描述:
image.png
以下是Python中使用numpy库实现最小二乘法的简单示例:

import numpy as np

# 生成样本数据
X = np.array([1, 2, 3, 4, 5])  # 自变量
y = np.array([2, 4, 5, 4, 5])  # 因变量

# 添加截距项
X_b = np.c_[np.ones((X.shape[0], 1)), X]

# 正规方程计算参数
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)

# 打印结果
print(f"截距项 (β0): {theta_best[0]}")
print(f"斜率 (β1): {theta_best[1]}")

梯度下降法在线性回归中的应用

梯度下降法是一种迭代优化算法,它通过沿着损失函数的梯度方向更新参数,以最小化目标函数。在线性回归中,梯度下降用于优化模型参数,目标是最小化残差平方和。
image.png
Python实现梯度下降法的简单示例:

def gradient_descent(X, y, theta, learning_rate=0.01, iterations=1000):
    m = len(y)
    for i in range(iterations):
        gradients = 2/m * X.T.dot(X.dot(theta) - y)
        theta = theta - learning_rate * gradients
    return theta

# 初始化参数
theta = np.random.randn(2, 1)

# 应用梯度下降法
theta_best = gradient_descent(X_b, y, theta)

# 打印结果
print(f"截距项 (β0): {theta_best[0]}")
print(f"斜率 (β1): {theta_best[1]}")

多元线性回归与一元线性回归的区别与联系

一元线性回归是线性回归的简化形式,只有一个自变量,而多元线性回归则扩展到多个自变量。尽管模型的复杂度不同,但它们遵循相同的基本原理。多元线性回归的目标是找到一个多维平面,而不是一条直线,以拟合数据。
image.png
这两者的主要区别在于维度的不同,但都通过最小化残差平方和来优化模型参数。

2.3 线性回归的优缺点

线性回归的优势

  • 简单: 线性回归的原理非常直观,通过简单的线性关系来描述变量之间的关联。
  • 高效: 由于其线性的特点,线性回归计算速度快,适用于大规模数据集。
  • 解释性强: 线性回归模型的系数可以清晰地解释每个特征对结果的影响,便于理解和解读。

线性回归的局限性

  • 无法处理非线性关系: 线性回归假设变量之间存在线性关系,无法有效建模非线性关系。
  • 对异常值敏感: 线性回归对数据中的异常值(outliers)非常敏感,异常值可能会对回归线造成较大影响。
  • 假设较强: 线性回归模型依赖于独立性、同方差性等假设,一旦假设不成立,模型效果可能会大打折扣。

2.4 实例与代码实现

案例描述: 假设我们要预测房价,给定一组历史数据,包括房屋面积、卧室数量、楼层等特征,使用线性回归模型来预测房价。
Python代码实现:

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

# 假设我们有一个简单的房价数据集
data = {
    'Area': [1500, 1600, 1700, 1800, 1900, 2000],
    'Bedrooms': [3, 3, 3, 4, 4, 4],
    'Price': [300000, 320000, 340000, 360000, 380000, 400000]
}

# 将数据转换为DataFrame
df = pd.DataFrame(data)

# 特征与目标变量
X = df[['Area', 'Bedrooms']]
y = df['Price']

# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化线性回归模型
model = LinearRegression()

# 训练模型
model.fit(X_train, y_train)

# 预测房价
y_pred = model.predict(X_test)

# 输出均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")

# 绘制真实房价与预测房价的对比图
plt.scatter(y_test, y_pred)
plt.xlabel("Actual Prices")
plt.ylabel("Predicted Prices")
plt.title("Actual Prices vs Predicted Prices")
plt.show()

# 显示模型的系数和截距
print(f"Coefficients: {model.coef_}")
print(f"Intercept: {model.intercept_}")

代码解释:

  1. 数据加载与准备:
    • 使用一个简单的数据集,包括房屋的面积和卧室数量作为特征,房价作为目标变量。
    • 数据集被分割为训练集和测试集,用于模型训练和评估。
  2. 模型训练:
    • 使用 LinearRegression 类初始化线性回归模型,并通过 fit 方法在训练集上进行模型训练。
  3. 模型评估:
    • 使用测试集对模型进行预测,并计算均方误差(MSE),作为模型性能的评价指标。
    • 通过绘图对比实际房价与预测房价,直观展示模型的预测效果。
  4. 模型系数与截距:
    • 输出模型的系数和截距,便于分析每个特征对房价的影响。

结果分析:

  • 通过对比实际房价和预测房价,可以观察模型的预测效果。如果误差较大,可能需要考虑增加特征或者使用更复杂的模型(如多项式回归或非线性回归)。

AI5.1.png

3. 逻辑回归

3.1 逻辑回归的基本概念

逻辑回归的定义:
逻辑回归(Logistic Regression)是一种用于处理二元分类问题的线性模型。与线性回归不同,逻辑回归的输出值是一个概率值,用来表示某个数据点属于某个类别的概率。逻辑回归通过拟合一条S型曲线(Sigmoid函数)来将预测值限制在0到1之间。
数学表达式:
image.png
模型假设:
image.png

3.2 逻辑回归的工作原理

逻辑回归的推导及损失函数:
image.png
扩展至多分类问题的逻辑回归:
对于多分类问题(如有三个或更多类别),逻辑回归可以扩展为Softmax回归。Softmax回归通过一个归一化的指数函数来输出每个类别的概率。Softmax函数的数学表达式如下:
image.png

其中 K K K是类别的数量, ( β j ) ( \mathbf{\beta}_j ) (βj) 是类别 j )的参数向量。

3.3 逻辑回归的优缺点

逻辑回归的优势:

  • 易于实现: 逻辑回归的计算复杂度较低,实现简单。
  • 对线性关系有良好拟合: 在特征与输出之间存在线性关系时,逻辑回归能够很好地拟合数据。
  • 概率输出: 逻辑回归输出的概率值便于解释模型的预测结果,并可以为决策提供依据。

逻辑回归的局限性:

  • 假设线性可分性: 逻辑回归假设数据是线性可分的,无法处理复杂的非线性关系。
  • 对异常值敏感: 与线性回归类似,逻辑回归对异常值较为敏感,异常数据可能会影响模型的性能。

3.4 实例与代码实现

案例描述: 假设我们有一个关于某种疾病的数据集,其中包括患者的年龄、血压、体重等特征,以及是否患病的标签。我们可以使用逻辑回归模型来预测新患者是否患有这种疾病。
Python代码实现:

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, roc_auc_score, roc_curve
import matplotlib.pyplot as plt

# 假设我们有一个疾病诊断数据集
data = {
    'Age': [25, 30, 45, 50, 35, 40, 60, 55],
    'BloodPressure': [120, 130, 135, 140, 125, 128, 150, 145],
    'Weight': [70, 80, 75, 85, 78, 82, 90, 88],
    'HasDisease': [0, 0, 1, 1, 0, 1, 1, 1]
}

# 将数据转换为DataFrame
df = pd.DataFrame(data)

# 特征与目标变量
X = df[['Age', 'BloodPressure', 'Weight']]
y = df['HasDisease']

# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化逻辑回归模型
model = LogisticRegression()

# 训练模型
model.fit(X_train, y_train)

# 预测疾病发生概率
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)[:, 1]

# 输出准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

# 输出混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(conf_matrix)

# 绘制ROC曲线
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
roc_auc = roc_auc_score(y_test, y_pred_proba)
plt.plot(fpr, tpr, label=f'ROC curve (area = {roc_auc:.2f})')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend(loc='lower right')
plt.show()

代码解释:

  1. 数据加载与准备:
    • 使用一个简单的数据集,包括患者的年龄、血压和体重作为特征,以及是否患病的标签。
    • 数据集被分割为训练集和测试集,用于模型训练和评估。
  2. 模型训练:
    • 使用 LogisticRegression 类初始化逻辑回归模型,并通过 fit 方法在训练集上进行模型训练。
  3. 模型评估:
    • 通过准确率(Accuracy)和混淆矩阵(Confusion Matrix)来评估模型的性能。
    • 使用ROC曲线和AUC值来评估模型在分类任务中的表现。
  4. 结果分析:
    • 通过ROC曲线和AUC值,可以判断模型在不同阈值下的表现,帮助选择合适的决策阈值。
    • 通过混淆矩阵,可以分析模型在分类过程中所犯的错误类型(如假阳性和假阴性)。

4. 线性回归与逻辑回归的比较

在这部分内容中,我们将详细探讨线性回归和逻辑回归之间的本质差异以及它们在不同应用场景中的使用情况。我们还将通过案例分析来说明何时使用线性回归,何时使用逻辑回归。

4.1 模型本质的差异

线性回归逻辑回归虽然名字相似,但它们解决的问题、数学形式以及假设都有显著的不同。
1. 线性回归用于预测连续变量
线性回归是一种用于预测连续变量的模型。它通过拟合一条直线来预测一个连续的数值输出。线性回归的数学模型可以用以下形式表示:
y ^ = β 0 + β 1 x 1 + β 2 x 2 + ⋯ + β n x n \hat{y} = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \dots + \beta_n x_n y^=β0+β1x1+β2x2++βnxn
其中, y ^ \hat{y} y^ 是预测值, β 0 \beta_0 β0 是截距, β 1 , β 2 , … , β n \beta_1, \beta_2, \dots, \beta_n β1,β2,,βn 是特征对应的权重(回归系数),而 x 1 , x 2 , … , x n x_1, x_2, \dots, x_n x1,x2,,xn 是输入特征。


2. 逻辑回归用于分类任务
与线性回归不同,逻辑回归是一种用于解决分类问题的模型,尤其是二元分类问题(即输出只有两个可能的类别)。逻辑回归通过拟合一个S型曲线(Sigmoid函数)来估计一个事件发生的概率。逻辑回归的数学表达式如下:
P ( y = 1 ∣ x ) = σ ( β 0 + β 1 x 1 + β 2 x 2 + ⋯ + β n x n ) P(y=1|x) = \sigma(\beta_0 + \beta_1 x_1 + \beta_2 x_2 + \dots + \beta_n x_n) P(y=1∣x)=σ(β0+β1x1+β2x2++βnxn)
其中, P ( y = 1 ∣ x ) P(y=1|x) P(y=1∣x) 是事件发生的概率, σ ( z ) \sigma(z) σ(z) 是Sigmoid函数,定义为:
σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+ez1


3. 模型的数学形式与假设对比
线性回归假设预测变量和响应变量之间存在线性关系,这意味着数据可以被一条直线很好地拟合。而逻辑回归则假设输入特征与输出的对数几率(log-odds)之间存在线性关系。
线性回归假设模型中的误差项是独立同分布的,并且服从正态分布(高斯分布),而逻辑回归则假设样本的独立性,但并不要求误差项服从正态分布。

4.2 应用场景的差异

线性回归和逻辑回归在应用场景上有明显的区别。我们需要根据问题的性质来选择合适的模型。
1. 线性回归适用于预测任务
线性回归适用于那些目标变量是连续数值的问题,比如房价预测、股票价格预测等。例如,假设你想根据房屋的面积、卧室数量、位置等特征来预测房屋的售价,这就是一个典型的线性回归问题。
2. 逻辑回归适用于分类任务
逻辑回归则适用于分类任务,特别是二分类问题,例如垃圾邮件检测(判断一封邮件是否是垃圾邮件)、疾病诊断(判断病人是否患有某种疾病)等。例如,假设你要根据病人的年龄、血压、胆固醇水平等特征来预测他是否患有心脏病,这就是一个典型的逻辑回归问题。
3. 案例分析:何时使用线性回归、何时使用逻辑回归

  • 线性回归案例:假设你在研究如何通过气温、湿度等气象参数来预测某一天的电力消耗量。这里电力消耗量是一个连续变量,适合使用线性回归模型。
  • 逻辑回归案例:假设你要根据一系列特征(如客户年龄、收入、过往购买记录等)预测某客户是否会购买某商品。这是一个二分类问题(购买或不购买),逻辑回归是更合适的选择。

线性回归适用于解决“预测”的问题,即对连续变量的预测;逻辑回归则适用于解决“分类”的问题,尤其是二分类问题。掌握这两种模型的本质差异与应用场景,可以帮助我们在实际工作中做出更加合理的模型选择。

5. 实际应用与常见问题

5.1 模型评估

1. 评估线性回归模型的性能

  • 决定系数(R²)
    决定系数 R 2 R^2 R2 是衡量线性回归模型拟合优度的常用指标。它表示模型对数据变异的解释程度,值的范围为0到1。 的值越接近1,模型的解释能力越强。其计算公式为:

    R 2 = 1 − RSS TSS R^2 = 1 - \frac{\text{RSS}}{\text{TSS}} R2=1TSSRSS

其中,RSS 是残差平方和,TSS 是总平方和。残差平方和是实际值与预测值之间差异的平方和,总平方和是实际值与均值之间差异的平方和。

- 均方误差(MSE)
均方误差是预测值与实际值之差的平方的平均值,公式为:
MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{MSE} = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2 MSE=n1i=1n(yiy^i)2
其中, y i y_i yi 是实际值, y ^ i \hat{y}_i y^i 是预测值, n n n 是样本数量。MSE 值越小,模型的预测性能越好。

2. 评估逻辑回归模型的性能

  • 混淆矩阵混淆矩阵是一种可视化分类模型性能的工具,用于展示分类结果的实际类别和预测类别之间的关系。其结构为:

                      预测为正类	               预测为负类
    

    实际为正类 True Positives (TP) False Negatives (FN)
    实际为负类 False Positives (FP) True Negatives (TN)

  • 从混淆矩阵中可以计算出各种评估指标,如准确率、精确率、召回率和F1-score。

  • ROC曲线与AUCROC(Receiver Operating Characteristic)曲线绘制了假阳性率(False Positive Rate, FPR)与真正率(True Positive Rate, TPR)的关系。AUC(Area Under the Curve)表示ROC曲线下的面积,用于衡量模型的整体表现。AUC值越接近1,模型性能越好。ROC曲线的公式如下:

    FPR = FP FP + TN \text{FPR} = \frac{\text{FP}}{\text{FP} + \text{TN}} FPR=FP+TNFP
    TPR = TP TP + FN \text{TPR} = \frac{\text{TP}}{\text{TP} + \text{FN}} TPR=TP+FNTP

3. 过拟合与欠拟合

  • 过拟合过拟合发生在模型过于复杂,能够很好地拟合训练数据,但在新数据上的表现差。检测方法包括:

解决方法

  • 在训练集和验证集上计算误差,验证集误差显著高于训练集误差通常表示过拟合。
  • 使用交叉验证来评估模型的泛化能力。
  • 使用更简单的模型。
  • 增加数据量。
  • 使用正则化技术(如L1、L2正则化)。
  • 欠拟合欠拟合发生在模型过于简单,无法捕捉数据的复杂性。检测方法包括:

解决方法

  • 模型在训练集和验证集上均表现不佳。
  • 残差图显示模型无法捕捉数据中的模式。
  • 使用更复杂的模型。
  • 增加特征或进行特征工程。
  • 减少数据的噪声或错误。

5.2 常见问题与调优技巧

1. 数据预处理对模型的影响

  • 归一化(Normalization):将特征缩放到相同的范围(如0到1),可以加快梯度下降法的收敛速度,提高模型性能。常用的归一化方法有Min-Max归一化。
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
X_normalized = scaler.fit_transform(X)
  • 标准化(Standardization):将特征转换为均值为0、标准差为1的分布,适用于数据具有不同均值和方差的情况。常用的标准化方法有Z-score标准化。
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_standardized = scaler.fit_transform(X)

2. 特征选择与特征工程

  • 特征选择:选择对模型训练最有帮助的特征,减少特征的数量,可以提高模型的性能并减少计算成本。常用方法包括递归特征消除(RFE)、L1正则化等。
  • 特征工程:从原始数据中创建新特征,以提高模型的性能。包括特征构造、特征提取、特征选择等。

3. 正则化方法的应用

  • L1正则化(Lasso回归):通过在损失函数中添加特征的绝对值和作为正则化项,促使部分特征的系数为零,从而进行特征选择。
from sklearn.linear_model import Lasso

model = Lasso(alpha=0.1)
model.fit(X_train, y_train)
  • L2正则化(Ridge回归):通过在损失函数中添加特征的平方和作为正则化项,避免模型过于复杂,并减小系数的幅度。
from sklearn.linear_model import Ridge

model = Ridge(alpha=0.1)
model.fit(X_train, y_train)

正则化技术有助于减少模型的复杂性,从而避免过拟合。
通过上述内容,我们可以看到在实际应用中,模型的评估、数据预处理、特征工程和正则化都是至关重要的。正确的评估方法可以帮助我们了解模型的性能,适当的数据预处理和特征工程可以提高模型的表现,而正则化则帮助我们控制模型的复杂度。

6. 总结

  • 在这篇博客中,我们详细探讨了线性回归和逻辑回归这两种基础的机器学习算法。我们首先介绍了线性回归的基本概念和工作原理,包括其数学表达式、最小二乘法的推导以及梯度下降法的应用。通过示例代码,我们展示了如何使用Python实现线性回归模型,并对其优缺点进行了分析。
  • 接着,我们深入讨论了逻辑回归,涵盖了其定义、数学表达式、模型假设及其与线性回归的区别。我们还解释了逻辑回归的工作原理,包括损失函数的推导及梯度下降法的应用。此外,我们探讨了逻辑回归的优缺点,并通过示例代码演示了如何实现逻辑回归模型。
  • 在比较线性回归和逻辑回归的部分,我们分析了它们在预测连续变量和分类任务中的应用场景,并讨论了它们各自的优劣。最后,我们总结了实际应用中的常见问题,如模型评估、数据预处理、特征选择及正则化方法,并提供了实用的调优技巧。
  • 理解并掌握线性回归与逻辑回归这两种基础算法对于进入机器学习领域至关重要。它们不仅是许多高级机器学习模型的基础,而且在实际应用中也广泛用于预测和分类任务。通过不断学习和实践,读者可以更好地利用这些技术解决复杂的实际问题。

7. 参考资料

以下是本篇博客中提到的参考资料,包括文献、书籍和博客链接,这些资源可以帮助读者进一步深入理解线性回归和逻辑回归算法:

  1. 文献
    • J. Han, M. Kamber, and J. Pei, Data Mining: Concepts and Techniques. Morgan Kaufmann Publishers, 2011.
    • C. M. Bishop, Pattern Recognition and Machine Learning. Springer, 2006.
    • T. M. Mitchell, Machine Learning. McGraw-Hill, 1997.
  2. 书籍
    • Géron, A. (2019). Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems. O’Reilly Media.
    • Ng, A. (2020). Machine Learning Yearning: Technical Strategy for AI Engineers, In the Era of Deep Learning. Self-published.
  3. 博客
  4. 在线课程

这些资源将帮助您更好地理解和应用线性回归和逻辑回归技术,并为进一步学习机器学习领域的高级主题奠定基础。

07c03ae6d77b4b153f6d1ec710be7c14_7a80245f0b5f4021a033b3789a9efdeb.png

  1. 📜 [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免,
  2. 本人也很想知道这些错误,恳望读者批评指正!
  3. 我是:勇敢滴勇~感谢大家的支持!

  • 61
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 42
    评论
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值