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

文章目录

      • 引言
      • 贝叶斯决策论
      • 先验概率和后验概率
      • 极大似然估计
      • 朴素贝叶斯分类器
      • 朴素贝叶斯分类器的优点与缺点
        • 优点
        • 缺点
      • 总结
      • 实验分析

引言

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

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

贝叶斯决策论

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

假设有 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。

总体来说,模型在非垃圾邮件的预测上表现非常好,而在垃圾邮件的预测上稍微有些降低,主要体现在垃圾邮件的召回率上。综合考虑各指标,模型在整体上仍然表现出色。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

fisco-bcos部署pro生产版本

我这里使用的 Ubuntu20.4系统,linux系统把操作命令apt改为yum即可 升级安装包 apt-get update 安装jdk,我这里使用jdk17 apt -y install openjdk-17-jdk-headless 查看java版本 java -version 安装依赖 apt-get install -y curl docker.io docker-com…

关于React你必须知道的3个错误用法。

1. 你知道如何使用“&&”吗? 在React程序中,我经常使用“&&”运算符来决定是否显示内容,如下所示: 我的组长: “你不知道&&运算符的特性吗?当请求还没有成功返回时,会直接渲染“0”。” 我并不信服, 因为我一直都是这样编写代码,从未出过错。为了…

详解CAS及ABA问题

🌈🌈🌈今天给大家分享的是 CAS 问题。 清风的CSDN博客 🛩️🛩️🛩️希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! ✈️✈️✈️动动…

代码随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期 、714.买卖股票的最佳时机含手续费

代码随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期 、714.买卖股票的最佳时机含手续费 最佳买卖股票时机含冷冻期 309.最佳买卖股票时机含冷冻期 文章讲解:https://programmercarl.com/0309.%E6%9C%80%E4%BD%B3%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%…

U盘安装XP纯净版系统教程软件安装教程(附软件下载地址)

软件简介: 软件【下载地址】获取方式见文末。注:推荐使用,更贴合此安装方法! U盘安装XP纯净版系统是一种便捷且快速的方式,以实现系统重装或升级的需求。这篇教程将为您详细介绍如何使用U盘来安装XP纯净版系统。XP纯…

前端面试题集合七(ES6、ES7、ES8、ES9、ES10、ES11、ES12)

ES6(2015) 1. 类(class) class Man {constructor(name) {this.name 小豪;}console() {console.log(this.name);} } const man new Man(小豪); man.console(); // 小豪 2. 模块化(ES Module) // 模块 A 导出一个方法 export …

Spring创建的单例对象,存在线程安全问题吗?

这个问题涉及到Spring框架中的Bean的作用域、单例模式的线程安全性以及如何判断和处理线程安全问题。让我们一步步深入探讨这些概念。 Spring Bean的作用域 Spring提供了几种不同的Bean作用域,包括: 1、 Singleton(单例)&#x…

LeetCode刷题:142. 环形链表 II

题目: 是否独立解决:否,参考了解题思路解决问题,思考了用快慢指针,栈,统计链表数量定位尾巴节点(因为是环形链表所以是死循环,链表数量用while循环统计不出来)都没解决 解…

stm32 - 基础架构

stm32 - 基础架构 基础架构外设概念系统结构引脚定义晶振工程 基础架构 外设概念 NVIC (内核外设) SysTick (内核外设) 其他是片上外设 系统结构 内核引出三条总线 ICode 指令总线: 连接Flash闪存(编写的…

Netfilter 是如何工作的(六):连接跟踪信息的入口创建(in)和出口确认(confirm)

Articles (gitee.io) IPtables-朱双印博客 (zsythink.net) 在 Netfilter 是如何工作的(五) 中连接跟踪信息使用的创建-确认机制的 Netfilter在报文进入系统的入口处,将连接跟踪信息记录在报文上,在出口进行confirm.确认后的连接信息 本文以一个本机上送…

opencv3.4.12全景拼接

最近camera项目需要用到全景拼接,故此查阅大量资料,终于将此功能应用在实际项目上,下面总结一下此过程中遇到的一些问题及解决方式,同时也会将源码附在结尾处,供大家参考。 首先说一下此源码的大概执行流程&#xff0c…

阅读文献-胃癌

写在前面 今天先不阅读肺癌的了,先读一篇胃癌的文章 文献 An individualized stemness-related signature to predict prognosis and immunotherapy responses for gastric cancer using single-cell and bulk tissue transcriptomes IF:4.0 中科院分区:2区 医学…

行为型设计模式——备忘录模式

备忘录模式 备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,很多软件都提供了撤销(Undo)操作…

Ceph入门到精通-通过 CloudBerry Explorer 管理对象bucket

简介 CloudBerry Explorer 是一款可用于管理对象存储(Cloud Object Storage,COS)的客户端工具。通过 CloudBerry Explorer 可实现将 COS 挂载在 Windows 等操作系统上,方便用户访问、移动和管理 COS 文件。 支持系统 支持 Wind…

【动态规划】【滑动窗口】C++算法:3003 执行操作后的最大分割数量

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 C算法:滑动窗口总结 动态规划 LeetCode3003 执行操作后的最大分割数量 给你一个下标从 0 开始的字符串 s 和一个整数 k。 你需要执行以下分割操作,直到字符串 s 变为 空&#xff1…

如何开发测试框架?

基本概念 库 英文单词叫Library,库是由代码集合成的一个产品,供程序员调用。面向对象的代码组织形成的库叫类库,面向过程的代码组织形成的库叫函数库。 框架 英文单词叫Framework,框架是为解决一个或一类问题而开发的产品&#x…

【问题探讨】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究

目录 主要内容 模型研究 结果一览 下载链接 主要内容 该模型以环境保护成本和运行成本为双目标构建了微电网优化调度模型,模型目标函数和约束条件复现文献《基于改进粒子群算法的微电网多目标优化调度》,程序的特点是采用非支配排序的蜣螂…

Flutter-Web从0到部署上线(实践+埋坑)

本文字数:7743字 预计阅读时间:60分钟 01 前言 首先说明一下,这篇文章是给具备Flutter开发经验的客户端同学看的。Flutter 的诞生虽然来自 Google 的 Chrome 团队,但大家都知道 Flutter 最先支持的平台是 Android 和 iOS&#xff…

挖种子小游戏

欢迎来到程序小院 挖种子 玩法&#xff1a;看到种子点击鼠标左键进行挖种子&#xff0c;30秒内看你能够挖多少颗种子&#xff0c;快去挖种子吧^^。开始游戏https://www.ormcc.com/play/gameStart/251 html <canvas id"canvas" width"640" height"…

Docker五部曲之三:镜像构建

文章目录 前言Docker构建架构构建指令构建上下文本地目录Git存储库压缩文件纯文本文件.dockerignore文件 Dockerfile解析器指令环境变量命令执行格式exec格式shell格式 FROMRUNCMDLABELEXPOSEENVADDCOPYENTRYPOINTVOLUMEUSERWORKDIRARGONBUILDSHELL 多级构建 前言 本文均翻译自…