精华内容
下载资源
问答
  • 为了提高直流线路保护的可靠性,需要研究能够在故障暂态和稳态过程中均识别故障的后备保护原理。提出了基于故障分量差动电流极性特征的故障全过程差动保护原理。通过对故障暂态阶段(换流器未响应阶段、换流器动态...
  • 从频率电磁测深原理出发,说明了人工源频率测深的电磁场存在3个场区,也只有远区场的控源音频大地电磁...为此提出了加校正直接对比值视电阻率数据进行反演解释,最好按电磁场单分量资料解释,以减少不必要的校正误差。
  • [图] 有向图的强连通分量-原理

    千次阅读 2018-08-14 14:44:51
    求【有向图】的【强连通分量】 【强连通分量】非强连通图有向图 的 极大强连通子图 算法 使用【DFS】 步骤一 思路 有向图G上,从某个顶点出发沿以【该顶点】为【尾的弧】进行DFS ...

    原文链接:https://www.yuque.com/cppdev/algo/kxfg9o
    相关链接

    1. Kosaraju算法:https://blog.csdn.net/summer_dew/article/details/83047190

    背景

    【无向图】如果从s到t存在一条路径,那么我们知道从t到s也存在一条路径
    【有向无环图(DAG)】如果从s到t存在一条路径,那么我们知道从t到s不存在有向路径
    【问题】但是,对于一般的有向图,知道t由s可达并没有给出s是否由t可达的信息
    【强连通分量的提出】为了理解有向图的结构,我们考虑强连通性(strong connectivity),它具有我们寻求的对称性。如果s和t是强连通的(顶点相互可达)–>那么根据定义,t和s也是强连通的
    【如何判断有向图是不是强连通】暴力判断:判断任意两个顶点s,t,看从s是否可以到t,从t是否可以到s。这个算法易于描述和实现,但需要代价很大
    【现代算法设计的胜利】现代算法设计能在线性时间内找出任何图的强分量,它要比蛮力算法快V倍。对于100个顶点,这些算法将比蛮力算法快100倍;对于1000个顶点,这些算法比蛮力算法块1000倍;对于设计数十亿顶点的问题也可以解决。

    有向图的强连通分量

    【强连通(strongly connected)】在有向图中,从我这可以走到你那,从你那能够走到我这–>我们俩强连通
    【强连通图】有向图G,任意两个顶点都强连通–>G是强连通图
    【非强连通图】有向图G,存在两个顶点不能够互相走通–>非强连通图
    【强连通分量】在非强连通图中,顶点最多最大的强连通图–>极大强连通子图–>强连通分量

    【举例】
    在这里插入图片描述
    连通分量

    1. {1,2,3,4}
    2. {5}
    3. {6}

    【求强连通分量】

    1. Kosaraju算法:O(N+M)
    2. Tarjan算法:O(N+M)
    3. Gabow算法
    展开全文
  • 【STM32】TFTLCD驱动原理

    千次阅读 2020-09-07 11:42:32
    TFTLCD原理图03. TFTLCD接口描述04. TFTLCD驱动芯片05. ILI9341命令06. TFTLCD使用流程07. 附录08. 声明 01. TFTLCD简介 TFT-LCD 即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal ...

    00. 目录

    01. TFTLCD简介

    TFT-LCD 即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD 与无源 TN-LCD、STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD 也被叫做真彩液晶显示器。

    该模块有如下特点:
    1,2.4’/2.8’/3.5’/4.3’/7’ 5 种大小的屏幕可选。
    2,320×240 的分辨率(3.5’分辨率为:320480,4.3’和 7’分辨率为:800480)。
    3,16 位真彩显示。
    4,自带触摸屏,可以用来作为控制输入。

    02. TFTLCD原理图

    我们以 2.8 寸的 ALIENTEK TFTLCD 模块为例介绍,该模块支持 65K 色显示,显示分辨率为 320×240,接口为16位的 80并口,自带触摸屏。
    在这里插入图片描述

    模块原理图
    在这里插入图片描述

    03. TFTLCD接口描述

    TFTLCD 模块采用 2*17 的 2.54 公排针与外部连接,接口定义如图所示:
    在这里插入图片描述

    ALIENTEK TFTLCD 模块采用 16 位的并方式与外部连接,之所以不采用 8 位的方式,是因为彩屏的数据量比较大,尤其在显示图片的时候,如果用 8 位数据线,就会比 16 位方式慢一倍以上,我们当然希望速度越快越好,所以我们选择 16 位的接口。

    该模块的 80 并口有如下一些信号线:

    CS:TFTLCD 片选信号。

    WR:向 TFTLCD 写入数据。

    RD:从 TFTLCD 读取数据。

    D[15:0]:16 位双向数据线。

    RST:硬复位 TFTLCD。

    RS:命令/数据标志(0,读写命令;1,读写数据)。

    04. TFTLCD驱动芯片

    ALIENTEK 提供 2.8/3.5/4.3/7 寸等不同尺寸的 TFTLCD 模块,其驱动芯片有很多种类型,比如有:ILI9341/ILI9325/RM68042/RM68021/ILI9320/ILI9328/LGDP4531/LGDP4535/SPFD5408/SSD1289/1505/B505/C505/NT35310/NT35510/SSD1963 等,这里我们仅以 ILI9341 控制器为例进行介绍,其他的控制基本都类似,我们就不详细阐述了。

    ILI9341 液晶控制器自带显存,其显存总大小为 172800(24032018/8),即 18 位模式(26万色)下的显存量。在 16 位模式下,ILI9341 采用 RGB565 格式存储颜色数据,此时 ILI9341的 18 位数据线与 MCU 的 16 位数据线以及 LCD GRAM 的对应关系如图所示:
    在这里插入图片描述

    从图中可以看出,ILI9341 在 16 位模式下面,数据线有用的是:D17~D13 和 D11~D1,D0和 D12 没有用到,实际上在我们 LCD 模块里面,ILI9341 的 D0 和 D12 压根就没有引出来,这样,ILI9341 的 D17~D13 和 D11~D1 对应 MCU 的 D15~D0。

    这样 MCU 的 16 位数据,最低 5 位代表蓝色,中间 6 位为绿色,最高 5 位为红色。数值越大,表示该颜色越深。另外,特别注意 ILI9341 所有的指令都是 8 位的(高 8 位无效),且参数除了读写 GRAM 的时候是 16 位,其他操作参数,都是 8 位的,这个和 ILI9320 等驱动器不一样,必须加以注意。

    05. ILI9341命令

    ILI9341 几个重要命令,因为 ILI9341 的命令很多,我们这里就不全部介绍了,有兴趣的大家可以找到 ILI9341 的 datasheet 看看。里面对这些命令有详细的介绍。我们将介绍:0XD3,0X36,0X2A,0X2B,0X2C,0X2E 等 6 条指令。

    读 ID4 指令

    0XD3,这个是读 ID4 指令,用于读取 LCD 控制器的 ID,该指令如表所示:
    在这里插入图片描述

    0XD3 指令后面跟了 4 个参数,最后 2 个参数,读出来是 0X93 和 0X41,刚好是我们控制器 ILI9341 的数字部分,从而,通过该指令,即可判别所用的 LCD 驱动器是什么型号,这样,我们的代码,就可以根据控制器的型号去执行对应驱动 IC 的初始化代码,从而兼容不同驱动 IC 的屏,使得一个代码支持多款 LCD。

    存储访问控制指令

    0X36,这是存储访问控制指令,可以控制 ILI9341 存储器的读写方向,简单的说,就是在连续写 GRAM 的时候,可以控制 GRAM 指针的增长方向,从而控制显示方式(读 GRAM 也是一样)。该指令如表所示:
    在这里插入图片描述

    从上表可以看出,0X36 指令后面,紧跟一个参数,这里我们主要关注:MY、MX、MV这三个位,通过这三个位的设置,我们可以控制整个 ILI9341 的全部扫描方向,如表所示:
    在这里插入图片描述

    这样,我们在利用 ILI9341 显示内容的时候,就有很大灵活性了,比如显示 BMP 图片,BMP 解码数据,就是从图片的左下角开始,慢慢显示到右上角,如果设置 LCD 扫描方向为从左到右,从下到上,那么我们只需要设置一次坐标,然后就不停的往 LCD 填充颜色数据即可,这样可以大大提高显示速度。

    列地址设置指令

    0X2A,这是列地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置横坐标(x 坐标),该指令如表 所示:
    在这里插入图片描述

    在默认扫描方式时,该指令用于设置 x 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SC 和 EC,即列地址的起始值和结束值,SC 必须小于等于 EC,且 0≤SC/EC≤239。一般在设置 x 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SC 即可,因为如果 EC 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。

    页地址设置指令

    0X2B,是页地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置纵坐标(y 坐标)。该指令如表 所示:
    在这里插入图片描述
    在默认扫描方式时,该指令用于设置 y 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SP 和 EP,即页地址的起始值和结束值,SP 必须小于等于 EP,且 0≤SP/EP≤319。一般在设置y 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SP 即可,因为如果 EP 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。

    写 GRAM 指令

    0X2C,该指令是写 GRAM 指令,在发送该指令之后,我们便可以往 LCD的 GRAM 里面写入颜色数据了,该指令支持连续写,指令描述如表所示:
    在这里插入图片描述

    在收到指令 0X2C 之后,数据有效位宽变为 16 位,我们可以连续写入 LCDGRAM 值,而 GRAM 的地址将根据 MY/MX/MV 设置的扫描方向进行自增。例如:假设设置的是从左到右,从上到下的扫描方式,那么设置好起始坐标(通过 SC,SP 设置)后,每写入一个颜色值,GRAM 地址将会自动自增 1(SC++),如果碰到 EC,则回到 SC,同时 SP++,一直到坐标:EC,EP 结束,其间无需再次设置的坐标,从而大大提高写入速度。

    读 GRAM 指令

    0X2E,该指令是读 GRAM 指令,用于读取 ILI9341 的显存(GRAM),该指令在 ILI9341 的数据手册上面的描述是有误的,真实的输出情况如表所示:
    在这里插入图片描述

    该指令用于读取 GRAM,如表所示,ILI9341 在收到该指令后,第一次输出的是dummy 数据,也就是无效的数据,第二次开始,读取到的才是有效的 GRAM 数据(从坐标:SC,SP 开始),输出规律为:每个颜色分量占 8 个位,一次输出 2 个颜色分量。比如:第一次输出是 R1G1,随后的规律为:B1R2→G2B2→R3G3→B3R4→G4B4→R5G5… 以此类推。如果我们只需要读取一个点的颜色值,那么只需要接收到参数 3 即可,如果要连续读取(利用 GRAM地址自增,方法同上),那么就按照上述规律去接收颜色数据。

    06. TFTLCD使用流程

    在这里插入图片描述

    任何 LCD,使用流程都可以简单的用以上流程图表示。其中硬复位和初始化序列,只需要执行一次即可。而画点流程就是:设置坐标→写 GRAM 指令→写入颜色数据,然后在 LCD 上面,我们就可以看到对应的点显示我们写入的颜色了。读点流程为:设置坐标→读 GRAM 指令→读取颜色数据,这样就可以获取到对应点的颜色数据了。

    07. 附录

    7.1 【STM32】STM32系列教程汇总

    网址:【STM32】STM32系列教程汇总

    08. 声明

    该教程参考了正点原子的《STM32 F4 开发指南》

    展开全文
  • 提出了一种适用于带控...新原理易整定,本身具有选相能力,受电容电流的影响,控串补电容以及可调电抗器的影响,耐受过渡电阻能力强。利用中国电力科学研究院西北750kV系统动模系统参数验证了原理的有效性。
  • 通俗易懂的AI算法原理

    万次阅读 2019-06-27 08:24:55
    我想尽量用直白的语言、较少的数学知识给各位产品经理讲清楚各个算法的原理是什么。 机器学习的过程 机器学习的过程从本质上来说就是通过一堆的训练数据找到一个与理想函数(f)相接近的函数。在理想情况下,对于...

    https://www.toutiao.com/a6706348363916247559/

     

    写给产品经理的机器学习算法入门,在文章中会忽略一些细节以及算法本身具体的实现方式。我想尽量用直白的语言、较少的数学知识给各位产品经理讲清楚各个算法的原理是什么。

    机器学习的过程

    机器学习的过程从本质上来说就是通过一堆的训练数据找到一个与理想函数(f)相接近的函数。在理想情况下,对于任何适合使用机器学习的问题在理论上是存在一个最优的函数让每个参数都有一个最合适的权重值,但在现实应用中不一定能这么准确得找到这个函数,所以我们要去找与这个理想函数相接近的函数,能够满足我们的使用那么我们就认为是一个好的函数。

    这个训练数据的过程通常也被解释为在一堆的假设函数(Hypothesis set)中,它是包含了各种各样的假设,其中包括好的和坏的假设,我们需要做的就是从这一堆假设函数中挑选出它认为最好的假设函数(g),这个假设函数是与理想函数(f)最接近的。

    通俗易懂的AI算法原理

    机器学习过程

    机器学习这个过程就好比在数学上,我们知道了有一个方程和一些点的坐标,用这些点来求这个方程的未知项从而得到完整的方程是什么。但在机器学习上我们往往很难解出来这个完整的方程是什么,所以我们只能通过各种手段求最接近理想情况下的未知项取值,使得这个结果最接近原本的方程。

    什么问题适合用机器学习解决

    机器学习不是万能的,并不能解决所有的问题。通过以上机器学习的过程可以看出来,实质上机器学习是通过已知经验找到规律进行预测。

    银行想知道应该发放多少贷款给某个客户时,可以根据过往成功放贷的数据找出每个贷款区间的人群特点、自身的房车资产状况等,再看看这个客户的特点符合哪个区间去确定应该发放多少贷款,这就是适合用机器学习去解决的问题。

    通俗易懂的AI算法原理

    三个要素与功能

    对于适合用机器学习解决的问题,台大的林轩田教授为我们总结了三个要素:有规律可以学习、编程很难做到、有能够学习到规律的数据;满足这三个条件的问题,我们都可以挑选合适的算法去解决。

    基于以上的条件,通常我们可以用机器学习解决三类问题:

    预测(回归):根据已知数据和模型,预测不同客户应该发放的贷款额度是多少;

    判别(分类):与预测有点类似,也是根据模型判别这个客户属于过往哪一类客户的概率有多大;

    寻找关键因素:客户的属性非常多,通过模型我们可以找出对放贷影响最大的因素是什么;

    感知机 Perceptron Learning Algorithm,PLA

    感知机学习算法是一种二分类的线性分类算法,一般用来解决二分类(只存在两个结果)的问题。例如我们判断一个同学的考试成绩合格还是不合格,银行会不会给某个客户发放贷款等,像这种只存正、负两个结果的问题就称为二分类的问题。

    感知机学习算法的原理非常好理解,有点类似考试的概念,把很多个影响因素看成每道题的得分,因为不同题目的权重不同,所以我们每道题的得分由权重(重要程度)和这个因素的得分相乘,最后把所有题目的得分加起来看看有没有超过60分(阈值),如果超过了就是及格了(正结果),即对应的输出值为1,如果没有超过就是不及格(负结果),对应的输出值为-1。

    还是以刚才银行贷款的例子来解释,通常银行判断给不给某个客户放贷款都是掌握了客户的各种信息如年薪、负债情况、社保缴费、公积金等等,因为数据的维度不同,描述的单位也不同,我们需要把这些数据按照各自维度的标准统一成可以量化的评分,可以按照年薪在5W以下得1分、5-10W得2分这样的方式进行量化。每个维度的重要程度都不同,所以我们在相加的时候需要考虑为每个值加上一个权重,最后得出来的结果看看有没有高过放款的阈值评分,如果高过这个分数就放款,低过这个分数就不放款。

    首先看看关于感知机的数学定义:

    通俗易懂的AI算法原理

    感知机的定义

    我们可以转换到几何的方式去看这个问题,在二维空间内,训练的数据就变成了平面上的一个点,这些数据里面有正样本以及负样本(成功放贷款的以及没有放贷款的),感知机算法的学习过程就是找到一个平面(在二维中表现为一条线),能够把所有的正样本和负样本区分开来,那么在应用的时候面对新来的客户,通过模型算出是正结果,我们就可以给这个客户发放贷款,算出来是负结果,我们就不发放贷款。

    通俗易懂的AI算法原理

     

    怎么去找到这条线(超平面)呢?

    感知机使用的学习策略是梯度下降法,这种方法的思想是先在平面内随便找一条线,然后开始把样本点放到平面内,当一个点被误分类,即位于分类超平面错误的一侧时,调整模型的参数(w和b),使分类超平面向该误分类点的一侧移动,以减少该误分类点与超平面的距离,直到超平面越过该误分类点使其被正确分类为止。

    通俗易懂的AI算法原理

     

    感知机利用梯度下降法的训练过程

    这种方式对于模型的训练非常快速,计算量相对较小,但同时这样的计算方式追求最大程度正确划分,最小化训练数据的错误,效果类似下图的直线,会导致比较容易造成过拟合的情况,即模型对于新数据的包容性差,过度得把新输入数据分成错误的类别。

    线性回归 Linear regression,LR

    讲逻辑回归之前,我们先讲讲什么是线性回归。在统计学中,线性回归是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。举个直观的例子,深圳春运时的客流量可能是与过年的时间相关的,越接近过年这天人流量越大,如下图所示:

    通俗易懂的AI算法原理

     

    如果客运站想预测一下明天后天的客流量该这么办呢?

    我们可以用一条线去尽量准的拟合这些数据,如果有新的数据输入进来,我们就可以找到对应的预测点:

    通俗易懂的AI算法原理

     

    上述例子就是一个最简单的一元线性回归分析:y=ax+b,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示。收集的数据中,每一个分量,就可以看做一个特征数据。例如上述例子的日期是一个特征,我们还可以找到地区、节假日、其他车站的客流量等等不同的因素,每个特征至少对应一个未知的参数。这样就形成了一个线性模型函数,当特征变多时,上述线性回归的向量可表示为一个矩阵方程。但这个矩阵方程由于计算量太大很难直接去求解,那么我们要怎么样去找到这根线的位置呢?

    在这里我们可以退一步,把参数求解的问题,转化为求最小误差的问题,让实际值与预测值之间的误差变得最小,那么我们的预测值就十分接近实际值了。这就是损失函数的来源,在机器学习的算法中实际上存在大量由于计算量巨大从而无法求解的问题,我们都是把这类问题转化成求最小误差,即实际值与预测值之间的误差(损失)问题,想办法求出让误差最小的情况就可以得到问题的最优解。线性回归方程的损失函数通常是通过最小二乘法或梯度下降法求解,在这里我们不展开叙述。

    通俗易懂的AI算法原理

     

    线性回归是目前运用最广泛的模型之一,在金融、经济学、医学等领域常常用来解决预测类问题,通过观测数据集拟合出一个预测模型,告诉我们一组特定数据是否在一段时间内会增长或下降。

    逻辑回归 Logistic regression,LR

    逻辑回归实际上也是一个线性回归模型,但是线性回归常常用来做预测,逻辑回归却常常用来解决二分类问题。为什么会有这么大的差异呢?

    如果对于上面的感知机算法来说,目标是为了找到一个能够将正负样本完全分开的超平面,从另外一个层面看感知机算法相当于是一个跃阶函数,我们只需要找到阈值并且拿输入的数据对比是大于还是小于这个阈值,然后就能给出的就是0或1(正/负样本)的反馈。

    对应到数学模型上我们只需要把算出来的结果映射到这个跃阶函数上看看大于0还是小于0就能说他是一个正样本还是负样本。

    通俗易懂的AI算法原理

     

    感知器的模型虽然简单直观,但问题在于这个模型不够光滑,如果对于一个新的样本点我们计算出来结果等于0.01,只比0大了一点点就会被分类为正样本,这样在实际应用的时候可能会不够准确,同时这个函数在0处有一个跃阶导致这一点不连续,在数学上也不好处理。

    那么有没有什么方法可以让这个函数更光滑一点呢?

    在数学上刚好存在一个sigmoid函数有这样的特性。这个函数的输入范围是−∞→+∞,而值域则光滑地分布在0到1之间。对于这个模型的解释和感知机也稍微有些区别,感知机是根据输入的条件,判断是一个正样本还是负样本,而逻辑回归因为值域分布在0到1之间的特性,所以输出的是判断是一个正样本或负样本的概率是多少。我们的学习策略即是求所有训练样本的条件概率之积的最大值,也可以理解为求概率之积尽可能大,这样模型预测的效果就会越准确。

    通俗易懂的AI算法原理

     

    逻辑回归的本质上是一个线性回归模型,只是在特征到结果的映射中加入了一层函数映射,即先把特征线性求和,然后使用函数g(z)将最为假设函数来预测。我们看到的参数z实际上也是一个线性回归的方程,只不过在这里符号化表示。实际上求解的方式与线性回归是相同的,都是要通过损失函数的方式逼近最优解。

    逻辑回归的目的是将样本分成0或1两类,但是我们也关心样本分类的准确性,例如一个肿瘤被预测出来是恶性的,我们也会关心它是恶性的可能性有多大。对逻辑回归的理解也可以是:我们通过概率将样本分成了0和1两类。

    因为逻辑回归不像感知机是通过一个固定的阀值去判断样本数据的正负性,所以在二维平面上也不再是通过一条直线去判断数据,而是变得更加有包容性,可以把一些不能线性区分的数据集区分开来,其根本原因就是sigmoid函数把因变量自变量变成了曲线的关系,使得在函数在二维平面上的表现更为柔和,这里面损失函数发挥了很大的作用,这里不再展开说明。

    逻辑回归与感知机相比,有三方面的优势:

    1.直接对分类可能性建模,不需要事先假设数据的分布情况。感知机算法中如果不先假设一下数据的分布再去确定线的位置很可能会算错,但是逻辑回归算法就避免了这个问题;

    2.不仅可以预测出类别,还可以给出具体的概率预测值。对预测结果有更好的解释性;

    3.有很好的数学性质,方便计算,工程量较小;

    逻辑回归算法因其优点是现在最广泛使用的算法之一,常常用来做寻找某一疾病的危险因素、个人信用评估、贷款/金融意图预测等等领域,同时也可以用来对数据做自动判别分析,比如一条评论是正面还是负面,一个用户的购买路径是男性还是女性,预测用户会不会购买某种商品等等,逻辑回归应用广泛还是因为许多现实问题跟它的模型吻合,能够帮助我们快速解决很多实际的问题。

    K近邻分类算法 K-Nearest Neighbor,KNN

    上面我们说到感知机以及逻辑回归实际上都是一种二分类算法,非黑即白,如果遇到多分类问题该如何解决呢?有一种非常简单的算法可以帮助我们快速解决这个问题——K近邻分类算法。

    K近邻分类算法是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。

    用官方的解释来说,所谓K近邻算法,即存在一个样本数据(训练样本)集,并且样本中每个数据都存在标签(类别),也就是说样本集中每一个数据都被分到一个类别中。输入新的数据后,将新数据的每个特征与样本集中的数据对应的特征进行比较,然后算法提取样本集中特征最相似的数据的分类标签,即可以为新输入的数据进行分类。

    通俗易懂的AI算法原理

     

    在训练数据集中找到与该实例最邻近的K个实例, 这K个实例的大多数都属于同一个分类,就把该输入实例分类到这个类中。一般情况下,我们只选择样本集中前K个最相似的数据,这就是K近邻算法中k的出处,比较3个最近的数据,那么K=3。通常K是不大于20的整数,最后,选择K个最相似的数据中出现次数最多的分类,作为新数据的分类。

    这种思想实际上也非常好理解,有点像“人以类聚,物以群分”的说法,如果你身边的邻居都来自同一个公司,那么你极有可能也属于某个公司。如果你身边的朋友绝大多数都属于某个学校毕业,那么你极有可能也曾经在这个学校读过书。这种方式也很类似投票机制,新来的数据与旧数据相比对,多数都属于某个类别时,采用少数服从多数的原则,给新数据归类。

    同样我们转化到几何的方式去看这个算法,KNN可以看成:有那么一堆你已经知道分类的数据,然后当一个新数据进入的时候,就开始跟已知数据里的每个点求距离,然后挑离这个训练数据最近的K个点看看这几个点属于什么类型,就把这个新的点归到这个同属大多数的类别里。

    通俗易懂的AI算法原理

     

    K近邻分类算法的优缺点都非常明显。优点主要有两个方面:

    1.精度很高,对异常数据也不敏感(所属类别是由大多数点决定了,一两个异常点不会有太大的影响)

    2.与上面的PLA、LR算法相比,不需要训练模型,易于实现,来一个新数据就可以马上进行比对。

    缺点则是计算复杂度比较高,因为要算新数据与每一个临近点的距离,当维度超过二维时这就是一个空间复杂度很大的矩阵。

    基于KNN算法的特点,目前主要应用在文本分类与商品推荐等场景,在文本分类中像信息检索、手写字识别、机器翻译这样的场景都可以使用KNN算法以保证在有限的硬件资源下,提供给用户一个高效的检索系统。

    朴素贝叶斯分类器 Naive Bayes Classifier,NBC

    贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理和特征条件独立假设为基础,故统称为贝叶斯分类。而朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。

    朴素贝叶斯的简单之处在于:对于给出的待分类项,求解在此待分类项出现的条件下各个类别出现的概率,哪个概率最大,就认为此待分类项属于哪个类别,这就有点像我们走在街上,迎面走过来一个黑色皮肤的人,那我们就猜他是非洲人,因为黑人中非洲人最多。

    通过上述例子我们可以看到,我们判断一个人是非洲人基于一个很关键的信息,因为他是黑色皮肤的人。所以我们的判断实际上是发生在“拥有黑色皮肤”这件事的情况下我们的推断,这种在其他已知事件发生的基础上计算某件事发生的概率叫做条件概率,一般我们使用贝叶斯定理求解条件概率。

    要搞懂贝叶斯定理之前,我们首先要搞懂什么是正向概率什么是反向(条件)概率。在贝叶斯研究之前, 人们已经能够计算正向概率,比如“假设袋子里有N个白球M个黑球,你伸手进去摸一把,摸出黑球的概率有多大”。然而在我们实际生活中,日常能观察到的只是事物表面的结果,往往我们只知道从袋子里取出来的球是什么颜色,并不能看到袋子里的实际情况。这时候我们就希望有一些方法可以通过观察这些取出来的球的颜色,可以推测出袋子里面黑白球的比例是什么样的。

    我们通过下图简单讲一下贝叶斯定理的组成:

    通俗易懂的AI算法原理

     

    朴素贝叶斯分类器的核心在于训练模型阶段,需要计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。

    通俗易懂的AI算法原理

     

    让我们通过一个贝叶斯分类器解决拼写检查/纠正的例子加深理解,当一个用户输入了一个不在字典中的单词时,我们需要去猜测这个人到底想要输出的单词是什么呢?如果用户输出了一个theu,那么他到底是想输入they还是then?到底哪个猜测的可能性更大?

    这个问题实际上是在求“已知输入theu的情况下,我们猜测他想输出they hen的概率谁更大”用上述符号表示即P(B|A),我们可以很容易计算出they hen单词的词频P(B)、那么要怎么得到P(A|B)呢?在这里可以用输入单词与正确单词在键盘上的距离来表示P(A|B),即通过字母在键盘上的距离判断下输入哪个字母的可能性更高,比如在键盘上Y和U离得更近所以我们会认为输入Y但是不小心按成了U的概率更大一些。通过上述的信息就可以计算出输出哪个单词的概率更大。

    朴素贝叶斯分类器的以下优点:

    1.生成式模型,通过计算概率来进行分类,可以用来处理多分类问题而且分类的结果很容易被解释;

    2.所需估计的参数不大,对缺失数据不太敏感;

    3.无需复杂的迭代求解框架,适用于规模巨大的数据集。

    除了上述说到的拼写纠正以外,贝叶斯分类器还经常用在垃圾邮件分类、文字广告过滤、识别恶性评论等等领域。在许多场景下,朴素贝叶斯分类算法可以与后续讲到的决策树、神经网络算法相媲美,而且方法简单、分类准确率高、速度快。但这个算法也有一些像对输入数据的形式比较敏感、计算先验概率时分类决策可能存在错误这样的缺点,在使用的时候还是要根据具体的场景选择。

    展开全文
  • 地震检波器是地震勘探工作中不可或缺的设备。三分量全光纤加速度检波器[3]相比于其它类型的地震检波器而言,具有灵敏度高、检测范围大、抗电磁干扰等诸多优点,是地震检波器的发展方向,具有广阔的应用前景。 三...
  • 本文简要介绍其分类、原理与在功率分析仪领域的应用。 滤波器作用 1. 将有用信号与噪声分离。 2. 抑制关心的频率成分,提高信号的分析精度。 滤波器的分类 根据所通过信号的频段,滤波器分为低通、高通、...
  • 通过深度优先搜索求强连通分量

    千次阅读 2016-04-14 15:59:51
    基本步骤: 1.对图G进行深度优先搜索,记录每个节点的d,f;...3.按照步骤一所求的节点的f,按照降序,对Gt进行深度优先搜索,得到的深度优先森林,森林中深度为1所形成的每个树,即为各个强连通分量

    基本定义:
    图G(V,E)中,在深度搜索时为每一个节点记录两个时间戳,分别是开始扫描的时间d和将其所有子节点全部扫描完的时间f;
    定义d(U)为节点集U中d的最小值,定义f(U)为节点集U中f的最大值。

    基本步骤:
    1.对图G进行深度优先搜索,记录每个节点的d,f;
    2.求图G的转置Gt(所有节点不变,边的方向变反);
    3.按照步骤一所求的节点的f,按照降序,对Gt进行深度优先搜索,得到的深度优先森林,森林中深度为1所形成的每个树,即为各个强连通分量

    具体代码:

    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.Scanner;
    /**
     * 
     * @author Founder
     * 通过深度优先搜索,查找强连通分量
     */
    public class Main{
        static int time = 0; //时间戳
        static ArrayList<Integer> topology; //记录第一次搜索结果的拓扑排序
        public static void main(String[] args){
            /**
             * 输入方式:
             * 第一行输入节点的个数n
             * 后面n行输入第n个节点(从0开始数)链接的子节点,没有子节点则直接换行
             */
            Scanner input = new Scanner(System.in);
            int n = input.nextInt();
            Node[] nodes = new Node[n];
            topology = new ArrayList<>();
            for(int i = 0; i < n; ++i){
                nodes[i] = new Node();
            }
    
            input.nextLine();
    
            for(int i = 0; i < n; ++i){
                String line = input.nextLine();
                if(!line.equals("")){
                    String[] tempIntStr = line.split(" ");
                    for(int j = 0; j < tempIntStr.length; ++j){
                        nodes[i].addLinkNodes(Integer.parseInt(tempIntStr[j]));
                    }
                }
            }
    
            dfs(nodes);
            /**
             * 准备第二次深度优先搜索,先构造转置图
             */
            Node[] secondNodes = new Node[n];
            for(int i = 0; i < n; ++i){
                secondNodes[i] = new Node();
            }
            for(int m = 0; m < n; ++m){
                LinkedList<Integer> linkNodes = nodes[m].getLinkNodes();
                for(int q = 0; q < linkNodes.size(); ++q){
                    secondNodes[linkNodes.get(q)].addLinkNodes(m);
                }
            }
            /**
             * 开始第二次搜索
             */
            secondDfs(secondNodes);
        }
    
        public static void dfs(Node[] nodes){
    
            for(int i = 0; i < nodes.length; ++i){
                if(nodes[i].getColor() == Node.WHITE)
                    dfsVisit(nodes,i);
            }
        }
        /**
         * 主要完成两个工作:设置颜色,设置时间戳
         * 附加工作:记录拓扑排序数组
         * @param nodes
         * @param no
         */
        public static void dfsVisit(Node[] nodes,int no){
            time++;
            nodes[no].setColor(Node.GRAY);
            nodes[no].setD(time);
            LinkedList<Integer> linkNodes = nodes[no].getLinkNodes();
            for(int i = 0; i < linkNodes.size(); ++i){
                Node temp = nodes[linkNodes.get(i)];
                if(temp.getColor() == Node.WHITE){
                    temp.setParent(nodes[no]);
                    dfsVisit(nodes,linkNodes.get(i));
                }
            }
            nodes[no].setColor(Node.BLACK);
            topology.add(no);
            time++;
            nodes[no].setF(time);
    
        }
    
        /**
         * 与第一次的dfs基本相同,唯一的不同是遍历顺序按照拓扑排序进行
         * @param nodes 图G的节点数组
         */
        public static void secondDfs(Node[] nodes){
    
            for(int i = topology.size() - 1; i >= 0; --i){
                if(nodes[topology.get(i)].getColor() == Node.WHITE)
                    secondDfsVisit(nodes,topology.get(i));
            }
        }
        /**
         * 与第一次dfsVisit基本相同,具体有“两增两减”,不同点如下:
         * 1.增加输出当前结点编号
         * 2.不再记录时间戳(因为后面不会再用到这些数据)
         * 3.不再记录拓扑排序(因为后面不会再用到这些数据)
         * 4.回到优先搜索森林深度为1的节点(即没有设置父节点的节点)时,输出换行,代表一个强连通分量的结束
         * @param nodes 图G的节点数组
         * @param no 当前父结点
         */
        public static void secondDfsVisit(Node[] nodes,int no){
            System.out.print(no + " ");
            nodes[no].setColor(Node.GRAY);
            LinkedList<Integer> linkNodes = nodes[no].getLinkNodes();
            for(int i = 0; i < linkNodes.size(); ++i){
                Node temp = nodes[linkNodes.get(i)];
                if(temp.getColor() == Node.WHITE){
                    temp.setParent(nodes[no]);
                    secondDfsVisit(nodes,linkNodes.get(i));
                }
            }
            nodes[no].setColor(Node.BLACK);
            if(nodes[no].getParent() == null){
                System.out.println();
            }
        }
    
    }
    
    
    class Node{
        public static final int WHITE = 0;
        public static final int GRAY = 1;
        public static final int BLACK = 2;
    
        private int color = WHITE;
        private int d = 0;
        private int f = 0;
        private Node parent = null;
        private LinkedList<Integer> linkNodes = null;
    
        public Node(){
            linkNodes = new LinkedList<>();
        }
    
    
        public int getColor() {
            return color;
        }
        public void setColor(int color) {
            this.color = color;
        }
        public int getD() {
            return d;
        }
        public void setD(int d) {
            this.d = d;
        }
        public int getF() {
            return f;
        }
        public void setF(int f) {
            this.f = f;
        }
        public Node getParent() {
            return parent;
        }
        public void setParent(Node parent) {
            this.parent = parent;
        }
        public LinkedList<Integer> getLinkNodes() {
            return linkNodes;
        }
        public void setLinkNodes(LinkedList<Integer> linkNodes) {
            this.linkNodes = linkNodes;
        }
        public void addLinkNodes(int no){
            linkNodes.add(no);
        }
    
    }
    
    

    示例:
    示例图片
    输入:
    8
    1
    4 5
    3 6
    2 7
    0 5
    6
    5 7
    7
    输出:
    2 3
    0 4 1
    5 6
    7

    基本原理:
    整个算法围绕着一个核心思想求解:对于图G总是从f(U)大的强连通分量指向f(U)小的强连通分量,对于G的转置Gt,则总是根据第一步算出来的f(U),从f(U)小的强连通分量指向f(U)大的强连通分量(这里可以这样理解,因为强连通是双向可达,所以转置对于强连通内部没有影响,对强连通分量之间,则指向关系发生了反转)。这里关于图G的f(U)的大小问题,待会会做证明,我们先往下看。

    现在我们证明,对于图G总是从f(U)大的强连通分量指向f(U)小的强连通分量,假设存在(u,v),u属于结点集C1,v属于结点集C2,因为u指向v,所以显然u.f>v.f(不理解的请参考上一篇博文:拓扑排序),并且,v在结点集C2中没有父节点,因此是f最大的节点,所以v.f=f(C2),因此f(C1)>u.f>v.f=f(C2),即f(C1)>f(C2).

    上述证明只是描绘出了原理要点,还有一系列诸如“图G与其转置Gt具有相同的强连通分量”之类比较显然的条件没有提及,不足之处,还请谅解!

    展开全文
  • Android 音频倍速的原理与算法分析

    千次阅读 多人点赞 2021-10-31 00:58:15
    音视频倍速 是内容类APP非常重要的功能,其内部包含了 视频流 和 音频流 的倍速,其中视频倍速原理相对简单,即在解码视频帧时提升帧率即可。 音频倍速 相对复杂,众所周知,声音的本质其实是 物体振动时产生的声波...
  • HDR原理与实现

    2017-11-01 18:13:54
    HDR 已成为目前游戏应用不可或缺的一部分。通常,显示器能 够显示 R、G、B 分量在[0,255]之间的像素值。而 256 个不同的亮度级别显然不能表示自然 界中光线的亮度情况。比如,太阳的亮度可能是一个白炽灯亮度的几千...
  • BP神经网络简单介绍在60年代提出了神经网络概念之后,由于感知机等神经网络无法处理线性不可分问题(比如异或问题)导致人们对神经网络的兴趣大减,认为神经网络的能力有限,只能处理线性可分问题。之后,有人提出了...
  • spark作业调度原理

    千次阅读 2018-05-31 15:21:52
    此模式的一个缺点是:当一个application需要重新获得属于自己的核心时,可能由于借用core的application正在计算而需要等待,造成不可预测的延迟。开启这种模式,只需要使用memos://URL以及spark.mesos.coarse设置为...
  • 关于ECG信号的形态学滤波原理

    千次阅读 2019-08-01 14:02:38
    将 结构元素k2 对f1 进行上述类似运算, 得到基线 漂移有关信号分量f2, 即 f2 = 1 2 [OC(f1, k2) + CO(f1, k2)]. 结构元素k2 的宽度由心电信号的采样频率Fs 和特征波形的时间宽度T (QRS波群约0.1 s) 所 决定. 用闭...
  • 本文简要介绍其分类、原理与在功率分析仪领域的应用。 滤波器作用 1. 将有用信号与噪声分离。 2. 抑制关心的频率成分,提高信号的分析精度。 滤波器的分类 根据所通过信号的频段,滤波器分为低通、高通、...
  • 分量分析PCA

    千次阅读 2017-04-20 17:44:40
    本次实验分为两部分,第一部分:利用PCA,通过自定义函数PCA_two(MU,SIGMA,N)进行特征空间的规整化。第二部分:利用PCA,通过自定义函数PCA_three...经过本次实验,了解了PCA主分量分析的基本概念,学习和掌握了PCA主分
  • 编译原理

    万次阅读 多人点赞 2019-06-05 23:00:32
    编译原理基本知识总结,基于MOOC陈鄞老师的课程。
  • 为什么编译原理被称为龙书?

    千次阅读 多人点赞 2020-07-17 08:32:21
    什么是编译原理 计算机是只认识二进制的,但是我们平常开发中根本不会使用二进制进行开发,我们使用的都是 Java、C 这类的高级语言,每种语言都会经过一系列的转换才能被计算机识别,那么到底是谁做的这项工作呢?...
  • 已知共线的三点在两个坐标系下面的坐标,求解 两个坐标系的转换参数,精度满足一般程度上的定位需求。步骤清楚,直接上手code
  • 数据库原理—关系数据库

    千次阅读 2020-09-05 19:58:37
    一、思维导图: 二、基本知识点: ...(3)笛卡尔积:表示一张二维表,表中每一行一个元组,表中每一列一个域 2、关系的定义 (1)关系: D1******Dn中有关系的行形成的一个子集称为D1******Dn的一个关
  • opencv之SURF算法原理及关键点检测

    万次阅读 多人点赞 2017-04-18 10:51:54
    2.Surf原理 特征点的提取基于尺度空间理论,我们通过检测图像局部极值点来锁定特征点坐标,即局部的最亮点或最暗点。 2.1构建Hessian矩阵 SURF算法检测特征点是基于Hessian矩阵实现的,Hessian矩阵是SURF...
  • OpenGL原理介绍

    千次阅读 2019-04-09 09:18:03
    OpenGL是Open Graphics Library的缩写[2],是个定义了一个跨编程语言、跨平台的编程接口的标准,显卡通常有OpenGL的实现,不同显卡上的OpenGL实现也一定相同,OpenGL标准不是平台相关的,所以同一个程序可能在不同...
  • 信息与通信工程学科面试准备——通信原理

    千次阅读 多人点赞 2020-06-15 20:16:58
    面试准备—通信原理 1.模拟通信系统的性能指标 ①有效性:用所传信号的有效传输带宽来表征,越小越有效。 ②可靠性:输出信噪比(仅考虑加性干扰):接收端输出的信号平均功率与噪声平均功率之比 2.数字通信系统性能...
  • ADC采样原理

    万次阅读 多人点赞 2019-06-02 23:21:57
    中国是全球最主要的芯片需求方,但是国内能造出高精度ADC芯片的企业微乎其微,即便造出来性能与价格也跟上市场节奏故市场占有率几乎为0。 芯片千万种,ADC芯片就是最难造的之一。真实世界的模拟信号,例如温度、...
  • 首先,我们先来了解下数字基带信号的功率谱密度p(f),该功率谱密度表达式参考通信原理书(对我们分析无关紧要,重要特点我会说明),该表达式主要由连续谱和离散谱组成 对于单极性信号,有归零与归零之分: 单极性...
  • 小波变换教程(1):基本原理

    千次阅读 多人点赞 2018-03-21 11:27:18
    这其中大部分都是由数学专业人士写给其他同行看的,不过,仍然有大量数学专家知道其他同行们讨论的是什么(我的一个数学教授就承认过)。换言之,大多数介绍小波变换的文献对那些小波新手们来说用处不大(此为个人...
  • 原理将同杆双回输电线路看作一个被保护单元,并利用六序分量法分解出的同序负序电压和同序负序电流构成方向元件在系统发生对称故障时,此方向元件具有明确的方向性,若配合选相元件和通信通道则保护原理可作为同杆...
  • 沈师 数据库原理 PTA 选择题答案

    千次阅读 多人点赞 2021-06-08 18:14:03
    下面对数据模型的正确叙述是( )。 A. 逻辑层次上的数据模型有三个要素:数据结构、数据操作、数据完整性约束。 B. 数据模型分为三个层次:概念模型、逻辑模型、物理模型。 C. 到目前为止,逻辑数据模型只有三...
  • 那在这里有什么讨论的必要呢,要知道在车辆行驶中,我们可以拿到GPS的yawrate和speed信号,而且车辆本身还有一套传感器获取yawrate和speed,又因为航迹推算是自动驾驶很重要的一部分,所以理解惯性导航的工作原理,...
  • 1、永磁同步电机控制原理 1.1 从PMSM电机的数学模型出发 dq 轴 电压方程:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,059
精华内容 12,023
关键字:

不可分量原理