贝叶斯分类器(公式推导+举例应用)

这篇具有很好参考价值的文章主要介绍了贝叶斯分类器(公式推导+举例应用)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

在机器学习的世界中,有一类强大而受欢迎的算法——贝叶斯分类器,它倚仗着贝叶斯定理和朴素的独立性假设,成为解决分类问题的得力工具。这种算法的独特之处在于其对概率的建模,使得它在面对不确定性和大规模特征空间时表现卓越。

本文将深入探讨贝叶斯分类器,首先通过详细的公式推导带你走进其内部机制,随后通过实际案例展示其在各个领域的广泛应用。

贝叶斯决策论

贝叶斯决策论是一种基于概率论和决策理论的决策框架,其核心思想是通过最大化期望效用来做出最优的决策。该理论的基础是贝叶斯定理,它将不确定性引入决策过程中,特别适用于需要考虑不确定性因素的问题。

假设有 N N N种可能的类别标记,即 y = { c 1 , c 2 , . . . , c N } y=\{c_1,c_2,...,c_N\} y={c1,c2,...,cN} λ i j \lambda_{ij} λij是将一个真实标记为 c j c_j cj的样本误分类为 c i c_i ci所产生的损失。基于后验概率 P ( c i ∣ x ) P(c_i|x) P(cix)可获得将样本 x x x分类为 c i c_i ci所产生的期望损失,即样本 x x x上的条件风险
R ( c i ∣ x ) = ∑ j = 1 N λ i j P ( c j ∣ x ) (1) R(c_i|x)=\sum_{j=1}^N\lambda_{ij}P(c_j|x) \tag{1} R(cix)=j=1NλijP(cjx)(1)

我们的任务是寻找一个判定准则 h : χ ↦ y h:\chi\mapsto y h:χy以最小化总体风险:
R ( h ) = E [ R ( h ( x ) ∣ x ) ] (2) R(h)=\mathbb{E}[R(h(x)|x)] \tag{2} R(h)=E[R(h(x)x)](2)
其中 E \mathbb{E} E表示期望值。显然,对于每个样本 x x x,若 h h h能最小化条件风险 R ( h ( x ) ∣ x ) R(h(x)|x) R(h(x)x),则总体的 R ( h ) R(h) R(h)也将会被最小化。

贝叶斯判定准则:为最小化总体风险,只需在每个样本上选择那个能使条件风险 R ( c ∣ x ) R(c|x) R(cx)最小的类别标记,即:
h ⋆ ( x ) = a r g c ∈ y m i n   R ( c ∣ x ) (3) h^\star(x)=arg_{c\in y} \quad min\ R(c|x) \tag{3} h(x)=argcymin R(cx)(3)

此时, h ⋆ h^\star h称为贝叶斯最优分类器,与之对应的总体风险 R ( h ⋆ ) R(h^\star) R(h)称为贝叶斯风险。 1 − R ( h ⋆ ) 1-R(h^\star) 1R(h)反映了分类器所能达到的最好性能。

具体来说,若目标是最小化分类错误率,则误判损失 λ i j \lambda_{ij} λij可写为:
λ i j = { 0 , i f   i = j 1 , o t h e r w i s e (4) \lambda_{ij}= \begin{cases} 0,\quad if \ i=j\\ 1, \quad otherwise \end{cases} \tag{4} λij={0,if i=j1,otherwise(4)
此时条件风险:
R ( c ∣ x ) = 1 − P ( c ∣ x ) (5) R(c|x)=1-P(c|x) \tag{5} R(cx)=1P(cx)(5)

于是最小化分类错误率的贝叶斯分类器为:
h ⋆ ( x ) = a r g c ∈ y m a x   P ( c ∣ x ) (6) h^\star(x)=arg_{c\in y} \quad max\ P(c|x) \tag{6} h(x)=argcymax P(cx)(6)

即对每个样本 x x x,选择能使后验概率 P ( c ∣ x ) P(c|x) P(cx)最大的类别标记。

然而在现实任务中,我们很难得到后验概率 P ( c ∣ x ) P(c|x) P(cx)

自此我们有两种策略:

  • 判别式模型:给定 x x x,可通过直接建模 P ( c ∣ x ) P(c|x) P(cx)来预测 c c c
  • 生成式模型:对联合概率分布 P ( x , c ) P(x,c) P(x,c)建模,然后再由此获得 P ( c ∣ x ) P(c|x) P(cx)

显然对于生成式模型来说,需考虑:
P ( c ∣ x ) = P ( x , c ) P ( x ) (7) P(c|x)=\frac{P(x,c)}{P(x)} \tag{7} P(cx)=P(x)P(x,c)(7)

基于贝叶斯定理, P ( c ∣ x ) P(c|x) P(cx)可写为:
P ( c ∣ x ) = P ( c ) P ( x ∣ c ) P ( x ) (8) P(c|x)=\frac{P(c)P(x|c)}{P(x)} \tag{8} P(cx)=P(x)P(c)P(xc)(8)

因此估计 P ( c ∣ x ) P(c|x) P(cx)的问题就转化为如何基于训练数据 D D D来估计先验概率 P ( c ) P(c) P(c)和似然 P ( x ∣ c ) P(x|c) P(xc)

先验概率和后验概率

先验概率(Prior Probability)

先验概率是在考虑任何观测数据之前,对事件的概率进行估计。它是基于以往经验、领域知识或其他信息得出的概率。符号通常表示为 P ( A ) P(A) P(A),其中 A A A是事件。先验概率反映了在考虑新观测数据之前我们对事件的信念。

后验概率(Posterior Probability)

后验概率是在考虑了新的观测数据之后,对事件的概率进行修正的概率。它是基于先验概率和新观测数据的联合影响得出的概率,使用贝叶斯定理计算。符号通常表示为 P ( A ∣ B ) P(A|B) P(AB),其中 A A A是事件, B B B是观测数据。后验概率反映了在获得新信息后我们对事件的修正信念。

让我们通过一个简单的例子来生动形象地描述先验概率和后验概率的概念。
场景:病人的健康检查

  • 先验概率的理解: 假设有一个医生,他的病人群体中,有 10% 的人患有某种疾病(事件 A A A)。这个 10% 的患病率是基于医生以往的经验和病历统计得到的。在这里,患病率 10% 就是先验概率 P ( A ) P(A) P(A)
  • **后验概率的理解:**现在,该医生对一位新的病人进行了检查,得到了一些特定的症状(事件 B B B)。在这个特定的病人身上,这些症状出现的概率是多少呢?这就是后验概率 P ( A ∣ B ) P(A|B) P(AB)

使用贝叶斯定理,医生可以更新他的信念。假设在已知患病率为 10% 的情况下,症状出现的概率为 80%(这是似然度 P ( B ∣ A ) P(B|A) P(BA)),而病人患有该疾病的概率就可以通过贝叶斯定理计算。
P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A|B)=\frac{P(B|A)P(A)}{P(B)} P(AB)=P(B)P(BA)P(A)
这里, P ( B ) P(B) P(B)表示症状出现的概率,可以通过考虑所有可能情况来计算。例如,患病且出现症状的情况和不患病但出现症状的情况。
医生通过这个计算,得到了在考虑了新的症状后,病人患有该疾病的后验概率。这个后验概率可以帮助医生更准确地评估病人的健康状况,这就是后验概率的概念。

极大似然估计

极大似然估计(Maximum Likelihood Estimation,简称MLE)是一种常用的参数估计方法,用于估计统计模型中的参数。该方法基于观测到的数据,寻找使得观测到这些数据的概率最大的模型参数。

具体的,记关于类别 c c c的类条件概率为 P ( x ∣ c ) P(x|c) P(xc),假设 P ( x ∣ c ) P(x|c) P(xc)具有确定的形式且被参数向量 θ c \theta_c θc唯一确定,则我们的任务就是利用训练集 D D D估计参数 θ c \theta_c θc。为明确起见,我们将 P ( x ∣ c ) P(x|c) P(xc)记为 P ( x ∣ θ c ) P(x|\theta_c) P(xθc)

D c D_c Dc表示训练集 D D D中的第三 c c c类样本组成的集合,假设他们都是独立同分布的,则参数 θ c \theta_c θc对于数据集 D c D_c Dc的似然是:
P ( D c ∣ θ c ) = ∏ x ∈ D c P ( x ∣ θ c ) (9) P(D_c|\theta_c)=\prod_{x\in D_c}P(x|\theta_c) \tag{9} P(Dcθc)=xDcP(xθc)(9)

θ c \theta_c θc进行极大似然估计,就是去寻找能最大化似然 P ( D c ∣ θ c ) P(D_c|\theta_c) P(Dcθc)的参数值 θ ^ c \hat \theta_c θ^c。从直观上讲,极大似然估计就是寻找在所有取值中,最大的一个 θ ^ c \hat \theta_c θ^c

式(9)中连乘会导致下溢,通常使用对数似然:
L L ( θ c ) = l o g P ( D c ∣ θ c ) = ∑ x ∈ D c l o g P ( x ∣ θ c ) (10) \begin{aligned} LL(\theta_c) &= logP(D_c|\theta_c) \\ &= \sum_{x\in D_c} logP(x|\theta_c) \end{aligned} \tag{10} LL(θc)=logP(Dcθc)=xDclogP(xθc)(10)

此时的参数 θ c \theta_c θc的极大似然估计 θ ^ c \hat \theta_c θ^c为:
θ ^ c = arg θ c   m a x   L L ( θ c ) (11) \begin{aligned} \hat \theta_c =&\underset{\theta_c}{\text{arg}} \ max\ LL(\theta_c) \end{aligned} \tag{11} θ^c=θcarg max LL(θc)(11)

朴素贝叶斯分类器

朴素贝叶斯分类器是一种基于贝叶斯定理的分类算法,它假设特征之间是相互独立的(朴素贝叶斯的"朴素"就体现在这里),并且使用了一些概率统计的方法进行分类。它广泛应用于文本分类、垃圾邮件过滤、情感分析等领域。

基于属性条件独立性假设,式(8)可重写为:
P ( c ∣ x ) = P ( c ) P ( x ∣ c ) P ( x ) = P ( c ) P ( x ) ∏ i = 1 d P ( x i ∣ c ) (12) P(c|x)=\frac{P(c)P(x|c)}{P(x)}=\frac{P(c)}{P(x)}\prod_{i=1}^dP(x_i|c) \tag{12} P(cx)=P(x)P(c)P(xc)=P(x)P(c)i=1dP(xic)(12)

其中 d d d为属性数目, x i x_i xi x x x在第 i i i个属性上的取值。

由于对于所有类别来说 P ( x ) P(x) P(x)相同,因此基于式(6)的贝叶斯判定准则有:
h n b ( x ) = arg c ∈ y   m a x   P ( c ) ∏ i = 1 d P ( x i ∣ c ) (13) \begin{aligned} h_{nb}(x) =&\underset{c \in y}{\text{arg}} \ max\ P(c)\prod_{i=1}^dP(x_i|c) \end{aligned} \tag{13} hnb(x)=cyarg max P(c)i=1dP(xic)(13)

这就是朴素贝叶斯分类器的表达式。

D c D_c Dc表示训练集 D D D中第 c c c类样本组成的集合,若有充足的独立同分布样本,则可容易地估计出类先验概率:
P ( c ) = ∣ D c ∣ ∣ D ∣ (14) P(c)=\frac{|D_c|}{|D|} \tag{14} P(c)=DDc(14)

现在我们估计似然 P ( x i ∣ c ) P(x_i|c) P(xic)

  • 对于离散数据而言:令 D c , x i D_{c,x_i} Dc,xi表示 D c D_c Dc中的第 i i i个属性上取值为 x I x_I xI的样本组成的集合,则条件概率 P ( x i ∣ c ) P(x_i|c) P(xic)可估计为:
    P ( x i ∣ c ) = ∣ D c , x i ∣ ∣ D c ∣ (15) P(x_i|c)=\frac{|D_{c,x_i}|}{|D_c|} \tag{15} P(xic)=DcDc,xi(15)
  • 对于连续数据而言:可以考虑概率密度,假定 p ( x i , c ) ∼ N ( μ c , i , σ c , i 2 ) p(x_i,c)\sim N(\mu_{c,i},\sigma_{c,i}^2) p(xi,c)N(μc,i,σc,i2),即 p ( x i , c ) p(x_i,c) p(xi,c)服从均值为 μ c , i \mu_{c,i} μc,i,方差为 σ c , i 2 \sigma_{c,i}^2 σc,i2的正态分布,则有:
    p ( x i , c ) = 1 2 π σ c , i e − ( x i − μ c , i ) 2 2 σ c , i 2 (16) p(x_i,c)=\frac{1}{\sqrt{2\pi}\sigma_{c,i}}e^{-\frac{(x_i-\mu_{c,i})^2}{2\sigma_{c,i}^2}}\tag{16} p(xi,c)=2π σc,i1e2σc,i2(xiμc,i)2(16)

朴素贝叶斯分类器的优点与缺点

优点
  • 朴素贝叶斯算法简单,易于实现。
  • 在处理大规模数据集时表现良好。
  • 在特征之间相对独立的情况下,效果良好。
缺点
  • 对于特征之间相关性较强的数据,朴素贝叶斯可能表现不佳。
  • 对于缺失数据的处理相对较为复杂。

总体而言,朴素贝叶斯分类器在许多实际应用中表现良好,特别是在文本分类等领域。

总结

在本文中,我们深入探讨了贝叶斯分类器及其相关概念。首先,我们通过详细的公式推导介绍了贝叶斯决策论,阐述了其基于概率和决策理论的决策框架。接着,我们讨论了贝叶斯定理的先验概率和后验概率,通过生动的例子说明了这两个概念的重要性和应用场景。

随后,我们转向了极大似然估计,解释了在统计模型中使用观测数据来估计参数的方法。通过推导极大似然估计的基本原理,我们理解了其在模型参数估计中的重要性。

最后,我们详细介绍了朴素贝叶斯分类器,阐述了其基于贝叶斯定理和属性条件独立性假设的工作原理。我们还探讨了朴素贝叶斯分类器的优点和缺点,以及其在实际应用中的广泛使用,特别是在文本分类等领域。

总体而言,贝叶斯分类器作为一种强大而灵活的机器学习算法,在不同领域展现出了卓越的性能。通过深入了解其原理和应用,我们能够更好地理解和利用这一算法来解决实际问题。希望本文能够为读者提供清晰的认识,并激发对贝叶斯分类器更深层次研究的兴趣。

实验分析

判断一封邮件是否为垃圾邮件。

import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report

# 读入数据集
df = pd.read_csv('data/spam_or_not_spam.csv')

贝叶斯分类器(公式推导+举例应用),机器学习,机器学习,分类
训练朴素贝叶斯分类器

# 先去除包含 NaN 值的行
df = df.dropna(subset=['email', 'label'])

X = df['email']
y = df['label']

# 文本转词袋模型
vectorizer = CountVectorizer(stop_words='english')
X = vectorizer.fit_transform(X)

# 数据拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练朴素贝叶斯分类器
nb_classifier = MultinomialNB()
nb_classifier.fit(X_train, y_train)

# 预测
y_pred = nb_classifier.predict(X_test)
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

# 模型评估
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred)

print(f"Accuracy: {accuracy}")
print("Classification Report:\n", report)

# 设置中文字体
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=12)
plt.rcParams['font.sans-serif'] = ['SimSun']  # 设置字体为宋体

# 生成混淆矩阵
cm = confusion_matrix(y_test, y_pred)

# 绘制混淆矩阵图
plt.figure(figsize=(8, 6))
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['非垃圾邮件', '垃圾邮件'])
disp.plot(cmap=plt.cm.Blues)
plt.title('混淆矩阵', fontproperties=font)
plt.show()

# 生成 ROC 曲线
y_probs = nb_classifier.predict_proba(X_test)[:, 1]
fpr, tpr, _ = roc_curve(y_test, y_probs)
roc_auc = auc(fpr, tpr)

# 绘制 ROC 曲线图
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC 曲线(面积 = {:.2f})'.format(roc_auc))
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlabel('假正率', fontproperties=font)
plt.ylabel('真正率', fontproperties=font)
plt.title('接收者操作特征曲线 (ROC) 曲线', fontproperties=font)
plt.legend(loc='lower right')
plt.show()
Accuracy: 0.9916666666666667
Classification Report:
               precision    recall  f1-score   support

           0       0.99      1.00      1.00       500
           1       1.00      0.95      0.97       100

    accuracy                           0.99       600
   macro avg       1.00      0.97      0.98       600
weighted avg       0.99      0.99      0.99       600

贝叶斯分类器(公式推导+举例应用),机器学习,机器学习,分类
贝叶斯分类器(公式推导+举例应用),机器学习,机器学习,分类

  1. 准确度(Accuracy): 0.9917,表示模型在整体上正确预测的比例。这是一个很高的准确度,说明模型在测试数据上的表现非常好。

  2. 分类报告(Classification Report):

  • 对于类别 0(非垃圾邮件):
    • 精确度(Precision):0.99,表示在所有模型预测为非垃圾邮件的样本中,实际上有 99% 是正确的。
    • 召回率(Recall):1.00,表示在所有实际非垃圾邮件的样本中,模型成功预测的比例为 100%。
    • F1 分数(F1-score):1.00,是精确度和召回率的调和平均值,综合考虑了两者。
    • 支持度(Support):500,表示测试集中实际为非垃圾邮件的样本数量。
  • 对于类别 1(垃圾邮件):
    • 精确度:1.00,表示在所有模型预测为垃圾邮件的样本中,实际上有 100% 是正确的。
    • 召回率:0.95,表示在所有实际垃圾邮件的样本中,模型成功预测的比例为 95%。
    • F1 分数:0.97,是精确度和召回率的调和平均值,综合考虑了两者。
    • 支持度:100,表示测试集中实际为垃圾邮件的样本数量。
  1. 加权平均(weighted avg): 这是对各类别指标进行加权平均,考虑到每个类别的支持度。在这里,加权平均的准确度、精确度、召回率和 F1 分数都达到了 0.99。

  2. 宏平均(macro avg): 这是对各类别指标取平均,不考虑各类别的支持度。在这里,宏平均的准确度、精确度、召回率和 F1 分数分别为 1.00、0.97、1.00 和 0.98。

总体来说,模型在非垃圾邮件的预测上表现非常好,而在垃圾邮件的预测上稍微有些降低,主要体现在垃圾邮件的召回率上。综合考虑各指标,模型在整体上仍然表现出色。文章来源地址https://www.toymoban.com/news/detail-811584.html

到了这里,关于贝叶斯分类器(公式推导+举例应用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [学习笔记] [机器学习] 9. 朴素贝叶斯(概率基础、联合概率、条件概率、贝叶斯公式、情感分析)

    视频链接 数据集下载地址:无需下载 学习目标: 4. 说明条件概率与联合概率 5. 说明贝叶斯公式、以及特征独立的关系 6. 记忆贝叶斯公式 7. 知道拉普拉斯平滑系数 8. 应用贝叶斯公式实现概率的计算 9. 会使用朴素贝叶斯对商品评论进行情感分析 朴素贝叶斯算法主要还是用来

    2024年02月09日
    浏览(44)
  • AI-应试-机器学习公式推导与代码实现-预备

    (AI算法系列) 机器学习 背景 训练过程 应用场景 局限及挑战 未来 2.1机器学习 模型:要学习的决策函数或条件概率分布 策略:决定按什么标准选最优模型-》loss 分类:对数、交叉熵 回归:均方 算法:具体的优化求解算法:梯度下降、牛顿法、拟牛顿法 2.2 核心:从数据中最

    2024年02月03日
    浏览(51)
  • 机器学习算法——贝叶斯分类器3(朴素贝叶斯分类器)

    基于贝叶斯公式来估计后验概率P(c|x)的主要困难在于:类条件概率P(x|c)是所有属性上的联合概率,难以从有限的训练样本直接估计而得。 为避开这个障碍,朴素贝叶斯分类器(Naive Bayes classfier)采用了“ 属性条件独立性假设 ”:对已知类别,假设所有属性相互独立。换句话

    2023年04月22日
    浏览(56)
  • 机器学习--朴素贝叶斯分类器

    第1关:条件概率 什么是条件概率 概率指的是某一事件 A 发生的可能性,表示为 P(A) 。而条件概率指的是某一事件 A 已经发生了条件下,另一事件 B 发生的可能性,表示为 P(B|A) ,举个例子: 今天有 25% 的可能性下雨,即 P(下雨)=0.25 ; 今天 75% 的可能性是晴天,即 P(晴天)=0.7

    2024年02月08日
    浏览(59)
  • 机器学习期末复习 贝叶斯分类器

    先验概率: 对于某一个概率事件,我们都会有基于自己已有的知识,对于这个概率事件会分别以什么概率出现各种结果会有一个预先的估计,而这个估计并未考虑到任何相关因素。 对于分类数据来说,先验概率就是取某一类的概率。 (基于自己已有的知识-已有的数据) (

    2024年02月06日
    浏览(43)
  • 机器学习实验 - 朴素贝叶斯分类器

    报告内容仅供学习参考,请独立完成作业和实验喔~ 1.1 实验要求 (1)了解朴素贝叶斯与半朴素贝叶斯的区别与联系,掌握高斯分布、多项式分布和伯努利分布的朴素贝叶斯计算方法。 (2)编程实现朴素贝叶斯分类器,基于多分类数据集,使用朴素贝叶斯分类器实现多分类预

    2024年02月09日
    浏览(51)
  • 机器学习——基于朴素贝叶斯分类算法实现垃圾邮件分类

    贝叶斯定理: 贝叶斯理论指的是,根据一个已发生事件的概率,计算另一个事件的发生概率。贝叶斯理论从数学上的表示可以写成这样:  ,在这里A和B都是事件, P(B)P(B)不为0。 在贝叶斯定理中: 1. P(A) 称为”先验概率”,即在B事件发生之前,我们对A事件概率的一个判断。如

    2024年02月04日
    浏览(51)
  • 机器学习——朴素贝叶斯算法(垃圾邮件分类)

    先验概率 :指的是 事件发生前 的预判概率,可以根据历史数据/经验估算得到。例如,当我们需要判断西瓜是不是好瓜的时候,对纹理、根蒂等特征都不了解,只是平常我们买西瓜的时候买到好瓜的概率是70%,那么这个西瓜是好瓜的概率我们也可以认为是70%。这个概率70%就是

    2024年02月03日
    浏览(57)
  • 机器学习笔记07---朴素贝叶斯分类器

    贝叶斯决策论是概率框架下实施决策的基本方法。对分类任务来说,在所有相关概率都已知的理想情形下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。     贝叶斯公式:  其中,P(c)是类\\\"先验\\\"概率;P(x|c)是样本x相对于类标记c的类条件概率,或称

    2024年02月07日
    浏览(60)
  • 【机器学习】分类算法 - 朴素贝叶斯 MultinomialNB

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 md5() 可以计算字符串的 「MD5散列值」 。 语法 参数 $str :需要计算的字符串

    2024年02月14日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包