当前位置: 首页 > article >正文

人工智能知识分享第六天-机器学习_​逻辑回归(Logistic Regression)

简介

在机器学习中,分类问题是一种常见的任务,目标是根据输入特征将数据点分配到不同的类别中。为了实现分类,我们需要训练一个分类器,该分类器能够根据输入数据的特征进行预测。

逻辑回归(Logistic Regression)是一种常用的分类算法,尤其适用于二分类问题。逻辑回归的核心思想是通过对数几率函数(logistic function)将线性回归的输出映射到概率空间,从而实现分类。

注意:逻辑回归虽然名字中有回归二字,但是它不是回归算法,而是分类算法。

逻辑回归理解

逻辑回归(Logistic Regression)是一种广泛使用的分类算法,它的主要思想是将输入变量的线性组合映射到0到1之间的概率,用于预测二元输出变量的概率。

逻辑回归模型的举例:

  • 假设我们有一个二元分类问题,需要预测一个样本属于两个类别中的哪一个。
  • 逻辑回归模型使用一个参数化函数来计算给定输入变量的输出概率。该函数称为 sigmoid 函数,它将输入变量的线性组合映射到0到1之间的值,表示预测样本属于正例的概率。
  • 训练模型的过程就是通过最大化似然函数来估计模型的权重。似然函数是一个关于模型参数的函数,表示给定模型下,样本的概率。
  • 为了最大化似然函数,我们可以使用梯度下降算法来更新模型的权重。梯度下降算法通过反复迭代来最小化损失函数,直到找到最优解。
  • 损失函数通常使用对数损失函数(log loss)来衡量模型的性能。
  • 训练模型后,我们可以使用模型来预测新的样本的类别标签。预测类别标签的方法是,将新样本的特征向量代入 sigmoid 函数,计算输出概率,如果概率大于0.5,则预测为正例,否则预测为负例。
    逻辑回归模型简单而直观,易于理解和实现,常用于二元分类问题的建模
sigmoid 函数

sigmoid 函数的数学形式为:其中,z 是输入变量的线性组合,可以表示为: 其中, 是模型的权重(即系数), 是输入变量的值。
sigmoid 函数的数学形式为:在这里插入图片描述
它是一个定义域为 (−∞, +∞) ,值域为 (0,1) 的严格单调递增函数,其图像如下图所示:
在这里插入图片描述
其中,z 是输入变量的线性组合,可以表示为:Z=b+W1X1+W2X2+…+WnXn其中,Wi是模型的权重(即系数),Xi是输入变量的值。

在逻辑回归中,我们将输入变量通过线性组合得到 z 值,然后将 z 值代入 sigmoid 函数中,得到一个介于 0 和 1 之间的概率值,表示预测为正类的概率。sigmoid 函数的特性使其能够将任意实数映射到 (0, 1) 区间,因此适用于二分类问题的概率预测。

似然函数

似然函数是一个关于模型参数的函数,表示给定模型下,样本的概率。在逻辑回归中,似然函数可以表示为:
在这里插入图片描述
其中,Zi是第i个样本的线性组合,Yi是对应的类别标签(0或1)

极大似然估计

核心思想:

设模型中含有待估参数w,可以取很多值。已经知道了样本观测值,从w的一切可能值中(选出一个使该观察值出现的概率为最大的值,作为w参数的估计值,这就是极大似然估计。(顾名思义:就是看上去那个是最大可能的意思)

举个例子:

假设有一枚不均匀的硬币,出现正面的概率和反面的概率是不同的。假定出现正面的概率为𝜃, 抛了6次得到如下现象 D = {正面,反面,反面,正面,正面,正面}。每次投掷事件都是相互独立的。 则根据产生的现象D,来估计参数𝜃是多少?
在这里插入图片描述
对数函数
在这里插入图片描述

逻辑回归原理

原理

逻辑回归概念 Logistic Regression

• 一种分类模型,把线性回归的输出,作为逻辑回归的输入。

• 输出是(0, 1)之间的值

• 基本思想

  1. 利用线性模型 f(x) = wx + b 根据特征的重要性计算出一个值
  2. 再使用 sigmoid 函数将 f(x) 的输出值映射为概率值
    1. 设置阈值(eg:0.5),输出概率值大于 0.5,则将未知样本输出为 1 类
    2. 否则输出为 0 类

3.逻辑回归的假设函数
h(w) = sigmoid(wx + b )

线性回归的输出,作为逻辑回归的输入

在逻辑回归中,当预测结果不对的时候,我们该怎么衡量其损失呢?

我们来看下图(下图中,设置阈值为0.6),

在这里插入图片描述

那么如何去衡量逻辑回归的预测结果与真实结果的差异?

损失函数

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

逻辑回归API

API介绍

sklearn.linear_model.LogisticRegression(solver='liblinear', penalty=‘l2’, C = 1.0)

solver 损失函数优化方法:

训练速度:liblinear 对小数据集场景训练速度更快,sag 和 saga 对大数据集更快一些。 2 正则化:

  1. newton-cg、lbfgs、sag、saga 支持 L2 正则化或者没有正则化
  2. 2liblinear 和 saga 支持 L1 正则化

penalty:正则化的种类,l1 或者 l2

C:正则化力度

默认将类别数量少的当做正例

癌症分类案例

  • 数据介绍

(1)699条样本,共11列数据,第一列用语检索的id,后9列分别是与肿瘤相关的医学特征,

​ 最后一列表示肿瘤类型的数值。

(2)包含16个缺失值,用”?”标出。

(3)2表示良性,4表示恶性

数据描述

(1)699条样本,共11列数据,第一列用语检索的id,后9列分别是与肿瘤

相关的医学特征,最后一列表示肿瘤类型的数值。

(2)包含16个缺失值,用”?”标出。

  • 案例分析
1.获取数据
2.基本数据处理
2.1 缺失值处理
2.2 确定特征值,目标值
2.3 分割数据
3.特征工程(标准化)
4.机器学习(逻辑回归)
5.模型评估
  • 代码实现
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler


def dm01_LogisticRegression():
    # 1. 获取数据.
    data = pd.read_csv('data/breast-cancer-wisconsin.csv')
    data.info()

    # 2. 数据预处理.
    # data = data.replace(to_replace='?', value=np.NAN)
    data = data.replace('?', np.NaN)
    data = data.dropna()
    data.info()

    # 3. 确定特征值和目标值.
    x = data.iloc[:, 1:-1]
    y = data.Class
    print(f'x.head(): {x.head()}')
    print(f'y.head(): {y.head()}')

    # 3. 分割数据.
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=21)
    # 4. 特征处理.
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 5. 模型训练.
    estimator = LogisticRegression()
    estimator.fit(x_train, y_train)
    # 6. 模型预测
    y_predict = estimator.predict(x_test)
    print(f'预测值: {y_predict}')

    # 7. 模型评估
    print(f'准确率: {estimator.score(x_test, y_test)}')
    print(f'准确率: {accuracy_score(y_test, y_predict)}')

if __name__ == '__main__':
    dm01_LogisticRegression()

分类评估方法

混淆矩阵

在这里插入图片描述
混淆矩阵作用在测试集样本集中:

  1. 真实值是 正例 的样本中,被分类为 正例 的样本数量有多少,这部分样本叫做真正例(TP,True Positive)
  2. 真实值是 正例 的样本中,被分类为 假例 的样本数量有多少,这部分样本叫做伪反例(FN,False Negative)
  3. 真实值是 假例 的样本中,被分类为 正例 的样本数量有多少,这部分样本叫做伪正例(FP,False Positive)
  4. 真实值是 假例 的样本中,被分类为 假例 的样本数量有多少,这部分样本叫做真反例(TN,True Negative)

True Positive :表示样本真实的类别
Positive :表示样本被预测为的类别

例子:

样本集中有 6 个恶性肿瘤样本,4 个良性肿瘤样本,我们假设恶性肿瘤为正例,则:

模型 A: 预测对了 3 个恶性肿瘤样本,4 个良性肿瘤样本

  1. 真正例 TP 为:3
  2. 伪反例 FN 为:3
  3. 伪正例 FP 为:0
  4. 真反例 TN:4

模型 B: 预测对了 6 个恶性肿瘤样本,1个良性肿瘤样本

  1. 真正例 TP 为:6
  2. 伪反例 FN 为:0
  3. 伪正例 FP 为:3
  4. 真反例 TN:1

我们会发现:TP+FN+FP+TN = 总样本数量

from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score
import pandas as pd


def dm01_混淆矩阵四个指标():
    # 1. 定义样本集, 6个恶性肿瘤样本, 4个良性肿瘤样本
    y_true = ['恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '良性', '良性', '良性', '良性']

    # 2. 定义标签
    labels = ['恶性', '良性']

    # 3. 模型A => 预测对了 3个恶性, 4个良性.
    y_pred_A = ['恶性', '恶性', '恶性', '良性', '良性', '良性', '良性', '良性', '良性', '良性']
    result = confusion_matrix(y_true, y_pred_A)
    print(pd.DataFrame(result, index=labels, columns=labels))

    # 4. 模型B => 预测对了6个恶性肿瘤样本, 1个良性肿瘤样本.
    y_pred_B = ['恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '良性']
    result = confusion_matrix(y_true, y_pred_B)
    print(pd.DataFrame(result, index=labels, columns=labels))


    # 5. 计算精确率 (precision)
    print(f'模型A精确率: {precision_score(y_true, y_pred_A, pos_label="恶性")}')
    print(f'模型B精确率: {precision_score(y_true, y_pred_B, pos_label="恶性")}')

    # 6. 计算召回率 (recall)
    print(f'模型A召回率: {recall_score(y_true, y_pred_A, pos_label="恶性")}')
    print(f'模型B召回率: {recall_score(y_true, y_pred_B, pos_label="恶性")}')

    # 7. 计算F1值
    print(f'模型A F1值: {f1_score(y_true, y_pred_A, pos_label="恶性")}')
    print(f'模型B F1值: {f1_score(y_true, y_pred_B, pos_label="恶性")}')


if __name__ == '__main__':
    dm01_混淆矩阵四个指标()

Precision(精确率)

精确率也叫做查准率,指的是对正例样本的预测准确率。比如:我们把恶性肿瘤当做正例样本,则我们就需要知道模型对恶性肿瘤的预测准确率。
在这里插入图片描述
例子:

样本集中有 6 个恶性肿瘤样本,4 个良性肿瘤样本,我们假设恶性肿瘤为正例,则:

模型 A: 预测对了 3 个恶性肿瘤样本,4 个良性肿瘤样本

  1. 真正例 TP 为:3
  2. 伪反例 FN 为:3
  3. 假正例 FP 为:0
  4. 真反例 TN:4
  5. 精准率:3/(3+0) = 100%

模型 B: 预测对了 6 个恶性肿瘤样本,1个良性肿瘤样本

  1. 真正例 TP 为:6
  2. 伪反例 FN 为:0
  3. 假正例 FP 为:3
  4. 真反例 TN:1
  5. 精准率:6/(6+3) = 67%

Recall(召回率)

召回率也叫做查全率,指的是预测为真正例样本占所有真实正例样本的比重。例如:我们把恶性肿瘤当做正例样本,则我们想知道模型是否能把所有的恶性肿瘤患者都预测出来。在这里插入图片描述
例子:

样本集中有 6 个恶性肿瘤样本,4 个良性肿瘤样本,我们假设恶性肿瘤为正例,则:

模型 A: 预测对了 3 个恶性肿瘤样本,4 个良性肿瘤样本

  1. 真正例 TP 为:3
  2. 伪反例 FN 为:3
  3. 假正例 FP 为:0
  4. 真反例 TN:4
  5. 精准率:3/(3+0) = 100%
  6. 召回率:3/(3+3)=50%

模型 B: 预测对了 6 个恶性肿瘤样本,1个良性肿瘤样本

  1. 真正例 TP 为:6
  2. 伪反例 FN 为:0
  3. 假正例 FP 为:3
  4. 真反例 TN:1
  5. 精准率:6/(6+3) = 67%
  6. 召回率:6/(6+0)= 100%

F1-score

如果我们对模型的精度、召回率都有要求,希望知道模型在这两个评估方向的综合预测能力如何?则可以使用 F1-score 指标。在这里插入图片描述
样本集中有 6 个恶性肿瘤样本,4 个良性肿瘤样本,我们假设恶性肿瘤为正例,则:

模型 A: 预测对了 3 个恶性肿瘤样本,4 个良性肿瘤样本

  1. 真正例 TP 为:3
  2. 伪反例 FN 为:3
  3. 假正例 FP 为:0
  4. 真反例 TN:4
  5. 精准率:3/(3+0) = 100%
  6. 召回率:3/(3+3)=50%
  7. F1-score:(2*3)/(2*3+3+0)=67%

模型 B: 预测对了 6 个恶性肿瘤样本,1个良性肿瘤样本

  1. 真正例 TP 为:6
  2. 伪反例 FN 为:0
  3. 假正例 FP 为:3
  4. 真反例 TN:1
  5. 精准率:6/(6+3) = 67%
  6. 召回率:6/(6+0)= 100%
  7. F1-score:(2*6)/(2*6+0+3)=80%

ROC曲线和AUC指标

ROC 曲线

ROC 曲线:我们分别考虑正负样本的情况:

  1. 正样本中被预测为正样本的概率,即:TPR (True Positive Rate)

  2. 负样本中被预测为正样本的概率,即:FPR (False Positive Rate)在这里插入图片描述
    ROC 曲线图像中,4 个特殊点的含义:

  3. (0, 0) 表示所有的正样本都预测为错误,所有的负样本都预测正确

  4. (1, 0) 表示所有的正样本都预测错误,所有的负样本都预测错误

  5. (1, 1) 表示所有的正样本都预测正确,所有的负样本都预测错误

  6. (0, 1) 表示所有的正样本都预测正确,所有的负样本都预测正确

绘制 ROC 曲线

假设:在网页某个位置有一个广告图片或者文字,该广告共被展示了 6 次,有 2 次被浏览者点击了。每次点击的概率如下:

样本是否被点击预测点击概率
110.9
200.7
310.8
400.6
500.5
600.4

根据预测点击概率排序之后:

样本是否被点击预测点击概率
110.9
310.8
200.7
400.6
500.5
600.4

绘制 ROC 曲线:

阈值:0.9

  1. 原本为正例的 1、3 号的样本中 3 号样本被分类错误,则 TPR = 1/2 = 0.5
  2. 原本为负例的 2、4、5、6 号样本没有一个被分为正例,则 FPR = 0

阈值:0.8

  1. 原本为正例的 1、3 号样本被分类正确,则 TPR = 2/2 = 1
  2. 原本为负例的 2、4、5、6 号样本没有一个被分为正例,则 FPR = 0

阈值:0.7

  1. 原本为正例的 1、3 号样本被分类正确,则 TPR = 2/2 = 1
  2. 原本为负类的 2、4、5、6 号样本中 2 号样本被分类错误,则 FPR = 1/4 = 0.25

阈值:0.6

  1. 原本为正例的 1、3 号样本被分类正确,则 TPR = 2/2 = 1
  2. 原本为负类的 2、4、5、6 号样本中 2、4 号样本被分类错误,则 FPR = 2/4 = 0.5

阈值:0.5

  1. 原本为正例的 1、3 号样本被分类正确,则 TPR = 2/2 = 1
  2. 原本为负类的 2、4、5、6 号样本中 2、4、5 号样本被分类错误,则 FPR = 3/4 = 0.75

阈值 0.4

  1. 原本为正例的 1、3 号样本被分类正确,则 TPR = 2/2 = 1
  2. 原本为负类的 2、4、5、6 号样本全部被分类错误,则 FPR = 4/4 = 1

(0, 0.5)、(0, 1)、(0.25, 1)、(0.5, 1)、(0.75, 1)、(1, 1)

由 TPR 和 FPR 构成的 ROC 图像为:在这里插入图片描述

AUC 值
  1. 我们发现:图像越靠近 (0,1) 点则模型对正负样本的辨别能力就越强
  2. 我们发现:图像越靠近 (0, 1) 点则 ROC 曲线下面的面积就会越大
  3. AUC 是 ROC 曲线下面的面积,该值越大,则模型的辨别能力就越强
  4. AUC 范围在 [0, 1] 之间
  5. 当 AUC= 1 时,该模型被认为是完美的分类器,但是几乎不存在完美分类器

AUC 值主要评估模型对正例样本、负例样本的辨别能力.

分类评估报告api
sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )
  '''
  y_true:真实目标值
  y_pred:估计器预测目标值
  labels:指定类别对应的数字
  target_names:目标类别名称
  return:每个类别精确率与召回率
  '''
AUC计算API
from sklearn.metrics import roc_auc_score
  sklearn.metrics.roc_auc_score(y_true, y_score)
    计算ROC曲线面积,即AUC值
    y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
    y_score:预测得分,可以是正例的估计概率、置信值或者分类器方法的返回值

【实践】电信客户流失预测

学习目标:

1.了解案例的背景信息

2.知道案例的处理流程

3.动手实现电信客户流失案例的代码

数据集介绍

  • 流失用户指的使用过产品因为某些原因不再使用该产品。随着产品的更新迭代,都会存在一定的流失情况,这时正常现象。流失用户的比例和变化趋势能够反映该产品当前是否存在问题以及未来的发展趋势。
  • 当用户群体庞大时,有限的人力和精力不能为每个用户都投入大量的时间。如果公司可以预测哪些用户可能提前流失,这样就能将主要精力聚焦于这些用户,实施有效的用户挽留策略,提高用户粘性。
  • 本项目旨在通过分析特征属性确定用户流失的原因,以及哪些因素可能导致用户流失。建立预测模型来判断用户是否流失,并提出用户流失预警策略。
  • 具体数据说明如下:数据集中总计7043条数据,21个特征字段,最终分类特征为Churn:用户是否流失,具体内容如下所示:
    customerID:用户ID
    gender:性别
    SeniorCitizen:是否是老人
    Partner:是否有伴侣
    Dependents:是否有需要抚养的孩子
    tenure:任职
    PhoneService:是否办理电话服务
    MultipleLines:是否开通了多条线路
    InternetService:是否开通网络服务和开通的服务类型(光纤、电话拨号)
    TechSupport:是否办理技术支持服务
    OnlineBackup:是否办理在线备份服务
    OnlineSecurity:是否办理在线安全服务
    DeviceProtection:是否办理设备保护服务
    StreamingTV:是否办理电视服务
    StreamingMovies:是否办理电影服务
    Contract:签订合约的时长
    PaperlessBilling:是否申请了无纸化账单
    PaymentMethod:付款方式(电子支票、邮寄支票、银行自动转账、信用卡自动转账)
    MonthlyCharges:月消费
    TotalCharges:总消费
    Churn:用户是否流失

处理流程

1、数据基本处理

查看数据的基本信息

​ 对类别数据数据进行one-hot处理

​ 查看标签分布情况

2、特征筛选

​ 分析哪些特征对标签值影响大

​ 初步筛选出对标签影响比较大的特征,形成x、y

3、模型训练

​ 模型训练

​ 交叉验证网格搜索等

4、模型评估

​ 精确率

​ Roc_AUC指标计算

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


# 1. 定义函数, 表示: 数据基本处理
def dm01_数据基本处理():
    # 1. 读取数据, 查看数据的基本信息.
    churn_pd = pd.read_csv('data/churn.csv')
    # churn_pd.info()
    # print(f'churn_pd.describe(): {churn_pd.describe()}')
    # print(f'churn_pd: {churn_pd}')

    # 2. 处理类别型的数据, 类别型数据做 one-hot编码(热编码).
    churn_pd = pd.get_dummies(churn_pd)
    churn_pd.info()
    # print(f'churn_pd: {churn_pd}')

    # 3. 去除列 Churn_No, gender_Male
    churn_pd.drop(['Churn_No', 'gender_Male'], axis=1, inplace=True)  # 按列删除
    print(f'churn_pd: {churn_pd}')

    # 4. 列标签重命名, 打印列名
    churn_pd.rename(columns={'Churn_Yes': 'flag'}, inplace=True)
    print(f'列名: {churn_pd.columns}')

    # 5. 查看标签的分布情况 0.26用户流失
    value_counts = churn_pd.flag.value_counts()
    print(value_counts)


# 2. 定义函数, 表示: 特征筛选
def dm02_特征筛选():
    # 1. 读取数据
    churn_pd = pd.read_csv('data/churn.csv')
    # 2. 处理类别型的数据, 类别型数据做 one-hot编码(热编码).
    churn_pd = pd.get_dummies(churn_pd)
    # 3. 去除列 Churn_No, gender_Male
    churn_pd.drop(['Churn_No', 'gender_Male'], axis=1, inplace=True)
    # 4. 列标签重命名
    churn_pd.rename(columns={'Churn_Yes': 'flag'}, inplace=True)
    # 5. 查看标签的分布情况
    value_counts = churn_pd.flag.value_counts()
    print(value_counts)
    # 6. 查看Contract_Month 是否预签约流失情况
    sns.countplot(data=churn_pd, x='Contract_Month', hue='flag')
    plt.show()


# 3. 定义函数, 表示: 模型训练 和 评测
def dm03_模型训练和评测():
    # 1. 读取数据
    churn_pd = pd.read_csv('data/churn.csv')

    # 2. 数据预处理
    # 2.1 处理类别型的数据, 类别型数据做 one-hot编码(热编码).
    churn_pd = pd.get_dummies(churn_pd)
    # 2.2 去除列 Churn_No, gender_Male
    churn_pd.drop(['Churn_No', 'gender_Male'], axis=1, inplace=True)
    # 2.3 列标签重命名
    churn_pd.rename(columns={'Churn_Yes': 'flag'}, inplace=True)

    # 3. 特征处理.
    # 3.1 提取特征和标签
    x = churn_pd[['Contract_Month', 'internet_other', 'PaymentElectronic']]
    y = churn_pd['flag']
    # 3.2 训练集和测试集的分割
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=21)

    # 4. 模型训练.
    estimator = LogisticRegression()
    estimator.fit(x_train, y_train)

    # 5. 模型预测
    y_predict = estimator.predict(x_test)
    print(f'预测结果: {y_predict}')

    # 6. 模型评估
    print(f'准确率: {accuracy_score(y_test, y_predict)}')
    print(f'准确率: {estimator.score(x_test, y_test)}')

    # 计算值.
    print(f'AUC值: {roc_auc_score(y_test, y_predict)}')



if __name__ == '__main__':
    # dm01_数据基本处理()
    # dm02_特征筛选()
    dm03_模型训练和评测()

坚持分享 共同进步


http://www.kler.cn/a/464601.html

相关文章:

  • 密钥管理系统在数据安全解决方案中的重要性
  • 【工具整理】WIN换MAC机器使用工具整理
  • HTML——66.单选框
  • 【顶刊TPAMI 2025】多头编码(MHE)之Part 6:极限分类无需预处理
  • aws(学习笔记第二十二课) 复杂的lambda应用程序(python zip打包)
  • pandas-栗子
  • @Data
  • 关于Flutter应用国际化语言的设置
  • 复合机器人正以其高效、精准、灵活的特点,逐渐在汽车装配线上崭露头角
  • 使用XGBoost算法进行机器学习任务:从理论到实践
  • 树莓派之旅-在wsl-x86-64 上进行树莓派的交叉编译
  • 戴尔/Dell 电脑按什么快捷键可以进入 Bios 设置界面?
  • pyspark执行group by操作
  • df.drop()
  • 【剪映绿化版】剪映免费绿色版,全部功能可用
  • Centos7中安装X11vnc
  • 基于 GPUTasker 的 GPU 使用情况钉钉推送机器人实现
  • 基于Springboot + vue实现的校园周边美食探索及分享平台
  • scrapy 教程
  • 【论文+源码】基于Spring和Spring MVC的汉服文化宣传网站
  • Excel 身份证号计算年龄
  • super_vlan
  • 基于springboot的社区维修平台
  • 【Go学习】-01-2-常见类型及关键字
  • 我的线代观-秩(向量,矩阵)
  • 船用能源管理系统:绿色航运的未来之匙