异常检测的 “孤立森林”:二叉树分裂逻辑与工业设备故障检测落地

孤立森林(Isolation Forest) 背景 现有的异常检测方法主要是通过对正常样本的描述,给出一个正常样本在特征空间中的区域,对于不在这个区域中的样本,视为异常。这些方法的主要缺点是,异常检测器只是正常样本的最优描述,但是对于检测异常并不是最优的,有可能造成大量的误报,或者只检测到少量的异常。 异常的两个特点:异常数据只占很少量、异常数据特征值和正常数据差别很大。 孤立森林,不再是描述正常的样本点,而是要孤立异常点,由周志华教授... 阅读详情

异常检测的 “孤立森林”:二叉树分裂逻辑与工业设备故障检测落地

想象一下,你是一家大型工厂的负责人,一条价值连城的生产线正在全速运转。突然,一个不起眼的轴承因为微小的裂纹而应声断裂,整条生产线瞬间陷入停滞。数小时的停机、昂贵的维修费用、延迟的订单……这一切的根源,仅仅是一个未能被及时发现的“异常信号”。

在工业4.0的浪潮下,设备无时无刻不在产生海量的数据:温度、压力、振动频率、转速……这些数据就像机器的“心电图”。经验丰富的老师傅能通过细微的异响或异常的震动,判断设备是否存在隐患。但我们能否让机器学会这种“直觉”,在灾难发生前,自动、精准地发出预警?

答案是肯定的。这正是“异常检测”技术的用武之地。

今天,我们将一起探索一种强大且直观的异常检测算法——孤立森林(Isolation Forest)。它不像其他复杂的模型那样需要海量的“故障样本”来进行学习,而是巧妙地利用了“异常”本身“稀少且不同”的特点,像一位高效的侦探,能迅速从人群中揪出那个行为怪异的“嫌疑人”。

在本篇博客中,你将不仅仅是学习一个理论。我将牵着你的手,从零开始,一步步搭建环境、理解代码,亲手实现一个能够模拟检测工业设备故障的迷你项目。读完本篇,你将收获的不仅是一个算法的知识,更是一次完整的、从无到有的项目实践体验。

第一部分:理论核心 - 孤立森林的“孤立”智慧

在深入代码之前,我们必须先理解孤立森林背后的核心思想。它的逻辑非常巧妙,甚至可以说是简单得令人惊叹。

1.1 核心思想:异常点更容易被“孤立”

忘掉复杂的数学公式,我们先来看一个生活中的例子:

想象一下,在一大群穿着统一校服的学生中,混入了一个穿着厚重宇航服的人。现在,你的任务是把他找出来。

你会怎么做?你可能只需要一个简单的问题,比如:“是不是穿着白色的宇航服?”就能立刻把他从人群中“孤立”出来。

但是,如果你想从这群学生中找到某个特定的学生,比如“张三”,你可能需要问很多问题:“是男生还是女生?”、“是高个子还是矮个子?”、“是不是戴眼镜?”……你需要经过很多次“划分”,才能最终定位到他。

这个例子揭示了孤立森林的根本洞察:异常点(穿着宇航服的人)因为其“稀少且与众不同”的特性,所以更容易被从数据集中分割出来。 正常点(学生们)由于数量众多且特征相似,需要更多次的分割才能被一一识别。

孤立森林正是基于这个原理来构建的。它不断地随机分割数据,路径越短就被“孤立”出来的数据点,越有可能是异常点。

1.2 算法工作流程拆解

孤立森林的实现过程主要分为三步:构建孤立树、汇聚成森林、计算异常分数。

下面这张流程图清晰地展示了它的工作全貌:

graph TD
    A[输入数据集] --> B{构建多棵孤立树(iTree)};
    subgraph Forest
        B -- 树 1 --> C1[随机选择特征与分割点];
        B -- 树 2 --> C2[随机选择特征与分割点];
        B -- 树 N --> CN[...];
        C1 --> D1{递归分割数据};
        C2 --> D2{递归分割数据};
        CN --> DN{...};
        D1 --> E1[数据点被孤立于叶子节点];
        D2 --> E2[数据点被孤立于叶子节点];
        DN --> EN[...];
    end
    E1 --> F{计算每个数据点在所有树中的平均路径长度};
    E2 --> F;
    EN --> F;
    F --> G[根据平均路径长度生成异常分数];
    G --> H[分数越低,越异常];

第一步:构建“孤立树”(Isolation Tree)

一棵孤立树的生长过程如下:

  1. 随机选择特征:从数据的所有特征(比如设备的温度、压力、振动)中,随机挑选一个。
  2. 随机选择分割点:在刚才选定的特征的数值范围内,随机确定一个分割值。
  3. 划分数据:将数据集按照这个分割值,分成两部分:小于该值的去左子树,大于等于该值的去右子树。
  4. 递归重复:在左右两个子数据集上,重复上述1-3步,直到子数据集中只剩一个数据点,或者树达到了预设的最大深度。

第二步:汇聚成“森林”(The Forest)

单棵树的随机性太强,可能会偶然地很快孤立一个正常点。为了解决这个问题,算法会构建成百上千棵不同的孤立树,形成一片“森林”。对一个数据点来说,我们在所有树中计算它的路径长度,然后取一个平均值,这样结果就变得非常可靠。

第三步:计算“异常分数”

一个数据点最终的异常分数,是根据它在森林中所有树的平均路径长度来计算的。

  • 如果一个数据点的平均路径长度很短,意味着它在大多数树中都很快被孤立了出来,那么它被判定为异常的可能性就很高。
  • 反之,如果一个数据点的平均路径长度很长,那么它大概率是一个正常点。

这个过程完全不需要预先标记好的“故障样本”,它是一种无监督学习方法,这使得它在现实世界的很多场景中都极具价值。

第二部分:项目实战 - 工业设备故障检测

理论已经足够,现在是动手的时间了。我们将从零开始,搭建一个完整的Python项目,用孤立森林算法来识别模拟的设备故障数据。

2.1 万丈高楼平地起:环境准备

一个干净、独立的项目环境是良好开发的开端。

步骤一:创建项目文件夹

首先,打开你的终端(在Windows上是命令提示符或PowerShell,在macOS或Linux上是Terminal),创建一个专门存放我们项目文件的文件夹。

# 创建名为 "industrial-anomaly-detection" 的文件夹
mkdir industrial-anomaly-detection

# 进入这个新创建的文件夹
cd industrial-anomaly-detection
  • 为什么要这样做? 为每一个独立的项目创建一个专属的文件夹,就像为不同的书籍分门别类地放在书架上一样,这是保持工作区整洁有序的基本习惯。

步骤二:创建并激活虚拟环境

在项目文件夹内,我们将创建一个Python虚拟环境。

# 使用python3的venv模块创建一个名为"venv"的虚拟环境文件夹
python3 -m venv venv

执行完毕后,你会看到文件夹里多了一个名为 venv 的子文件夹,这里存放着一个独立的Python解释器和相关的库。

接下来,我们需要“激活”这个环境:

  • 在 macOS 或 Linux 上:
    source venv/bin/activate
    
  • 在 Windows 上:
    .\venv\Scripts\activate
    

激活成功后,你会发现终端命令行的最前方出现了 (venv) 的字样。这表示你当前的操作都是在这个“隔离舱”里进行的。

  • 为什么要这样做? 虚拟环境是Python开发的最佳实践。它确保我们为这个项目安装的库,不会与你电脑上其他项目(甚至是系统本身)的库产生冲突。例如,A项目需要1.0版本的库,B项目需要2.0版本的库,虚拟环境可以让它们和谐共存。

步骤三:安装项目依赖

在这个激活的虚拟环境中,我们来安装本次项目所需的全部“兵器”。

pip install scikit-learn numpy pandas matplotlib
  • 为什么要安装这些?
    • scikit-learn: 这是Python中最负盛名的机器学习库,我们的主角IsolationForest就住在里面。
    • numpy: 它是Python进行科学计算的核心库,提供了高效的多维数组操作,是处理数字数据的基石。
    • pandas: 一个强大的数据分析和处理工具,虽然我们这个小项目里用得不多,但在真实的数据项目中,它几乎是不可或缺的。
    • matplotlib: 一个灵活强大的数据可视化库。我们将用它来画图,让算法的检测结果一目了然。

至此,我们的开发环境已经万事俱备。

2.2 代码逐行剖析:从0到1构建检测脚本

在 industrial-anomaly-detection 文件夹中,创建一个名为 detect_failures.py 的Python文件,并用你喜欢的代码编辑器打开它。

第一步:导入“工具箱”

在文件的最开始,我们先把需要用到的所有工具(库)都引进来。

# 导入NumPy用于数值计算,并使用别名'np'
import numpy as np
# 导入matplotlib的pyplot模块用于绘图,并使用别名'plt'
import matplotlib.pyplot as plt
# 从scikit-learn库中导入IsolationForest模型
from sklearn.ensemble import IsolationForest

print("所有库导入成功!")
  • 代码解释:每一行 import 语句,都是在告诉Python:“嘿,准备好,我接下来要用到这些工具了。”

第二步:模拟“真实”数据

在真实世界中,数据通常来自传感器记录的CSV文件。但为了让这个教程可以独立运行,我们自己来创造一些数据。

# 设置随机种子,确保每次运行代码时生成的随机数都是一样的,便于复现结果
np.random.seed(42)

# 1. 生成正常的设备运行数据
#    - np.random.randn(100, 2) 生成100行2列的标准正态分布随机数(均值为0,标准差为1)
#    - * [15, 5] 将第一列(温度)乘以15,第二列(振动)乘以5,进行缩放
#    - + [150, 20] 将第一列平移150,第二列平移20
#    - 最终得到以(150, 20)为中心,在温度和振动上有一定波动的100个正常数据点
X_normal = 15 * np.random.randn(100, 2) + [150, 20]

# 2. 注入异常数据点(模拟设备故障)
#    - 创建一个包含5个异常点的数组
#    - 例如 [220, 45] 表示一个温度和振动都极高的点
#    - [140, 60] 表示一个温度正常但振动极高的点
X_outliers = np.array([
    [220, 45],
    [100, 15],
    [140, 60],
    [180, 5],
    [210, 30]
])

# 3. 将正常数据和异常数据合并成一个完整的数据集
X = np.concatenate([X_normal, X_outliers])

print(f"数据集创建完毕,总共 {len(X)} 个数据点。")
  • 代码解释:我们模拟了两个设备特征:温度(℃)和振动频率(Hz)。正常数据点紧密地聚集在(150, 20)附近,而我们手动添加的5个异常点则显著偏离了这个中心区域。

第三步:召唤“孤立森林”模型

现在,轮到我们的主角登场了。

# 初始化孤立森林模型
# - n_estimators=100: 森林中树的数量,即构建100棵孤立树
# - contamination=0.05: 告诉模型数据集中大约有5%是异常值。
#                      这个值需要根据你对数据的先验知识来设定,是我们注入的异常比例(5/105)。
# - random_state=42: 同样是为了结果可复现
model = IsolationForest(n_estimators=100, contamination=0.05, random_state=42)
  • 代码解释:创建孤立森林模型实例时,contamination(污染度)是一个非常重要的参数。它代表了你估计数据集中异常点的比例。这个值的设定会直接影响模型判定异常的“灵敏度”。

第四步:训练与预测

让模型去“学习”数据的分布,并找出那些它认为是“孤立”的点。

# 训练模型并进行预测
# .fit_predict() 方法会同时完成两件事:
# 1. fit: 模型学习数据集X的结构
# 2. predict: 为X中的每个数据点返回一个预测标签
predictions = model.fit_predict(X)

# 预测结果会是一个数组,其中:
# -  1 表示正常点 (inlier)
# - -1 表示异常点 (outlier)
print("模型预测完毕!")

第五步:结果可视化

最后,也是最激动人心的一步:我们将用图形化的方式,看看模型到底抓对了没有。

# 创建一个绘图区域
plt.figure(figsize=(10, 6))

# 绘制所有的数据点
# - X[:, 0] 是所有点的温度数据
# - X[:, 1] 是所有点的振动频率数据
# - c=predictions: 将点的颜色与我们的预测结果关联起来。
#                  matplotlib会自动将-1和1映射为不同的颜色。
# - cmap='coolwarm': 选择一个颜色映射方案,通常-1是暖色(红),1是冷色(蓝)
# - s=50: 设置点的大小
scatter = plt.scatter(X[:, 0], X[:, 1], c=predictions, cmap='coolwarm', s=50)

# 添加图表标题和坐标轴标签
plt.title('Isolation Forest Anomaly Detection', fontsize=16)
plt.xlabel('Temperature (°C)', fontsize=12)
plt.ylabel('Vibration (Hz)', fontsize=12)

# 添加图例
# scatter.legend_elements() 会自动根据颜色创建图例
# 我们手动将标签 'Outliers' 和 'Inliers' 对应到-1和1
plt.legend(handles=scatter.legend_elements()[0], labels=['Outliers', 'Inliers'])

# 显示图表
plt.show()

print("图表已生成。")

现在,在你的终端里运行这个脚本:

python3 detect_failures.py

如果一切顺利,你将看到一个弹出的窗口,里面有一张散点图。图中的大部分点是蓝色(正常),而那几个我们手动添加的、远离中心区域的点,则被清晰地标记为了红色(异常)!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这证明,我们的孤立森林模型成功地“听”到了那几个异常的“噪音”!

配置 Druid 数据源及密码加密-SpringBoot 实战基础 在SpringBoot中配置 Druid 数据源及密码加密的方法前文集成 MyBatis Plus,实现了一组增删改查接口。在启动服务时,从控制台中可以看出 Spring Boot 默认使用 Hikari 作为数据库连接池,Hikari性能很优秀。在国内使用较多的连接池还属阿里开源的 Druid,中文发音为德鲁伊。Druid 结合了 C3P0、DBCP 等 DB 池的优点,同时还加入了日志监控,可以很好的监控 DB 池连接和 SQL 的执行情况。... 阅读详情

相关推荐

从315MHz到125kHz:手把手教你用Arduino模拟汽车钥匙的RKE/PKE信号(附代码)

本文详细介绍了如何使用Arduino开发板和射频模块模拟汽车钥匙的RKE/PKE信号,包括硬件准备、代码实现和安全机制。通过实践教程,读者可以深入理解315MHz和125kHz信号在汽车电子领域的应用,掌握无钥匙进入系统的核心技术。

weixin_30945039的博客 223

孤立森林算法:用“孤立”来发现异常的天才想法

想象你是一个侦探,要在1000人的派对中快速找出间谍:计算每个人和其他999人的距离找距离平均值最远的人问题:计算量大(1000×999次计算),容易被伪装者欺骗 侦探说:“请大家随机报数1-100!” 结果:间谍A报了“73” 侦探再说:“报数大于50的站左边,小于等于50的站右边” 间谍A站到了左边(因为73>50) 侦探继续:“左边的人,报数大于75的站左边,小于等于75的站右边” 间谍A站到了右

xixixi7777的博客 756

自监督学习与上下文赌博机融合:视觉决策中的协同优化与实战指南

在机器学习领域,自监督学习(Self-Supervised Learning)通过设计前置任务从无标注数据中学习通用表征,已成为解决标注数据稀缺问题的关键技术。其核心原理是利用数据自身的结构生成监督信号,训练编码器提取鲁棒特征。上下文赌博机(Contextual Bandits)作为强化学习的简化分支,专注于在给定上下文信息下做出单步最优决策,平衡探索与利用,广泛应用于推荐系统、广告投放等场景。将两者结合,构建端到端的协同训练框架,能让视觉表征的优化直接服务于最终的决策目标,同时利用自监督任务作为正则化项提

weixin_33721344的博客 520

孤立森林和随机森林主要区别

孤立森林(Isolation Forest)是一种高效的异常检测算法,特别适用于高维数据。其核心思想是通过随机分割数据来快速隔离异常点,利用路径长度判断异常。与随机森林不同,孤立森林是无监督学习,目标为异常检测,分裂方式为随机选择特征和分割点,树的深度较浅,适用于网络安全、金融风控等领域的异常检测任务。孤立森林具有高效性、无需标签和对高维数据友好的优点,但也存在参数敏感性和对局部密度差异敏感的局限性。通过Python的sklearn库可以轻松实现孤立森林模型,并进行异常检测。

峰爸的博客 1969

1、STVD和STVP的使用及串口烧写程序教程

文章目录一、前述二、STVD的使用三、STVP的使用1、STVP的作用:2、STVP的使用四、串口烧录程序 一、前述 STVD是意法半导体推出的,可以支持STM8和STM32 而IAR不尽如此,还支持51,MSP430等芯片 软件开发环境:编写程序,调试软件功能,下载固件到单片机中 硬件开发环境:连接外围电路,驱动功能外设,实现电气功能 最终构成一个以STM8系列单片机作为控制核心的应用系统。 MCS-51 一般的开发环境是 IAR 和 Keil STM8 一般的开发环境是 IAR 和 ST

Clichong 1万+

JeecgBoot漏洞利用工具解析:一键getshell原理与安全加固实践

在应用安全领域,远程代码执行(RCE)和文件上传漏洞是Web系统面临的高危威胁,其核心原理在于对用户输入的控制不足或安全校验缺失。攻击者通过构造恶意请求,可绕过系统边界,在服务器上执行任意命令或上传恶意文件,从而获取系统控制权。这类漏洞的技术价值在于揭示了应用层安全防护的薄弱环节,其利用方式自动化、集成化趋势明显,极大地提升了攻击效率。在低代码开发平台等快速构建的业务系统中,此类风险尤为突出。应用场景广泛覆盖安全测试、渗透评估与应急响应。本文聚焦于JeecgBoot平台的历史高危漏洞,深入解析其SQL注入、

weixin_30787531的博客 552

数据结构之二叉树在项目中的应用:从原理到实战

本文结合真实案例与代码实现,探讨二叉树在数据库、图像处理、机器学习等领域的应用,并分析优化策略与未来趋势。

半青年的博客 1316

一文了解ECU软件刷写的2种方法:Bootloader刷写和调试器刷写

分为刷写前、刷写中和刷写后三个阶段,如下示意:下面我们来详细了解一下Bootloader收到外部请求后开始刷写的三个阶段1)刷写前进行刷写的准备,一是确保刷写阶段总线通信的稳定性,二是避免刷写阶段出现非预期的故障,三是读取车辆数据供刷写前的一些检查等,如下所示:首先进行会话控制,通过功能寻址方式进入扩展会话模式,为后面的信息访问及其他指令做准备;然后检查刷写的前提条件,通过物理寻址方式发送历程控制请求。比如车确实处于静止状态,供电电压稳定等条件下才允许刷写;

menghuyouyou的博客 5782

揭秘孤立森林:从原理到实际应用,开启异常检测新旅程!

通过分析用户的消费行为数据,如消费金额、消费时间、消费地点等,孤立森林可以快速识别出那些异常的交易,帮助银行及时采取措施,保障用户的资金安全。在如今这个大数据时代,数据中隐藏的异常值就像一颗颗“定时炸弹”,影响着我们对数据的分析和决策。通过对设备的运行参数进行实时监测,如温度、压力、转速等,一旦检测到异常值,就可以及时发出警报,提醒工作人员进行检修,避免设备故障对生产造成影响。通过分析网络流量数据,如数据包大小、传输时间、源IP地址等,孤立森林可以识别出那些异常的网络行为,帮助企业及时发现并防范网络攻击。

qingsi11的博客 62

UA-DETRAC数据集转YOLO格式

UA-DETRAC转YOLO

lafsca5的博客 9107

Oracle EBS GL日记账批“选定以过账”状态数据修复

日记账来源:应收账款。用户操作过账以后,自动提交请求“过账:单一分类账”一直运行中,该请求执行5,6个小时甚至10多个小时无法完成,导致“标准管理器”阻塞大量请求待定,“冲突解决管理器”的待定数量不断增加。系统管理员不得不把该请求强制取消,此时,日记账批的状态处于“选定以过账”(GL_JE_BATCHES.STATUS为S),如下图 检查此日记账批有3千多条日记账题头,由于日记账比较多,日记账的科目余额计算需要大量服务器资源和执行时间比较长。

陈显平的专栏-Oracle EBS 3245

Selenium绕过浏览器指纹的九种方法

同样因为它是基于谷歌无头的,因此它只能用于谷歌无头,不想selenium一样,编写完脚本只需改变少量代码,便可以在多种浏览器中运行。亲测可用,唯一的遗憾是会导致你在脚本运行时,不能使用chrome,且每次数据不会清除,需要自己用selenim去设置清除下,此举也会清除自己日常使用chrome的数据;如果你电脑中没有chromium,执行这段代码后会自动帮你安装,然后再运行这段代码,但是非常慢,所以建议自己网上下载chromium后再执行脚本。这个确实成功了~,无副作用!试了,没用,大家可以自行测试下。

THMAIL的博客 7866

“EXB文件的格式和编程“

首先,打开文件并读取文件头,然后解析文件头中的元数据信息。接下来,循环读取数据块,每次读取块头部分,解析块的大小和类型,并读取相应大小的块数据。文件头(Header):EXB文件通常包含一个文件头,用于存储关于文件的元数据信息。读取EXB文件时,首先需要解析文件头,以了解文件的属性和数据结构。总结起来,EXB文件是一种常见的二进制数据文件格式,在编程中处理EXB文件需要了解其基本结构和元数据信息。通过以上代码,您可以根据自己的需求扩展处理其他类型的数据块,或者根据EXB文件的具体规范进行解析和处理。

HackCyberX的博客 1534

python与命令行(shell,cmd)或者其他命令行程序持续交互的方法

法一: from subprocess import Popen, TimeoutExpired, PIPE # 这里必须使用信号 PIPE 而不是自己创建的文本流,这样才能使用 communicate 函数 proc = Popen(args='python ./test.py', shell=True, encoding='utf-8', stdin=PIPE, stdout=PIPE, stderr=PIPE) try: outs, errs = proc.communicate(inp

THMAIL的博客 7775

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

python使用Scapy + Nfqueue抓包并修改

背景1 Nfqueue Nfqueue是iptables和ip6tables的target,这个target可以将数据包交给用户空间。比如,下面的一个iptables规则 iptables -A INPUT -j NFQUEUE --queue-num 0 那么在用户空间,可以使用libnetfilter_queue来连接到queue 0(默认)并且从内核获得该消息,然后,必须给出对这个数据包的裁决(Drop,Accept等等) 一般在iptables中的target有以下五种(ACCEPT..

THMAIL的博客 7112

深度学习工具包 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执行命令行命令并获取输出

print os.popen("ping www.baidu.com").read()

THMAIL的博客 5418

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

一步解决:CondaError: Error reading file, file should be a text file containing packages

一步解决:CondaError: Error reading file, file should be a text file containing packages; 修改文件编码为UTF-8即可,pycharm里直接点击红圈里的位置,然后选择cover即可

THMAIL的博客 4749

Python编译目录下的所有文件通过这个命令,可以将指定目录下的所有py文件编译成pyc,包括子目 Python编译目录下的所有

Python编译目录下的所有文件通过这个命令,可以将指定目录下的所有py文件编译成pyc,包括子目 Python编译目录下的所有:   通过这个命令,可以将指定目录下的所有py文件编译成pyc,包括子目录。   python -m compileall path/to/project   比如 python -m compileall . -- 编译当前目录和子目录下的所

THMAIL的博客 4059

在python moviepy中编辑后的视频没有声音的解决方案

据说是mac下才会发生,其实不是的,和播放器的音频解码方式有关,大家在调用write_videofile函数时加上参数audio_codec="aac",改变下声道编码即可

THMAIL的博客 3826

关于selenium截屏大小的问题

selenium截屏方法save_screenshot(filename); selenium默认的浏览器窗口大小有多大我不知道,但是在截图时,保存在本地的图片中有的网页是显示不完全的, 这时可以设置浏览器窗口大小,这样就可以显示完全了,方法是broswer.set_window_size(1920,1080); 顺便提一下这个类设置全屏的方法broswer.maximize_window(...

THMAIL的博客 3663

为python从源代码编译安装OpenCV

先了解下我们需要安装的模块,包括opencv、numpy、mkl、scipy、OpenNi、SensorKinect及opencv_contrib模块。这些模块的关系为,numpy是OPenCV的依赖库,所以只需要装numpy和opencv,就可以使用opencv了,但是某些计算需要使用到scipy,而scipy依赖numpy和mkl,OpenNI和SensorKinect是Opencv的扩展,可

THMAIL的博客 3066

python直接打印出任何模块/类等数据结构

简介 pprint模块:提供了打印出任何python数据结构类和方法。 模块方法: 1.class pprint.PrettyPrinter(indent=1,width=80,depth=None, stream=None) 创建一个PrettyPrinter对象 indent --- 缩进,width --- 一行最大宽度, depth --- 打印...

THMAIL的博客 2997

windows及linux下使用python多进程编程

两份资料地址: http://python.jobbole.com/82045/ http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868323401155ceb3db1e2044f80b974b469eb06cb43000

THMAIL的博客 2835

大模型应用实战:从0到1教你打造属于自己的“学术论文助手” Agent(自动检索 + 精读 + 总结)

本文介绍了如何从零开始构建一个基于大语言模型的“学术论文助手”Agent,帮助用户自动检索、阅读和总结学术论文。教程分为环境准备、核心工具实现和Agent构建三个部分:首先搭建Python开发环境并安装必要依赖库;然后实现文献检索(PubMed/arXiv)、PDF解析等核心工具;最后通过LangChain框架整合功能,构建能自动完成“检索-精读-总结”全流程的智能助手。文章强调模块化设计,提供详细代码示例,适合科研人员、学生和开发者学习AI应用开发。

THMAIL的博客 2501

beautifulsoup的get_text方法没有获取到字符串或者字符串为空

问题: 今天写爬虫时用beautifulsoup解析网页代码发生了很诡异的事情:使用.prettify()方法打印出的代码正常,并且包含文本数据,但是y用.get_text()死活获取不到文本数据,又试了.string和.text,同样获取不到文本 解决: 搜索了很久,并未在互联网上找到有效的解决方案,但是折腾了好久,最后重新把bs4的文档全部重读了一遍,突然感觉是解析器的问题,于是果断换个解析器试试,在这里我用的是html5lib,需要用pip安装下,重新运行代码,果然正常了,坑爹啊,浪费几个.

THMAIL的博客 2442

关于django+uwsgi+nginx出现静态资源404问题合集

问题: 1.Django 直接运行,没问题,静态资源等都正常; 2.Django + uwsgi运行,页面正常,静态资源找不到了; 分析: 翻阅官方文档,发现这么一段: 原文:https://docs.djangoproject.com/zh-hans/3.0/howto/static-files/ 若你使用了前文所述的 django.contrib.staticfiles, runserver...

THMAIL的博客 2326
上一篇: 决策树的 “信息增益” 与 “Gini 系数”:数学原理对比及 Sklearn 参数调优实战
下一篇: KNN 的 “距离度量” 选择:欧氏距离 vs 曼哈顿距离,如何适配不同数据分布?(附高维数据降维后 KNN 优化)
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、付费专栏及课程。

余额充值