朴素贝叶斯的 “条件独立性假设”:打破假设的改进方案(贝叶斯网络实战)

终极算法【6】——贝叶斯学派 本质上,贝叶斯定理不仅仅是一个简单的规则,当你收到新的论据时,它用来改变你对某个假设的信任度:如果论据和假设一致,假设成立的概率上升,反之则下降。 如果我们观察一个即使没有该原因也会发生的结果,那么能肯定的是,该原因的证据力不足。贝叶斯通过以下句子概括了:P(原因|结果)随着P(结果),即结果的先验概率(也就是在原因不明的情况下结果出现的概率)的下降而下降。最终,其他条件不变,一个原因是前验的可... 阅读详情

朴素贝叶斯的 “条件独立性假设”:打破假设的改进方案(贝叶斯网络实战)

在机器学习的算法世界里,朴素贝叶斯(Naive Bayes)绝对是一个独特的存在。它简单、高效,仅凭基础的概率论知识就能构建出强大的分类器,在文本分类、垃圾邮件过滤等领域大放异彩。然而,它的名字也暗示了其最大的特点,甚至是“弱点”——“朴素”(Naive)。

这种“朴素”源于一个核心的、大胆的简化:条件独立性假设。简单来说,它天真地认为所有特征之间都是“老死不相往来”的,一个特征的出现与否,和其他任何特征都没有关系。比如在判断一封邮件是否为垃圾邮件时,它会认为“中奖”这个词的出现,和“免费”这个词的出现是两个完全独立的事件。

现实世界真是这样吗?显然不是。特征之间往往充满了千丝万缕的联系。这种过度的简化,虽然带来了计算上的便利,但在很多特征相关性很强的场景下,会严重影响模型的预测精度,让模型变得“头脑简单”。

那么,我们能否打破这个僵化的假设,教会模型去理解特征之间的复杂关系,让它从“天真”变得“智慧”呢?

答案是肯定的。而我们手中的利器,就是贝叶斯网络(Bayesian Network)。

在本篇教程中,你将跟随我,完成一次从理论到实践的飞跃。我们不仅会深入剖析“条件独立性假设”的本质,更将亲手用Python构建一个贝叶斯网络模型,去解决一个朴素贝叶斯难以胜任的真实世界问题。你将学会:

  • 是什么:直观理解朴素贝叶斯及其核心假设。
  • 为什么:明白为何这一假设在某些情况下会“失灵”。
  • 怎么做:从零开始,一步步搭建、训练并使用一个更强大的贝叶斯网络。

准备好了吗?让我们一起揭开概率图模型的神秘面纱,开启这段让模型变得更智能的旅程!

第一部分:重温朴素贝叶斯和它的“天真”之处

在“破”之前,我们得先“立”。让我们快速回顾一下朴素贝叶斯,看看它的基石究竟是什么。

1.1 温故知新:朴素贝叶斯的核心思想

朴素贝叶斯分类器的核心是贝叶斯定理,这个定理本身并不复杂,它描述了两个条件概率之间的关系。我们可以用一个生活化的例子来理解它。

假设你想根据天气来判断一个朋友是否会出门。我们有两个类别(出门,不出门),以及一些天气特征,比如天气状况(晴朗/下雨)、温度(炎热/寒冷)。

贝叶斯定理告诉我们:

P(出门 | 天气状况) = [ P(天气状况 | 出门) * P(出门) ] / P(天气状况)

翻译成大白话就是:

  • P(出门 | 天气状况) (后验概率):这是我们想知道的——在某种天气状况下,朋友出门的概率。
  • P(天气状况 | 出门) (似然度):在朋友出门的日子里,出现这种天气状况的概率是多少。
  • P(出门) (先验概率):不管天气如何,朋友本身出门的概率(比如他是个“宅男”还是“现眼包”)。
  • P(天气状况) (证据):这种天气状况在所有日子里出现的概率。

朴素贝叶斯分类器的工作流程就是:当来了一个新的天气数据(比如“晴朗”),我们分别计算他“出门”和“不出门”的后验概率,哪个概率大,就预测为哪个类别。

1.2 问题的根源:“条件独立性假设”

如果只有一个特征(天气状况),事情很简单。但如果有很多特征呢?比如还有温度、风力等。我们要计算的就是 P(出门 | 天气状况, 温度, 风力)。

根据概率论的链式法则,这个计算会非常复杂。为了简化计算,朴素贝叶斯做出了那个著名的假设:给定最终类别(比如“出门”),所有天气特征(天气状况, 温度, 风力)都是相互独立的。

这意味着 P(天气状况, 温度, 风力 | 出门) 可以被简化为 P(天气状况 | 出门) * P(温度 | 出门) * P(风力 | 出门)。计算量瞬间大大减少!

这个假设在模型结构上表现得非常清晰。我们可以用Mermaid图来可视化它:

出门?
天气状况
温度
风力
...其他特征

从上图可以看出,最终的类别 Y 是所有特征 X 的“父节点”,而所有特征 X 之间没有任何连接。它们都只依赖于 Y,彼此之间却“形同陌路”。这就是“条件独立性”的直观体现。

1.3 假设的代价:何时朴素贝叶斯会“失灵”?

这种“天真”的假设在很多时候是有效的,尤其是在文本分类中,单个词语的出现概率确实可以被近似地认为是独立的。

但在许多其他场景,这个假设就与现实严重不符了。

思考一个医学诊断的例子:我们要根据患者的症状来判断他是否患有某种流感。

  • 类别:患流感 / 未患流感
  • 特征:发烧、咳嗽、头痛、身体酸痛

朴素贝叶斯会假设,在“患流感”这个前提下,一个人是否发烧,与他是否咳嗽是完全独立的。但这符合常识吗?当然不。对于流感而言,发烧和咳嗽、身体酸痛这些症状往往是同时出现的,它们之间存在很强的相关性。

当特征之间存在强关联时,朴素贝叶斯会重复计算这种关联带来的影响,导致对概率的估计出现偏差,从而做出错误的判断。这就是它“失灵”的时刻。

现在,我们已经充分理解了问题的根源。接下来,让我们请出解决方案——贝叶斯网络。

第二部分:打破枷锁 - 贝叶斯网络登场

既然问题在于模型无法表达特征之间的依赖关系,那么我们只需要找到一种能够描述这种关系的工具即可。

2.1 什么是贝叶斯网络?一个更真实的概率图模型

贝叶斯网络(也叫信念网络)是一种概率图模型。别被这个名字吓到,它的核心思想其实非常直观:

  • 它是一个有向无环图(DAG)。
  • 图中的节点(Node) 代表随机变量(也就是我们的类别和特征)。
  • 图中的有向边(Edge) 代表了变量之间的条件依赖关系。如果有一个从节点A指向节点B的箭头,那么我们说“A是B的父节点”,B的概率分布依赖于A。

简单来说,贝叶斯网络用一张图,清晰地画出了变量之间的因果关系或依赖关系网。

2.2 结构对比:贝叶斯网络 vs. 朴素贝叶斯

为了让你更清晰地看到二者的区别,我们以前面提到的“流感诊断”为例,画出两种模型的结构图。

朴素贝叶斯模型结构图:

患流感?
发烧
咳嗽
头痛
身体酸痛

一个可能的贝叶斯网络模型结构图:

患流感?
发烧
咳嗽
身体酸痛
头痛

对比一下,区别一目了然:

  • 在左侧的朴素贝叶斯图中,所有症状都只依赖于“是否患流感”,彼此独立。
  • 在右侧的贝叶斯网络图中,我们建立了一个更符合医学常识的依赖关系:流感可能直接导致发烧和咳嗽,而剧烈的咳嗽可能引发身体酸痛,发烧则可能导致头痛。

通过这张图,我们明确地表达了症状之间的关联。这正是贝叶斯网络的强大之处。

有趣的是,通过对比你会发现,朴素贝叶斯本身就是一种结构极其简单的贝叶斯网络。它特殊在:只有一个父节点(类别),其他所有节点(特征)都作为其子节点,且子节点之间没有任何连接。

现在,理论已经足够了。让我们卷起袖子,进入最激动人心的实战环节。

第三部分:实战 - 用Python从零构建贝叶斯网络

我们将通过一个经典的概率图模型案例——“Asia”数据集,来一步步构建我们的贝叶斯网络。

3.1 项目设定:一个经典的医学诊断场景

这个场景描述了一个简化的因果关系链:

  1. 一个人的生活习惯(是否吸烟)会影响他是否会患上某些疾病(肺癌或支气管炎)。
  2. 这些疾病又会导致一些可观察的症状(比如X光异常或呼吸困难)。

这是一个完美的例子,因为这里的变量之间存在明确的因果关系,使用朴素贝叶斯将完全无法捕捉到这些信息。

我们的任务是:

  1. 从数据中学习出这个隐藏的关系网络(结构学习)。
  2. 量化网络中各个关系边的强度(参数学习)。
  3. 使用学习好的网络进行推理,回答一些概率问题。

3.2 环境准备:搭建你的“炼丹炉”

一个良好的开发习惯是从创建一个干净的虚拟环境开始。这能确保我们项目的依赖不会和系统或其他项目的依赖发生冲突。

第一步:创建并激活Python虚拟环境

打开你的终端(Terminal),进入你打算存放项目的文件夹,然后执行以下命令:

# 创建一个名为 myenv 的虚拟环境
# 'myenv' 是环境名,你可以换成任何你喜欢的名字
python3 -m venv myenv

# 激活这个环境 (在 macOS 或 Linux 上)
source myenv/bin/activate
# 如果你使用 Windows, 命令是:
# myenv\Scripts\activate

激活成功后,你会看到终端提示符前面多了 (myenv) 的字样。

第二步:安装必要的Python库

我们需要三个核心库:

  • pgmpy:这是我们构建贝叶斯网络的主力工具,它提供了结构学习、参数学习、推理等所有功能。
  • pandas:用于数据处理和管理,我们将用它来创建和操作我们的数据集。
  • networkx:pgmpy依赖它来进行图的表示和操作。

在激活的虚拟环境中,执行以下安装命令:

pip install pgmpy pandas networkx

等待安装完成,我们的准备工作就绪了。

3.3 数据模拟:无中生有,创建我们的训练集

在真实世界中,你通常会有一份现成的CSV或数据库格式的数据。但为了本次教学,我们将“扮演上帝”,根据已知的“Asia”网络结构,主动生成一份符合其内在逻辑的合成数据。这样做的好处是,我们可以在最后验证我们从数据中学到的结构是否和我们预设的“真实”结构一致。

创建一个名为 create_data.py 的Python文件,并输入以下代码:

import pandas as pd
import numpy as np

# 定义变量和它们的状态
# 0 代表 'no', 1 代表 'yes'
variables = {
    'smoke': [0, 1],
    'bronchitis': [0, 1],
    'lung_cancer': [0, 1],
    'dyspnoea': [0, 1],
    'xray': [0, 1]
}

# 设置样本数量
num_samples = 2000

# 根据预设的因果关系生成数据
# P(smoke=1) = 0.5
smoke = np.random.choice(variables['smoke'], num_samples, p=[0.5, 0.5])

# P(lung_cancer=1 | smoke=1) = 0.1, P(lung_cancer=1 | smoke=0) = 0.01
lung_cancer = np.zeros(num_samples)
lung_cancer[smoke == 1] = np.random.choice(variables['lung_cancer'], (smoke == 1).sum(), p=[0.9, 0.1])
lung_cancer[smoke == 0] = np.random.choice(variables['lung_cancer'], (smoke == 0).sum(), p=[0.99, 0.01])

# P(bronchitis=1 | smoke=1) = 0.6, P(bronchitis=1 | smoke=0) = 0.3
bronchitis = np.zeros(num_samples)
bronchitis[smoke == 1] = np.random.choice(variables['bronchitis'], (smoke == 1).sum(), p=[0.4, 0.6])
bronchitis[smoke == 0] = np.random.choice(variables['bronchitis'], (smoke == 0).sum(), p=[0.7, 0.3])

# P(xray=1 | lung_cancer=1) = 0.9, P(xray=1 | lung_cancer=0) = 0.05
xray = np.zeros(num_samples)
xray[lung_cancer == 1] = np.random.choice(variables['xray'], (lung_cancer == 1).sum(), p=[0.1, 0.9])
xray[lung_cancer == 0] = np.random.choice(variables['xray'], (lung_cancer == 0).sum(), p=[0.95, 0.05])

# P(dyspnoea=1 | lung_cancer=1, bronchitis=1) = 0.9
# P(dyspnoea=1 | lung_cancer=1, bronchitis=0) = 0.7
# P(dyspnoea=1 | lung_cancer=0, bronchitis=1) = 0.8
# P(dyspnoea=1 | lung_cancer=0, bronchitis=0) = 0.1
dyspnoea = np.zeros(num_samples)
dyspnoea[(lung_cancer == 1) & (bronchitis == 1)] = np.random.choice(variables['dyspnoea'], ((lung_cancer == 1) & (bronchitis == 1)).sum(), p=[0.1, 0.9])
dyspnoea[(lung_cancer == 1) & (bronchitis == 0)] = np.random.choice(variables['dyspnoea'], ((lung_cancer == 1) & (bronchitis == 0)).sum(), p=[0.3, 0.7])
dyspnoea[(lung_cancer == 0) & (bronchitis == 1)] = np.random.choice(variables['dyspnoea'], ((lung_cancer == 0) & (bronchitis == 1)).sum(), p=[0.2, 0.8])
dyspnoea[(lung_cancer == 0) & (bronchitis == 0)] = np.random.choice(variables['dyspnoea'], ((lung_cancer == 0) & (bronchitis == 0)).sum(), p=[0.9, 0.1])

# 整合到 pandas DataFrame
data = pd.DataFrame({
    'smoke': smoke.astype(int),
    'lung_cancer': lung_cancer.astype(int),
    'bronchitis': bronchitis.astype(int),
    'xray': xray.astype(int),
    'dyspnoea': dyspnoea.astype(int)
})

# 保存到 CSV 文件
csv_path = 'asia_synthetic_data.csv'
data.to_csv(csv_path, index=False)

print(f"成功生成 {num_samples} 条数据,并保存到 '{csv_path}'")
print("数据前5行预览:")
print(data.head())

运行这个脚本:python create_data.py。它会生成一个名为 asia_synthetic_data.csv 的文件,这就是我们接下来要用到的“弹药”。

3.4 核心环节一:结构学习(Structure Learning)

现在,让我们开启最有趣的部分。我们将假装完全不知道 asia_synthetic_data.csv 是如何生成的,让 pgmpy 从数据中自己去发现变量之间的关系。

创建一个新文件 learn_network.py。

import pandas as pd
from pgmpy.estimators import HillClimbSearch
from pgmpy.estimators import K2Score

# 1. 加载数据
# 我们从刚刚创建的CSV文件中读取数据
data = pd.read_csv('asia_synthetic_data.csv')
print("数据已加载,总共 {} 条记录。".format(len(data)))

# 2. 初始化结构学习算法
# 我们选择 HillClimbSearch (爬山搜索) 算法。
# 它会从一个没有边的图开始,一步步尝试添加、删除或翻转边,
# 每一步都选择让分数(这里是 K2Score)提高最多的操作。
scoring_method = K2Score(data=data)
hc = HillClimbSearch(data=data)

# 3. 执行结构学习
# estimate() 方法会运行算法并返回学习到的最优模型结构
print("开始进行结构学习...")
best_model = hc.estimate(scoring_method=scoring_method)

# 4. 查看学习到的网络结构
print("结构学习完成!")
print("学习到的贝叶斯网络边 (依赖关系):")
print(best_model.edges())

在终端中运行它:python learn_network.py。

你可能会看到类似下面这样的输出(每次运行结果可能因随机性略有不同):

数据已加载,总共 2000 条记录。
开始进行结构学习...
结构学习完成!
学习到的贝叶斯网络边 (依赖关系):
[('smoke', 'lung_cancer'), ('smoke', 'bronchitis'), ('lung_cancer', 'xray'), ('lung_cancer', 'dyspnoea'), ('bronchitis', 'dyspnoea')]

这个输出告诉我们,算法从数据中发现了以下关系:

  • smoke -> lung_cancer (吸烟指向肺癌)
  • smoke -> bronchitis (吸烟指向支气管炎)
  • lung_cancer -> xray (肺癌指向X光异常)
  • lung_cancer -> dyspnoea (肺癌指向呼吸困难)
  • bronchitis -> dyspnoea (支气管炎指向呼吸困难)

这和我们当初生成数据时预设的因果关系几乎完全一致!这证明了结构学习的有效性。

3.5 核心环节二:参数学习(Parameter Learning)

找到了“谁依赖谁”之后,我们还需要量化这种依赖的强度,也就是计算每个变量的条件概率表(CPT)。

继续在 learn_network.py 文件中添加代码:

# ... (前面的代码) ...

# 5. 进行参数学习
# 有了网络结构 (best_model) 和数据 (data),我们就可以学习每个节点的CPT了
from pgmpy.models import BayesianNetwork
from pgmpy.estimators import BayesianEstimator

# pgmpy < 0.1.18 使用 BayesianModel
# from pgmpy.models import BayesianModel as BayesianNetwork

print("\n开始进行参数学习...")
model = BayesianNetwork(best_model.edges())
model.fit(data=data, estimator=BayesianEstimator)
print("参数学习完成!")

# 6. 查看学习到的CPTs
print("查看学习到的部分条件概率表 (CPTs):")
for cpd in model.get_cpds():
    print("CPD for {}:".format(cpd.variable))
    print(cpd)

再次运行 python learn_network.py。这次,在结构学习的结果之后,你会看到类似这样的输出:

...
参数学习完成!
查看学习到的部分条件概率表 (CPTs):
CPD for smoke:
+----------+----------+
| smoke(0) | 0.500249 |
+----------+----------+
| smoke(1) | 0.499751 |
+----------+----------+
CPD for lung_cancer:
+--------------------+-----------------------+-----------------------+
| smoke              | smoke(0)              | smoke(1)              |
+--------------------+-----------------------+-----------------------+
| lung_cancer(0)     | 0.989011              | 0.901099              |
+--------------------+-----------------------+-----------------------+
| lung_cancer(1)     | 0.010989              | 0.098901              |
+--------------------+-----------------------+-----------------------+
... (其他CPTs) ...

让我们解读一下 lung_cancer 的CPT:

  • smoke(0) 列:当 smoke 为0(不吸烟)时,lung_cancer 为0(没有肺癌)的概率是 0.989,为1(有肺癌)的概率是 0.0109。
  • smoke(1) 列:当 smoke 为1(吸烟)时,lung_cancer 为0的概率是 0.901,为1的概率是 0.0989。

这些从数据中学到的概率,和我们 create_data.py 中预设的概率(不吸烟患癌率1%,吸烟患癌率10%)非常接近!这证明了参数学习的准确性。

3.6 模型应用:进行概率推理(Inference)

现在我们拥有了一个结构和参数都已学习完毕的、完整的贝叶斯网络模型。是时候用它来解决实际问题了。

推理问题:已知一个患者吸烟,那么他/她出现呼吸困难(dyspnoea)的概率是多大?

继续在 learn_network.py 文件末尾添加代码:

# ... (前面的代码) ...

# 7. 进行推理
from pgmpy.inference import VariableElimination

print("\n开始进行推理...")
# 初始化推理引擎
inference = VariableElimination(model)

# 执行查询
# 我们想知道在 'smoke' = 1 的条件下,'dyspnoea' 的概率分布
query_result = inference.query(variables=['dyspnoea'], evidence={'smoke': 1})
print("推理问题:已知一个患者吸烟,他/她出现呼吸困难的概率是?")
print(query_result)

最后一次运行 python learn_network.py。最终的输出会是:

...
推理问题:已知一个患者吸烟,他/她出现呼吸困难的概率是?
+---------------+-----------------+
| dyspnoea      |   phi(dyspnoea) |
+===============+=================+
| dyspnoea(0)   |          0.3341 |
+---------------+-----------------+
| dyspnoea(1)   |          0.6659 |
+---------------+-----------------+

结果解读:根据我们的模型推断,一个吸烟者,他出现呼吸困难 (dyspnoea(1)) 的概率大约为 66.59%。

模型通过复杂的概率链条(吸烟 -> 肺癌/支气管炎 -> 呼吸困难)为我们算出了这个答案。这绝不是朴素贝叶斯模型能够完成的任务!

机器学习祛魅:打破五大认知陷阱的实战指南 机器学习并非高不可攀的数学圣殿或硬件军备竞赛,而是一门以问题解决为核心的工程实践。其核心原理植根于线性代数、概率统计与优化思想,但90%以上的工业场景中,关键能力在于数据工程、特征构建与端到端闭环落地,而非复杂数学推导或SOTA模型堆砌。技术价值体现在快速验证、业务指标提升与系统稳定性上,典型应用场景包括金融风控建模、医疗影像辅助诊断、工业缺陷检测及智能客服意图识别等。本文聚焦真实从业者常遇的认知偏差,系统解构‘数学门槛过高’‘数据规模决定论’‘硬件依赖症’‘学历滤镜’和‘调参万能论’五大陷阱,提供可立即复 阅读详情

相关推荐

GitHub 2024 机器学习资源盘点:10个高星仓库 vs 3个实战项目路径

本文深度解析GitHub 2024年机器学习资源,精选10个高星仓库和3个实战项目路径,帮助开发者构建个性化学习地图。涵盖理论基石如微软ML-For-Beginners和工程实践类仓库Awesome Production ML,以及百日攻坚、项目沉浸和竞赛进阶等实战方案,提供求职和研究导向型路线图,助力高效掌握机器学习技能。

weixin_28278377的博客 300

朴素贝叶斯实战指南:高维稀疏数据下的工业级分类解法

朴素贝叶斯是一种基于贝叶斯定理与特征条件独立假设的概率分类模型,其核心原理是通过联合似然打分实现高效决策,无需计算归一化分母。该算法以极低计算开销、强噪声鲁棒性和天然稀疏友好性,在文本分类、用户行为预测、实时风控等场景中展现出独特技术价值。尤其适用于中等规模样本(万至百万级)、高维稀疏特征(数千维词向量)及严苛延迟要求(<50ms)的生产环境。本文聚焦MultinomialNB等主流变体的工程落地细节,涵盖拉普拉斯平滑调优、稀疏矩阵安全运算、OOV鲁棒处理及线上故障排查,直击工业场景中特征类型错配、维度不一

weixin_34117211的博客 361

轻量级情感分类实战:MultinomialNB工程化落地指南

情感分类是自然语言处理中最基础也最易被低估的任务,其核心在于将文本语义转化为可量化、可解释、可部署的统计决策问题。朴素贝叶斯(MultinomialNB)并非过时算法,而是在短文本、低延迟、高稳定性需求场景下极具性价比的选择——它不追求语义理解深度,但通过特征工程增强、领域词典融合与三层防御架构,能有效应对网络用语漂移、否定修饰、程度强化等真实挑战。本文聚焦‘简单但靠谱’的工业级落地路径,涵盖数据清洗、n-gram加权特征、class_prior先验校准、置信度后处理等关键实践,并天然适配边缘部署与实时弹幕

weixin_33894640的博客 355

图解贝叶斯网络三大经典结构:同父、顺序、V型的实际业务场景解析

本文通过医疗诊断、金融风控、广告归因等实际业务场景,深入解析了贝叶斯网络的三大经典结构:同父结构、顺序结构和V型结构。文章重点阐述了这些结构如何直观地揭示变量间的条件独立性,从而构建清晰、可解释的概率图模型,帮助数据分析师和策略师将复杂的业务逻辑转化为高效的推理框架。

berry的博客 724

BERT特征提取结合朴素贝叶斯:新闻文本分类的高效实践方案

文本分类是自然语言处理(NLP)中的基础任务,其核心原理是通过机器学习算法自动将文档归入预定义的类别。传统方法如朴素贝叶斯分类器,基于词袋模型和TF-IDF特征,具有训练速度快、模型轻量和可解释性强的优点,但受限于特征独立性假设,难以捕捉深层语义关系。随着预训练语言模型的发展,以BERT为代表的Transformer架构通过自注意力机制和掩码语言建模,能够生成富含上下文信息的词向量和句向量,极大提升了语义表征能力。这种强大的特征提取技术为传统分类器注入了新的活力,使其在保持高效推理的同时,分类性能逼近大型深

weixin_28678151的博客 258

在PLC中将十六进制数据转换为浮点数(通常遵循IEEE 754标准)需要理解数据存储格式,并按以下步骤操作:

通过以上步骤,您可以在PLC中实现十六进制到浮点数的转换。T DBD20 // 将数据传送到浮点数变量(如DB1.DBD20)指数位(8位):实际指数 = 存储值 - 127(偏移量)。:必须确认PLC的存储顺序(大端或小端),否则结果错误。将两个16位寄存器合并为32位数据,需注意。尾数位(23位):隐含前导1,实际值为。:确保32位数据在寄存器中连续且对齐。符号位(1位):0表示正,1表示负。:高位寄存器在前(如西门子PLC)。:低位寄存器在前(如三菱FX系列)。,误差因截断导致)。

K11mvp的博客 4417

机器学习系列(4)——朴素贝叶斯法

本文介绍朴素贝叶斯分类器算法,及其在sklearn中的实现。 0x01、朴素贝叶斯法简介 朴素贝叶斯(naive Bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入输出的联合概率分布,然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。 (1)朴素贝叶斯法是典型的生成学习方法。生成方法由训练数据学习联合概率分布 ,然后求得后验概率分布 。具体来说,利用训练数据学习 和 的估计,得到联合概率分布:。概率估计...

从此醉 3193

FPGA 学习系列(2):Verilog 语法基础

Verilog 由门级建模数据流建模行为建模门级建模(Gate Level Modeling):使用基本逻辑门描述电路,接近硬件物理结构。数据流建模(Data Flow Modeling):使用assign语句进行组合逻辑建模,类似数学方程式。行为建模(Behavioral Modeling):使用always代码块和if-elsecase等控制语句建模,抽象程度较高。Verilog 代码一般由模块(module)组成,每个模块描述一个独立的硬件功能。

Azperk的博客 988

条件独立性

假设G = (V, E)是一个DAG,V是一个随机变量集,基于Markov condition, G entails conditional independency IP (A,B|C) for A,B, C ⊆ V if IP (A,B|C) holds for every P ∈ PG, where PG is the set of all probability distributi

chindmin的专栏 2997

树莓派使用 OLED 屏显示图片及文字

树莓派默认是不带显示屏的,如果想要查看系统的一些信息,需要使用电脑登录到树莓派,或者通过 HDMI 连接外接显示器查看。这样做总是有点麻烦,我们可以通过外接一个 OLED 屏来显示一些关键参数或者图片。本文将详细介绍操作方法。 OLED 模组介绍 OLED 屏主要有两种:128×32 和 128×64 ,主要颜色是白、黄、蓝。OLED 屏的特点是功耗低,价格便宜,使用 I2C 接口与主机连接。本文所使用的是 128×64 尺寸的屏幕,外形如下: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直

码到成功 3743

3U 与 SV630A 伺服实现 CANLINK 通讯

SD410这组参数特别重要,这个32位特别重要,是防止数值乱码的关键。

weixin_42714122的博客 2694

第17讲 贝叶斯统计推断:最大后验

GitChat 766

人脸关键点定义汇总

前几天看一份代码临时需要找49个人脸关键点位置定义的图片发现怎么百度都搜不到,最后幸好谷歌可以使用了就用谷歌搜到了。所以在这里汇总一下我所知道的人脸关键点的定义和相关的一点东西,以备不时之需。 68个关键点 最常用的工具是Dlib,网址:http://dlib.net/ dlib的68个特征点检测算法是ERT算法【1】 使用dlib检测68个特征点的python示例见:http://dlib.n...

程序媛 7642

朴素贝叶斯法

朴素贝叶斯法是基于贝叶斯原理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特这条件独立假设学习输入输出的联合概率分布了然后基于此模型,对于给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。朴素贝叶斯法实现简单,学习与预测的效率都和高,是一种常用的方法。 朴素贝叶斯法的学习和分类:

zhang20072844的专栏 5764

RK3588开发笔记-ISP模块参数调试

本文详细介绍了基于RK3588平台的ISP模块参数调试流程。主要内容包括:硬件准备(RK3588板卡、IMX415摄像头等)、软件环境搭建(Ubuntu系统、RKISP_Tuner工具)、IMX415摄像头基础使用验证、RKISP2.x Tuner工具的使用方法(新建/加载IQ参数文件、Sensor配置、Raw图采集)以及最终IQ文件的部署。文章重点强调了基础标定的重要性,建议开发者分场景调试并参考官方文档,通过合理配置ISP参数来优化图像质量。该调试流程适用于RK3588平台的图像采集类项目开发。

flypig has a dream! 839

华为OD机试 - 第k个排列 - 全排列递归(Python/JS/C/C++ 2025 C卷 100分)

给定参数n,从1到n会有n个整数:1,2,3,…,n,这n个数字共有n!按大小顺序升序列出所有排列的情况,并一一标记当n=3时,所有排列如下“123”,“132,“213”,“231”,“312”,“321”输入两行,第一行为n,第二行为k,给定n的范围是[1,9],给定k的范围是[1,n!排列为“12”和“21”,第2个是“21”。给定n和k,返回第k个排列。输出排在第k位置的数字。只有一个排列,直接返回。

学Java,找哪吒 983

朴素贝叶斯在多特征分类预测中的实战应用与优化

在机器学习领域,分类预测是核心任务之一,其目标是根据输入特征预测样本所属类别。其基本原理是学习特征与类别标签之间的映射关系,通过构建决策边界实现分类。从技术价值看,高效的分类算法能处理海量数据,为决策提供支持,广泛应用于金融风控、医疗诊断、工业预警等场景。其中,朴素贝叶斯算法因其计算效率高、实现简单,成为处理高维特征的利器。该算法基于贝叶斯定理,并假设特征条件独立,虽简化了计算,但在多尺度特征融合和多模态特征融合的实际应用中,常需结合特征工程来提升性能。通过特征选择、离散化等策略,可有效应对特征相关性与稀疏

weixin_30336061的博客 292

PyRoki 入门教程(二)安装与使用

PyRoki是一个用于机器人运动学优化的Python库,具有模块化设计、可扩展性和跨平台支持等特点。它支持逆运动学、轨迹优化和动作重定位等任务,采用Levenberg-Marquardt优化器提高效率。主要功能包括:基于URDF的可微分正向运动学模型、自动生成碰撞基元、通用成本因子和自定义成本函数等。PyRoki支持CPU、GPU和TPU运行,适用于从单机器人到大规模并行处理场景。目前存在一些限制,如仅支持软约束、静态形状和特定关节类型等。官方提供了多个应用示例,包括基础逆运动学、碰撞检测、轨迹优化和手部/

机器人控制与仿真应用 1251

吴恩达NLP专项课精华解析:从理论到实战的深度学习笔记

本文深入解析吴恩达NLP专项课程,涵盖从基础理论到实战应用的全方位内容。课程通过情感分析、词向量、概率模型、序列模型及Transformer等核心知识点,结合代码实战,帮助开发者系统掌握自然语言处理技术。特别适合已有Python基础、希望快速入门NLP的学习者。

weixin_30642561的博客 525

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ApacheCN AI 路线图解析:10个必学的机器学习算法

ApacheCN AI 路线图是一份全面的机器学习学习指南,旨在帮助新手和普通用户系统掌握机器学习核心知识与技能。通过这份路线图,你可以清晰了解从基础知识到高级应用的完整学习路径,轻松入门机器学习领域。 ## 机器学习学习路径概览 🗺️ 机器学习的学习之旅就像一张复杂而有序的地铁线路图,每个算法和知识点都是一个重要的站点。ApacheCN AI 路线图为你清晰规划了从基础知识到高级应用的完整

gitblog_00446的博客 451

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

机器学习数学基础:线性代数、概率论与微积分的实践指南

机器学习本质上是通过数学模型从数据中学习规律的学科,其核心原理建立在三大数学支柱之上。线性代数为高维数据表示和变换提供基础工具,涉及向量空间、矩阵运算和特征值分解等概念,这些在PCA降维和推荐系统中具有重要技术价值。概率论则量化不确定性,通过条件概率、贝叶斯定理和最大似然估计等原理支撑朴素贝叶斯分类器等算法,在数据生成假设和模型评估中发挥关键作用。微积分作为优化算法的数学基础,通过导数、偏导数和链式法则等概念,驱动梯度下降和反向传播等核心技术的实现。这些数学基础共同构成了机器学习从理论到实践的桥梁,尤其在算

weixin_30402343的博客 379

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Python机器学习:从零基础到项目实战

当您翻开此书,您正踏入一场数据与智慧的修行。机器学习,并非冰冷的符码,而是机器模拟人类洞察世界的法门。本书将带您,以Python为舟,泛游于算法之海。我们不只传授“术”,更探求其后的“道”——从数据的生灭流转中观照规律,于模型的迭代演进里体悟得失。愿您合上书卷时,收获的不仅是驾驭数据的技能,更有一双洞悉复杂、化繁为简的“智慧之眼”。现在,让我们一同启程。

YunWisdom 968

AI算法工程师成长指南:从核心能力到求职实战

机器学习作为人工智能的核心技术,其本质是通过算法模型从数据中学习规律,以解决分类、回归、预测等实际问题。其原理基于统计学、优化理论和计算科学,通过构建数学模型并利用数据迭代优化参数,使模型具备泛化能力。这项技术的价值在于能将复杂的现实问题自动化、智能化,显著提升决策效率和系统性能。在应用场景上,机器学习已广泛应用于计算机视觉、自然语言处理、推荐系统、金融风控等多个领域。要成为一名合格的AI算法工程师,不仅需要掌握深度学习等前沿算法,还必须构建扎实的数学与编程基础,并具备将模型工程化落地的能力。本文聚焦于AI

weixin_29062671的博客 321

数字化高校智慧后勤解决方案全景解析:从痛点到落地,一文读懂智慧校园后勤建设(PPT)

亮点一:物模型统一管理通过物模型屏蔽底层硬件差异,实现多校区、多厂商设备统一管控,这是降低IoT项目运维复杂度的核心设计。亮点二:AI大脑数据闭环从感知→采集→清洗→建模→分析→决策,形成完整数据闭环,让数据真正流动起来。亮点三:5G+MEC边缘计算将计算能力下沉到校园边缘,解决AI视频分析的时延问题,同时保障敏感数据不出校园。亮点四:多模态感知融合物联感知(传感器)+ 视觉感知(摄像头)+ 语音感知三类感知手段融合,构建立体感知网络。亮点五:全场景覆盖。

专注数字化解决方案,每日更新精选报告。关注「无忧智库」,与你共探数智未来,日进一步。 638

数学建模入门指南:从零到一掌握Python实战与团队协作

数学建模是将现实问题转化为数学问题并求解的核心方法,其关键在于构建清晰的数学模型。从原理上看,它依赖于函数、概率统计等基础数学概念,并通过编程工具实现模型求解。在技术价值上,数学建模能有效提升问题分析、预测与决策能力,是数据分析与机器学习的重要基础。常见的应用场景包括票房预测、销量分析和资源优化等实际问题。对于初学者,掌握Python中的Pandas、NumPy等库进行数据处理,并理解线性回归等基础模型,是快速入门的关键。本文围绕数学建模的实战流程,结合团队协作与常见误区,为新手提供了从环境搭建到论文撰写的

weixin_30425949的博客 419

KH Coder深度解析:如何用开源工具实现专业级文本分析与内容挖掘

在信息爆炸的数字时代,文本挖掘技术正成为解锁海量非结构化数据价值的关键。KH Coder作为一款开源文本分析工具,将量化内容分析与多语言处理能力深度融合,为研究人员和数据分析师提供了探索文本数据隐藏规律的强大武器。本文将从工具架构到实际应用,全面揭秘这款工具如何降低专业级文本分析的技术门槛。 ## 工具概述:什么是KH Coder的核心定位? KH Coder是一款专注于定量内容分析与文本挖掘

gitblog_00467的博客 928
上一篇: 模型评估指标 “ROC-AUC”:从混淆矩阵到统计学意义,为什么比准确率更可靠?(医疗诊断场景实战)
下一篇: 随机森林的 “Bootstrap 采样” 与 “特征随机选择”:如何避免过拟合?(附分类 / 回归任务实战)
THMAIL
博客等级 码龄10年 2434粉丝 432原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

THMAIL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值