精华内容
下载资源
问答
  • 人工智能方法实现汉诺塔,启发式搜索解决汉诺塔问题
  • 高级人工智能实现方法

    千次阅读 2014-12-08 23:14:26
    什么是人工智能 人工智能的定义可以分为两部分,即“人工”和“智能”。“人工”比较好理解,争议性也不大。有时我们会要考虑什么是人力所能及制造的,或者人自身的智能程度有没有高到可以创造人工智能的地步,...

    什么是人工智能

    人工智能的定义可以分为两部分,即“人工”和“智能”。“人工”比较好理解,争议性也不大。有时我们会要考虑什么是人力所能及制造的,或者人自身的智能程度有没有高到可以创造人工智能的地步,等等。但总的来说,“人工系统”就是通常意义下的人工系统。

    关于什么是“智能”,就问题多多了。这涉及到其它诸如意识consciousness)、自我self)、心灵mind,包括无意识的精神unconscious_mind))等等问题。人唯一了解的智能是人本身的智能,这是普遍认同的观点。但是我们对我们自身智能的理解都非常有限,对构成人的智能的必要元素也了解有限,所以就很难定义什么是“人工”制造的“智能”了。因此人工智能的研究往往涉及对人的智能本身的研究。其它关于动物或其它人造系统的智能也普遍被认为是人工智能相关的研究课题。

    人工智能目前在计算机领域内,得到了愈加广泛的发挥。并在机器人,经济政治决策,控制系统仿真系统中得到应用。

    来自维基百科  人工智能 条目

    如何实现人工智能

    自从人工智能诞生以来,人们就没有停止过尝试去实现它,但是进展就不像人们想象的那般容易,至今我们仍然没有看到一个可以真正意义上被称为人工智能的产品。本片讨论的内容也是关于实现人工智能的方法。

    人工智能发展历史已经有几十年,这段时间内,实现的方法也是多种多样,有偏理论的在计算机系统构建软件人工智能,也有在特殊硬件上实现热定的人工智能。我们这里讨论的是一种非常极端的方法,那就是完全实现一个人工智能,从头到尾。

    人工智能的特点

    我们实现的人工智能,依然是以学习为主,开始的时候,并不能完成高级的动作,只能够在实际的学习中掌握。

    展望


    这篇草稿放在草稿箱好久好久了,还是把他贴出来,鼓励一下自己。在这个领域的研究一直止步不前,没有什么动力,也许靠着是不是发表一些相关文章可以激励自己不断深入的研究下去,也不枉费当初那片豪情。

    要想真正实现一个人工智能,难度是世界性的,但是我依然希望自己能在通往最后胜利的道路上贡献自己微博的力量。以此博客为志,慢慢更新吧。
    展开全文
  • BP神经网络的Matlab实现——人工智能算法

    万次阅读 多人点赞 2018-01-27 23:07:23
    这几天在各大媒体上接触到了人工智能机器学习,觉得很有意思,于是开始入门最简单的机器算法——神经网络训练算法(Neural Network Training);以前一直觉得机器学习很高深,到处是超高等数学、线性代数、数理统计。...

    这几天在各大媒体上接触到了人工智能机器学习,觉得很有意思,于是开始入门最简单的机器算法——神经网络训练算法(Neural Network Training);以前一直觉得机器学习很高深,到处是超高等数学、线性代数、数理统计。入坑发现确实是这样!但是呢由项目实例驱动的学习比起为考试不挂科为目的的学习更为高效、实用!在遗传算法、神经网络算法的学习入门之后觉得数学只要用心看没问题的(即使是蒙特卡洛和马尔科夫问题),但是呢需要把数学统计应用到程序中,来解决实际的问题这是两码事。主要呢还是需要动手打代码。下面呢是今天的机器学习之神经网络学习入门记录篇,希望帮助到同样入门采坑的哥们,一起进步!

    一、主题闲扯

    神经网络学习-顾名思义,就是类似我们人类的学习方式,通过模拟神经元的活动,在神经系统中进行信息处理、存储记忆和反馈的生物机理功能。其实这样是机器学习算法的共性吧,所有的智能算法都是善于发现生活中的常见情节推广到计算仿真的范畴,例如:遗传算法、烟花算法、蚁群算法、模拟退火算法等等。
    神经网络学习是人工智能领域的基本算法之一,它是在1943年被心理学家McCulloch和数学家Pitts合作提出的数学模型。并在之后不断完善发展到今天的。它的主要应用领域涉及到模式识别、智能机器人、非线性系统识别、知识处理等。

    二、算法理论

    2.1、人工神经元模型
    神经元模型

    这里我们先解释一下机器学习的一些特性,总体来说呢,机器学习的核心就是学习。这个学习过程呢就是通过已知来训练机器。比如:我们通过大量的青蛙图像数据样本来进行输入训练算法,使得我们给这个程序算法一张新的青蛙图像,它能利用训练数据的学习来判断我们新给它的图像数据是青蛙。所以呢,机器学习算法来说就是通过输入变量到算法,算法通过分析反馈进行判断,最后做出结果。
    在上图中是简化的神经元模型,我们的Xi是一系列的输入变量,对应在其箭头方向上的是一个权重系数。权重系数呢是为了消除样本数据的偏差,通常是一个rand函数在0-1之间的取值。通过输入变量Xi和其自己的权重系数Wi的乘积的求和输入到神经元上。此时神经元得到了输入变量和其权重的乘积累加和。通过映射函数F(x)来进行映射得到结果。以上就是一个简单的神经元模型和信息传递过程。
    这里写图片描述

    也可以简化成下面的数学推导公式:我们可以把输入变量和对应权重变换成矩阵相乘,这在Matlab中的运算时是十分有利的。
    这里写图片描述

    对于以上的输入变量和对应权重值我们很容易处理,但是这个模型的核心是基于激活函数F(x)的,下面是我们常见的一些激活函数:
    激活函数

    2.2、神经网络模型
    我们的神经网络是由若干的神经元连接而成的,我们常见的模型分类为:
    1、连接方式:前向神经网络和递归神经网络*(反馈神经网络)
    2、训练方式:监督式学习和非监督式学习
    3、按照实现功能:拟合(回归)神经网络 vs. 分类神经网络

    2.3、BP(反向传递)神经网络概述:
    概述、
    1、Backpropagation is a common method of teaching artificial neural networks how to
    perform a given task.
    2、It is a supervised learning method, and is a generalization of the delta rule. It
    requires a teacher that knows, or can calculate, the desired output for any input in
    the training set.
    3、 Backpropagation requires that the activation function used by the artificial neurons
    (or “nodes”) be differentiable

    算法学习过程
    Phase 1:神经传递
    1. 通过神经网络进行训练模式输入的向前传播以产生传播的输出激活。
    2. 训练模式中通过神经网络对传播的输出激活进行反向传播,目标是生成所有输出和隐藏神经元的增量以便进行反馈调整。
    Phase 2: 权值更新
    1. 用它的输出增量和输入激活变量来得到权重的梯度。
    2. 通过从权重中减去它的比例来使权重朝着相反的梯度方向移动(最小梯度法)。

    算法递进过程图解:(Source:)
    该项目描述了利用反向传播算法实现多层神经网络的教学过程。为了说明这一过程,有两个输入和一个输出的三层神经网络,如下图所示:
    这里写图片描述

    1、每个神经元由两个单位组成。第一个单元添加权重系数和输入信号,第二个单元实现非线性功能,称为神经元激活功能。信号e是加法器输出信号,y=f(e)是非线性元件的输出信号。信号y也是神经元的输出信号。如下图:
    这里写图片描述

    2、为了训练神经网络,我们需要训练数据集。训练数据集由输入信号(x1和x2)组成,并分配相应的目标(期望输出)z。网络训练是一个迭代的过程。在每个迭代中权重系数的节点使用新的训练数据集的数据被修改。修改计算使用下面描述的算法:每个教学步骤开始迫使这两个输入信号从训练集,在这个阶段我们可以确定每个网络层中的每个神经元的输出信号值。下面的图片说明了信号是如何传播的。
    这里写图片描述
    同理如下:
    这里写图片描述

    这里写图片描述

    3、通过隐藏层传播信号。符号wmn表示下一层神经元的输出和神经元n的输入之间的连接。
    这里写图片描述

    这里写图片描述

    4、通过输出层传播信号
    这里写图片描述

    5、在接下来的算法步骤中,将网络y的输出信号与期望的输出值(目标)进行比较,在训练数据集中找到了输出信号。这种差异被称为输出层神经元的错误信号d。
    这里写图片描述

    6、直接计算内部神经元的错误信号是不可能的,因为这些神经元的输出值是未知的。多年来,多人网络训练的有效方法一直是未知的。只有在80年代中期,反向传播算法才被设计出来。这个想法是将错误信号d(在单个教学步骤中计算)返回给所有神经元,输出信号是被讨论神经元的输入信号。
    这里写图片描述

    这里写图片描述

    7、用于传播错误的权重系数,等于在计算输出值时使用的系数。只有数据流的方向被改变(信号从一个输出到另一个输入)。该技术适用于所有网络层。如果传播错误来自少数神经元,它们就会被添加。下面的例子是:
    这里写图片描述

    这里写图片描述

    这里写图片描述

    8、当计算每个神经元的错误信号时,可以修改每个神经元输入节点的权重系数。在下面的公式中,df(e)/de代表了神经元激活功能的导数(权重被修改)。
    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    8、系数h(罗马字符学习因子)影响网络训练速度。有一些技术可以选择这个参数。第一种方法是用参数的大值开始教学过程。当权重系数被确定时,参数正逐渐减少。第二种,更复杂的方法,开始以小的参数值教学。在教学过程中,在教学过程中,在教学过程中增加了参数,在最后阶段又减少了。以较低的参数值启动教学过程,可以确定权重系数的符号。

    插入重点:有导师学习的神经网络状态:

    有导师学习状态简而言之就是对输入的训练集,可以根据网络中的实际输出与期望输出之间的误差来反向调整个连接权值的学习方法。其主要步骤如下:

    1. 从样本数据中随机性的选取一个样本数据{Ai,Bi},其中Ai是输出,Bi是期望输出
    2. 通过训练得出实际输出Oi
    3. 求误差D = Bi - Oi
    4. 根据步骤3得到的误差D,来调整各隐含层之间连接权值
    5. 对,每个样本重复用以上步骤,直到对整体样本数据来说,误差收敛到控制范围内为止。

    有导师学习算法:Delta学习规则
    Delta是一种简单的经典有导师算法规则。根据实际输出与期望输出的差别;来调整连接权。其数学表达:
    这里写图片描述

    在上述公式中,Wij表示的是神经元 i 到 j之间的连接权di是神经元i的期望输出Yi是神经元 i 的实际输出**。Xj是神经元的状态。,如果是激活状态则为**1,否则为0或者-1
    通过神经元j的实际输出与期望值比较取值,我们可以知道Delta的本质,就是如果实际输出大于期望输出(di - yi)为负数,就是减小所有输入为正的连接权值。增大输入为负的权值。反之,如果实际输出小与期望输出。则增大输入为正的连接权值,减小输入为负的连接权值。


    2.4、数据归一化
    什么是归一化?
    将数据映射到[0, 1]或[-1, 1]区间或其他的区间。

    为什么要归一化?
    1. 输入数据的单位不一样,有些数据的范围可能特别大,导致的结果是神经网络收敛慢、训练时间长。
    2. 数据范围大的输入在模式分类中的作用可能会偏大,而数据范围小的输入作用就可能会偏小。
    3. 由于神经网络输出层的激活函数的值域是有限制的,因此需要将网络训练的目标数据映射到激活函数的值域。例如神经网络的输出层若采用S形激活函数,由于S形函数的值域限制在(0,1),也就是说神经网络的输出只能限制在(0,1),所以训练数据的输出就要归一化到[0,1]区间。
    4. S形激活函数在(0,1)区间以外区域很平缓,区分度太小。例如S形函数f(X)在参数a=1时,f(100)与f(5)只相差0.0067

    归一化算法
    1、这里写图片描述
    其中min为x的最小值,max为x的最大值,输入向量为x,归一化后的输出向量为y。上式将数据归一化得到[0,1]区间,当激活函数采用S形函数时(值域为(0,1))时这条公式适用。
    2、这里写图片描述
    这条公式将数据归一化到[-1, 1]区间。当激活函数采用双极S形函数(值域为(-1,1))时,该公式适用。

    归一化算法重点知识函数:
    几个要说明的函数接口:

    [Y,PS] = mapminmax(X)
    [Y,PS] = mapminmax(X,FP)
    Y = mapminmax('apply',X,PS)
    X = mapminmax('reverse',Y,PS)

    用实例来讲解,测试数据 x1 = [1 2 4], x2 = [5 2 3];

    >> [y,ps] = mapminmax(x1)
    y =
       -1.0000   -0.3333    1.0000
    
    ps = 
          name: 'mapminmax'
         xrows: 1
          xmax: 4
          xmin: 1
        xrange: 3
         yrows: 1
          ymax: 1
          ymin: -1
        yrange: 2

    其中y是对进行某种规范化后得到的数据,这种规范化的映射记录在结构体ps中.让我们来看一下这个规范化的映射到底是怎样的?

    y = (ymax-ymin)*(x-xmin)/(xmax-xmin) + ymin;
    [关于此算法的一个问题.算法的假设是每一行的元素都不想相同,那如果都相同怎么办?实现的办法是,如果有一行的元素都相同比如xt = [1 1 1],此时xmax = xmin = 1,把此时的变换变为y = ymin,matlab内部就是这么解决的.否则该除以0了,没有意义!]

    也就是说对x1 = [1 2 4]采用这个映射 f: 2*(x-xmin)/(xmax-xmin)+(-1),就可以得到y = [ -1.0000 -0.3333 1.0000]
    我们来看一下是不是: 对于x1而言 xmin = 1,xmax = 4;
    则y(1) = 2*(1 - 1)/(4-1)+(-1) = -1;
    y(2) = 2*(2 - 1)/(4-1)+(-1) = -1/3 = -0.3333;
    y(3) = 2*(4-1)/(4-1)+(-1) = 1;

    看来的确就是这个映射来实现的.
    对于上面algorithm中的映射函数 其中ymin,和ymax是参数,可以自己设定,默认为-1,1;

    比如:

    >>[y,ps] = mapminmax(x1);
    >> ps.ymin = 0;
    >> [y,ps] = mapminmax(x1,ps)
    y =
             0    0.3333    1.0000
    
    ps = 
          name: 'mapminmax'
         xrows: 1
          xmax: 4
          xmin: 1
        xrange: 3
         yrows: 1
          ymax: 1
          ymin: 0
        yrange: 1

    则此时的映射函数为: f: 1*(x-xmin)/(xmax-xmin)+(0)

    如果我对x1 = [1 2 4]采用了某种规范化的方式, 现在我要对x2 = [5 2 3]采用同样的规范化方式[同样的映射],如下可办到:

    >> [y1,ps] = mapminmax(x1);
    >> y2 = mapminmax('apply',x2,ps)
    y2 =
        1.6667   -0.3333    0.3333

    即对x1采用的规范化映射为: f: 2*(x-1)/(4-1)+(-1),(记录在ps中),对x2也要采取这个映射.
    x2 = [5,2,3],用这个映射我们来算一下.

    y2(1) = 2(5-1)/(4-1)+(-1) = 5/3 = 1+2/3 = 1.66667
    y2(2) = 2(2-1)/(4-1)+(-1) = -1/3 = -0.3333
    y2(3) = 2(3-1)/(4-1)+(-1) = 1/3 = 0.3333

    X = mapminmax(‘reverse’,Y,PS)的作用就是进行反归一化,讲归一化的数据反归一化再得到原来的数据:

    >> [y1,ps] = mapminmax(x1);
    >> xt = mapminmax('reverse',y1,ps)
    xt =
         1     2     4

    此时又得到了原来的x1(xt = x1);

    **

    三、神经网络参数定义以及对BP神经网络性能的影响

    **
    常见的训练函数:
    训练方法 训练函数
    梯度下降法 traingd
    有动量的梯度下降法 traingdm
    自适应lr梯度下降法 traingda
    自适应lr动量梯度下降法 traingdx
    弹性梯度下降法 trainrp
    Fletcher-Reeves共轭梯度法 traincgf
    Ploak-Ribiere共轭梯度法 traincgp
    Powell-Beale共轭梯度法 traincgb
    量化共轭梯度法 trainscg
    拟牛顿算法 trainbfg
    一步正割算法 trainoss
    Levenberg-Marquardt trainlm

    神经网路学习的参数:
    训练参数 参数介绍
    net.trainParam.epochs 最大训练次数(缺省为10)
    net.trainParam.goal 训练要求精度(缺省为0)
    net.trainParam.lr 学习率(缺省为0.01)
    net.trainParam.max_fail 最大失败次数(缺省为5)
    net.trainParam.min_grad 最小梯度要求(缺省为1e-10)
    net.trainParam.show 显示训练迭代过程(NaN表示不显示,缺省为25)
    net.trainParam.time 最大训练时间(缺省为inf)
    net.trainParam.mc 动量因子(缺省0.9)
    net.trainParam.lr_inc 学习率lr增长比(缺省为1.05)
    net.trainParam.lr_dec 学习率lr下降比(缺省为0.7)
    net.trainParam.max_perf_inc 表现函数增加最大比(缺省为1.04)
    net.trainParam.delt_inc 权值变化增加量(缺省为1.2)
    net.trainParam.delt_dec 权值变化减小量(缺省为0.5)
    net.trainParam.delt0 初始权值变化(缺省为0.07)
    net.trainParam.deltamax 权值变化最大值(缺省为50.0)
    net.trainParam.searchFcn 一维线性搜索方法(缺省为srchcha)
    net.trainParam.sigma 因为二次求导对权值调整的影响参数(缺省值5.0e-5)
    net.trainParam.lambda Hessian矩阵不确定性调节参数(缺省为5.0e-7)
    net.trainParam.men_reduc 控制计算机内存/速度的参量,内存较大设为1,否则设为2(缺省为1)
    net.trainParam.mu u的初始值(缺省为0.001)
    net.trainParam.mu_dec u的减小率(缺省为0.1)
    net.trainParam.mu_inc u的增长率(缺省为10)
    net.trainParam.mu_max u的最大值(缺省为1e10)

    神经网络学习主要函数说明
    newff:前馈网络创建函数
    语法:
    net = newff(A,B,{C},’trainFun’,’BLF’,’PF’)。
    A:一个n*2的矩阵,第i行元素为输入信号Xi的最大最小值
    B:一个K维行向量,其元素为网络中各个节点的数量。
    C:一个K维字符串行向量,每一个分量为对应层的神经元的激活函数,默认为“tansig”
    trainFun:为学习规则的采用的训练算法。默认为:“trainlm”
    BLF:BP权值/偏差学习函数。默认为:“learngdm”
    PF:性能函数,默认为“mse”

    train函数
    语法:
    即网络学习函数:
    [net,tr,YI,E] = train(net,X,Y)
    X:网络实际输入
    Y:网络应有输出
    tr:网络跟踪信息
    YI:网络实际输出
    E:误差矩阵

    sim函数
    **语法:**Y = sim(net,X)
    X:输入给网络的K*N矩阵,K为网络输入个数,N为样本数据量
    Y:输出矩阵Q*N,其中Q为网络输出个数

    四、实例解读:

    利用三层BP神经网络来完成非线性函数的逼近任务,其中隐层神经元个数为五个。
    样本数据:
    这里写图片描述

    代码如下:

    clear;
    clc;
    X=-1:0.1:1;
    D=[-0.9602 -0.5770 -0.0729 0.3771 0.6405 0.6600 0.4609...
        0.1336 -0.2013 -0.4344 -0.5000 -0.3930 -0.1647 -.0988...
        0.3072 0.3960 0.3449 0.1816 -0.312 -0.2189 -0.3201];
    figure;
    plot(X,D,'*'); %绘制原始数据分布图
    net = newff([-1 1],[5 1],{'tansig','tansig'});
    net.trainParam.epochs = 100; %训练的最大次数
    net.trainParam.goal = 0.005; %全局最小误差
    net = train(net,X,D); 
    O = sim(net,X); 
    figure; 
    plot(X,D,'*',X,O); %绘制训练后得到的结果和误差曲线
    V = net.iw{1,1}%输入层到中间层权值
    theta1 = net.b{1}%中间层各神经元阈值
    W = net.lw{2,1}%中间层到输出层权值
    theta2 = net.b{2}%输出层各神经元阈值

    最后得到结果:
    这里写图片描述

    **

    五、学习总结

    **
    通过神经网络的学习入门,发现机器学习的共性和乐趣;由浅入深、循序渐进。虽然看起来很是晦涩难懂。但是一门心思钻进去,最后做出实例是一种巨大的喜悦和自豪。从中得到知识的喜悦和探索规律的满足。
    总结神经网络:
    1、导入需要处理的数据。
    2、对数据进行打乱,随机获取实验数据和目标数据。(其中包括归一化:mapminmax)
    3、构建一个训练网络:newwff
    4、对构建的网络进行训练:train
    5、进行数据仿真操作sin(net,x)
    6、验证和后评价
    7、绘图直观的显示数据模拟训练的效果。
    在上面的神经网络训练中,我们要清楚构建神经网络的实验数据和目标收敛数据都是从原始数据中随机获取的。

                                 **By:wangyun 2018-01-28 11:01:57**
    
    展开全文
  • AI人工智能 Python实现人机对话

    千次阅读 2018-02-11 11:45:58
    这篇文章主要为大家详细介绍了AI人工智能应用,本文拟使用Python开发语言实现类似于WIndows平台的“小娜”,,具有一定的参考价值,感兴趣的小伙伴们可以参考一下在人工智能进展的如火如荼的今天,我们如果不尝试去...
    这篇文章主要为大家详细介绍了AI人工智能应用,本文拟使用Python开发语言实现类似于WIndows平台的“小娜”,,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    在人工智能进展的如火如荼的今天,我们如果不尝试去接触新鲜事物,马上就要被世界淘汰啦~

    本文拟使用Python开发语言实现类似于WIndows平台的“小娜”,或者是IOS下的“Siri”。最终达到人机对话的效果。

    【实现功能】

    这篇文章将要介绍的主要内容如下:

      1、搭建人工智能--人机对话服务端平台
      2、实现调用服务端平台进行人机对话交互

    【实现思路】

      AIML

      AIML由Richard Wallace发明。他设计了一个名为 A.L.I.C.E. (Artificial Linguistics Internet Computer Entity 人工语言网计算机实体) 的机器人,并获得了多项人工智能大奖。有趣的是,图灵测试的其中一项就在寻找这样的人工智能:人与机器人通过文本界面展开数分钟的交流,以此查看机器人是否会被当作人类。

      本文就使用了Python语言调用AIML库进行智能机器人的开发。

      本系统的运作方式是使用Python搭建服务端后台接口,供各平台可以直接调用。然后客户端进行对智能对话api接口的调用,服务端分析参数数据,进行语句的分析,最终返回应答结果。

      当前系统前端使用HTML进行简单地聊天室的设计与编写,使用异步请求的方式渲染数据。

    【开发及部署环境】

    开发环境:Windows 7 ×64 英文版

         JetBrains PyCharm 2017.1.3 x64

    测试环境:Windows 7 ×64 英文版

    【所需技术】

      1、Python语言的熟练掌握,Python版本2.7
      2、Python服务端开发框架tornado的使用
      3、aiml库接口的简单使用
      4、HTML+CSS+Javascript(jquery)的熟练使用
      5、Ajax技术的掌握

    【实现过程】

    1、安装Python aiml库

    1
    pip install aiml

    2、获取alice资源

    Python aiml安装完成后在Python安装目录下的 Lib/site-packages/aiml下会有alice子目录,将此目录复制到工作区。 
    或者在Google code上下载alice brain: aiml-en-us-foundation-alice.v1-9.zip

    3、Python下加载alice

    取得alice资源之后就可以直接利用Python aiml库加载alice brain了:

    1
    2
    3
    4
    5
    import aiml
    os.chdir('./src/alice') # 将工作区目录切换到刚才复制的alice文件夹
    alice = aiml.Kernel()
    alice.learn("startup.xml")
    alice.respond('LOAD ALICE')

    注意加载时需要切换工作目录到alice(刚才复制的文件夹)下。

    4、 与alice聊天

    加载之后就可以与alice聊天了,每次只需要调用respond接口:

    1
    alice.respond('hello') #这里的hello即为发给机器人的信息 

    5. 用Tornado搭建聊天机器人网站  

    Tornado可以很方便地搭建一个web网站的服务端,并且接口风格是Rest风格,可以很方便搭建一个通用的服务端接口。

    这里写两个方法:

      get:渲染界面

      post:获取请求参数,并分析,返回聊天结果

      Class类的代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    class ChatHandler(tornado.web.RequestHandler):
     def get(self):
      self.render('chat.html')
     
     def post(self):
      try:
       message = self.get_argument('msg', None)
     
       print(str(message))
     
       result = {
        'is_success': True,
        'message': str(alice.respond(message))
       }
     
       print(str(result))
     
       respon_json = tornado.escape.json_encode(result)
     
       self.write(respon_json)
     
      except Exception, ex:
       repr(ex)
       print(str(ex))
     
       result = {
        'is_success': False,
        'message': ''
       }
     
       self.write(str(result))

    6. 简单搭建一个聊天界面  

    该界面是基于BootStrap的,我们简单搭建这么一个聊天的界面用于展示我们的接口结果。同时进行简单的聊天。

    7. 接口调用  

    我们异步请求服务端接口,并将结果渲染到界面 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $.ajax({
     type: 'post',
      url: AppDomain+'chat',
      async: true,//异步
      dataType: 'json',
      data: (
       {
       "msg":request_txt
       }),
       success: function (data)
       {
        console.log(JSON.stringify(data));
        if (data.is_success == true) {
        setView(resUser,data.message);
       }
      },
      error: function (data)
      {
      console.log(JSON.stringify(data));
     }
    });//end Ajax

    这里我附上系统的完整目录结构以及完整代码->

    8、目录结构

    9、Python服务端代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    #!/usr/bin/env python
     
    # -*- coding: utf-8 -*-
     
    import os.path
    import tornado.auth
    import tornado.escape
    import tornado.httpserver
    import tornado.ioloop
    import tornado.options
    import tornado.web
    from tornado.options import define, options
     
    import os
    import aiml
     
    os.chdir('./src/alice')
    alice = aiml.Kernel()
    alice.learn("startup.xml")
    alice.respond('LOAD ALICE')
     
     
    define('port', default=3999, help='run on the given port', type=int)
     
     
    class Application(tornado.web.Application):
     def __init__(self):
      handlers = [
       (r'/', MainHandler),
       (r'/chat', ChatHandler),
      ]
     
      settings = dict(
       template_path=os.path.join(os.path.dirname(__file__), 'templates'),
       static_path=os.path.join(os.path.dirname(__file__), 'static'),
       debug=True,
      )
     
      # conn = pymongo.Connection('localhost', 12345)
      # self.db = conn['demo']
      tornado.web.Application.__init__(self, handlers, **settings)
     
     
    class MainHandler(tornado.web.RequestHandler):
     def get(self):
      self.render('index.html')
     
     def post(self):
     
      result = {
       'is_success': True,
       'message': '123'
      }
     
      respon_json = tornado.escape.json_encode(result)
      self.write(str(respon_json))
     
     def put(self):
      respon_json = tornado.escape.json_encode("{'name':'qixiao','age':123}")
      self.write(respon_json)
     
     
    class ChatHandler(tornado.web.RequestHandler):
     def get(self):
      self.render('chat.html')
     
     def post(self):
      try:
       message = self.get_argument('msg', None)
     
       print(str(message))
     
       result = {
        'is_success': True,
        'message': str(alice.respond(message))
       }
     
       print(str(result))
     
       respon_json = tornado.escape.json_encode(result)
     
       self.write(respon_json)
     
      except Exception, ex:
       repr(ex)
       print(str(ex))
     
       result = {
        'is_success': False,
        'message': ''
       }
     
       self.write(str(result))
     
     
    def main():
     tornado.options.parse_command_line()
     http_server = tornado.httpserver.HTTPServer(Application())
     http_server.listen(options.port)
     tornado.ioloop.IOLoop.instance().start()
     
     
    if __name__ == '__main__':
     print('HTTP server starting ...')
     main()

    9、Html前端代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    <!DOCTYPE html>
    <html>
    <head>
     <link rel="icon" href="qixiao.ico" type="image/x-icon"/>
     <title>qixiao tools</title>
     <link rel="stylesheet" type="text/css" href="../static/css/bootstrap.min.css">
     
     <script type="text/javascript" src="../static/js/jquery-3.2.0.min.js"></script>
     <script type="text/javascript" src="../static/js/bootstrap.min.js"></script>
     
     <style type="text/css">
      .top-margin-20{
       margin-top: 20px;
      }
      #result_table,#result_table thead th{
       text-align: center;
      }
      #result_table .td-width-40{
       width: 40%;
      }
     </style>
     
     <script type="text/javascript">
     
     
     </script>
     <script type="text/javascript">
      var AppDomain = 'http://localhost:3999/'
      $(document).ready(function(){
       $("#btn_sub").click(function(){
        var user = 'qixiao(10011)';
        var resUser = 'alice (3333)';
     
        var request_txt = $("#txt_sub").val();
     
        setView(user,request_txt);
     
        $.ajax({
         type: 'post',
         url: AppDomain+'chat',
         async: true,//异步
         dataType: 'json',
         data: (
         {
          "msg":request_txt
         }),
         success: function (data)
         {
          console.log(JSON.stringify(data));
          if (data.is_success == true) {
           setView(resUser,data.message);
          }
         },
         error: function (data)
         {
          console.log(JSON.stringify(data));
         }
        });//end Ajax
     
         
       });
     
      });
      function setView(user,text)
      {
       var subTxt = user + " "+new Date().toLocaleTimeString() +'\n·'+ text;
       $("#txt_view").val($("#txt_view").val()+'\n\n'+subTxt);
     
       var scrollTop = $("#txt_view")[0].scrollHeight;
       $("#txt_view").scrollTop(scrollTop);
      }
     </script>
    </head>
    <body class="container">
     <header class="row">
      <header class="row">
       <a href="/" class="col-md-2" style="font-family: SimHei;font-size: 20px;text-align:center;margin-top: 30px;">
        <span class="glyphicon glyphicon-home"></span>Home
       </a>
       <font class="col-md-4 col-md-offset-2" style="font-family: SimHei;font-size: 30px;text-align:center;margin-top: 30px;">
        <a href="/tools" style="cursor: pointer;">QiXiao - Chat</a>
       </font>
      </header>
      <hr>
     
      <article class="row">
     
       <section class="col-md-10 col-md-offset-1" style="border:border:solid #4B5288 1px;padding:0">Admin : QiXiao </section>
       <section class="col-md-10 col-md-offset-1 row" style="border:solid #4B5288 1px;padding:0">
        <section class="col-md-9" style="height: 400px;">
         <section class="row" style="height: 270px;">
          <textarea class="form-control" style="width:100%;height: 100%;resize: none;overflow-x: none;overflow-y: scroll;" readonly="true" id="txt_view"></textarea>
         </section>
         <section class="row" style="height: 130px;border-top:solid #4B5288 1px; ">
          <textarea class="form-control" style="overflow-y: scroll;overflow-x: none;resize: none;width: 100%;height:70%;border: #fff" id="txt_sub"></textarea>
          <button class="btn btn-primary" style="float: right;margin: 0 5px 0 0" id="btn_sub">Submit</button>
         </section>
        </section>
        <section class="col-md-3" style="height: 400px;border-left: solid #4B5288 1px;"></section>
       </section>
      </article>
     </body>
     </html>

    【系统测试】

    1、首先我们将我们的服务运行起来

    2、调用测试

    然后我们进行前台界面的调用

    这里我们可以看到,我们的项目完美运行,并且达到预期效果。

    【可能遇到问题】  

    中文乱码

    【系统展望】

    经过测试,中文目前不能进行对话,只能使用英文进行对话操作,有待改善。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    原文链接:https://www.cnblogs.com/qixiaoyizhan/p/7246387.html

    展开全文
  • AI人工智能-Python实现人机对话

    万次阅读 2017-12-12 16:56:07
     在人工智能进展的如火如荼的今天,我们如果不尝试去接触新鲜事物,马上就要被世界淘汰啦~  本文拟使用Python开发语言实现类似于WIndows平台的“小娜”,或者是IOS下的“Siri”。最终达到人机对话的效果。 ...

    【前言】

      AI

      在人工智能进展的如火如荼的今天,我们如果不尝试去接触新鲜事物,马上就要被世界淘汰啦~

      本文拟使用Python开发语言实现类似于WIndows平台的“小娜”,或者是IOS下的“Siri”。最终达到人机对话的效果。

    【实现功能】

      这篇文章将要介绍的主要内容如下:

      1、搭建人工智能--人机对话服务端平台

      2、实现调用服务端平台进行人机对话交互

    【实现思路】

      AIML

      AIML由Richard Wallace发明。他设计了一个名为 A.L.I.C.E. (Artificial Linguistics Internet Computer Entity 人工语言网计算机实体) 的机器人,并获得了多项人工智能大奖。有趣的是,图灵测试的其中一项就在寻找这样的人工智能:人与机器人通过文本界面展开数分钟的交流,以此查看机器人是否会被当作人类。

      本文就使用了Python语言调用AIML库进行智能机器人的开发。

      本系统的运作方式是使用Python搭建服务端后台接口,供各平台可以直接调用。然后客户端进行对智能对话api接口的调用,服务端分析参数数据,进行语句的分析,最终返回应答结果。

      当前系统前端使用HTML进行简单地聊天室的设计与编写,使用异步请求的方式渲染数据。

    【开发及部署环境】

    开发环境:Windows 7 ×64 英文版

         JetBrains PyCharm 2017.1.3 x64

    测试环境:Windows 7 ×64 英文版

    【所需技术】

      1、Python语言的熟练掌握,Python版本2.7

      2、Python服务端开发框架tornado的使用

      3、aiml库接口的简单使用

      4、HTML+CSS+Javascript(jquery)的熟练使用

      5、Ajax技术的掌握

    【实现过程】

      1、安装Python aiml库

    pip install aiml

      2、获取alice资源

      Python aiml安装完成后在Python安装目录下的 Lib/site-packages/aiml下会有alice子目录,将此目录复制到工作区。 
    或者在Google code上下载alice brain: aiml-en-us-foundation-alice.v1-9.zip

      3、Python下加载alice

      取得alice资源之后就可以直接利用Python aiml库加载alice brain了:

    import aiml
    os.chdir('./src/alice') # 将工作区目录切换到刚才复制的alice文件夹
    alice = aiml.Kernel()
    alice.learn("startup.xml")
    alice.respond('LOAD ALICE')

      注意加载时需要切换工作目录到alice(刚才复制的文件夹)下。

      4、 与alice聊天

      加载之后就可以与alice聊天了,每次只需要调用respond接口:

    alice.respond('hello') #这里的hello即为发给机器人的信息

      5. 用Tornado搭建聊天机器人网站

      Tornado可以很方便地搭建一个web网站的服务端,并且接口风格是Rest风格,可以很方便搭建一个通用的服务端接口。

      这里写两个方法:

      get:渲染界面

      post:获取请求参数,并分析,返回聊天结果

      Class类的代码如下:

    复制代码
    class ChatHandler(tornado.web.RequestHandler):
        def get(self):
            self.render('chat.html')
    
        def post(self):
            try:
                message = self.get_argument('msg', None)
    
                print(str(message))
    
                result = {
                    'is_success': True,
                    'message': str(alice.respond(message))
                }
    
                print(str(result))
    
                respon_json = tornado.escape.json_encode(result)
    
                self.write(respon_json)
    
            except Exception, ex:
                repr(ex)
                print(str(ex))
    
                result = {
                    'is_success': False,
                    'message': ''
                }
    
                self.write(str(result))
    复制代码

      6. 简单搭建一个聊天界面

      

      该界面是基于BootStrap的,我们简单搭建这么一个聊天的界面用于展示我们的接口结果。同时进行简单的聊天。

      6. 接口调用

      我们异步请求服务端接口,并将结果渲染到界面

    复制代码
                    $.ajax({
                        type: 'post',
                        url: AppDomain+'chat',
                        async: true,//异步
                        dataType: 'json',
                        data: (
                        {
                            "msg":request_txt
                        }),
                        success: function (data)
                        {
                            console.log(JSON.stringify(data));
                            if (data.is_success == true) {
                                setView(resUser,data.message);
                            }
                        },
                        error: function (data)
                        {
                            console.log(JSON.stringify(data));
                        }
                    });//end Ajax
    复制代码

     

      这里我附上系统的完整目录结构以及完整代码->

      7、目录结构

      

      8、Python服务端代码

     View Code

      9、Html前端代码

     View Code

    【系统测试】

      1、首先我们将我们的服务运行起来

      

      2、调用测试

       然后我们进行前台界面的调用

      

      

      这里我们可以看到,我们的项目完美运行,并且达到预期效果。

    【可能遇到问题】  

      中文乱码

    【系统展望】

      经过测试,中文目前不能进行对话,只能使用英文进行对话操作,有待改善

    本文为七小站主原创作品,转载请注明出处:http://www.cnblogs.com/qixiaoyizhan/ 且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。 
    展开全文
  • 五子棋ai实现

    千次阅读 2019-01-10 16:44:05
    这种ai实现方法可以说是相当笨拙的了,主要是利用哈希表能够接受字符串返回整形对象的特点,实现对不同棋形进行赋权,最后加权得到最优解的方法 HashMap&amp;amp;amp;amp;lt;String,Integer&amp;amp;amp;...
  • 人工智能AI到底是什么??浅谈人工智能AI

    千次阅读 多人点赞 2020-06-24 18:09:25
    我们正处于AI时代:衣食住行中的AI什么是人工智能AI对传统行业的冲击AI对广告行业和媒体行业的冲击AI对教育行业的影响AI对艺术创作行业的影响AI对物流行业和工业行业的影响 我们每天所谈论的人工智能,究竟是什么...
  • 经过多年的持续积累,我国在人工智能领域取得重要进展,国际科技论文发表量和发明专利授权量已居世界第二,部分领域核心关键技术实现重要突破。语音识别、视觉识别技术世界领先,自适应自主学习、直觉感知、综合推理...
  • 生活案例出发:身边的人工智能 人脸识别、自动驾驶、医疗图片诊断 智能机器人、AlphaGo 多语言翻译、智能客服、情感分类 日常股票交易 核心概念 人工智能—维基百科定义 人工智能,亦称智机器...
  • 人工智能学习方法

    千次阅读 2019-03-31 17:17:11
    学习或者回忆一些数学知识 因为计算机能做的就只是计算,所以人工智能更多地来说还是数学问题[1]。我们的目标是训练出一个模型,用这个模型去进行一系列的预测。于是,我们将训练过程涉及的过程抽象成数学函数:首先...
  • 人工智能在今年是一个非常火的方向,当然了,不仅仅是今年,它一直火了很多年,有关人工智能的一些算法层出不穷。人工智能在很多领域都有应用,就拿我熟悉的游戏领域来说吧,一些寻路算法,比如说A*算法(我的《十日...
  • AI专题:第一章 人工智能之入门基本方法

    千次阅读 多人点赞 2018-07-08 00:35:36
    一、目的本文的目的是给出一个简单的,平滑的,易于实现的学习方法,帮助 “普通” 程序员踏入AI领域这个门。这里,我对普通程序员的定义是:拥有大学本科知识;平时工作较忙;自己能获取的数据有限。因此,本文更像是...
  • 人工智能怎么实现智能?

    千次阅读 2019-02-17 15:59:40
    随着计算机技术的发展,人工智能从渐渐的走进人们的视野,到现在的妇孺皆知,可以说是十分火热的话题了。但是,机器是怎么实现同人脑一样的智能呢? 从信息处理的途径上来说,两者大致是一致的,即信息的输入,储存...
  • 初识人工智能1、什么是人工智能2、AI现状及实现方法1)AI现状2)AI实现方法3)机器学习和深度学习的关系3、延伸阅读资料 1、什么是人工智能 维基百科: 人工智能,亦称智机器智能,指由人制造出来的机器所表现的...
  • 人工智能阴影检测与去除,实现一种基于反射的阴影检测与去除方法(特约点评:人工智能阴影检测与去除,实现一种基于反射的阴影检测与去除方法对于阴影检测与去除任务提供了新的思路,这个创新点趣说人工智能必须推荐...
  • ai人工智能_人工智能AI)简介

    千次阅读 2020-09-14 14:11:20
    Here you will get an introduction to ... 在这里,您将获得有关人工智能的介绍。 First of all let us quickly recall what we have learnt in previous blog posts to get an idea of what we already have ...
  • java实现人工智能

    万次阅读 多人点赞 2016-05-07 15:24:04
    神经网络[/url] 很少有程序员不对这里或者那里所包含的人工智能编程所吸引,然而,许多对AI感兴趣的程序员很快就因其中包含的算法的复杂性而退却。在本文中,我们将讨论一个能大大简化这种复杂性的Java开源工程。 ...
  • 人工智能研究方法,3+1>4

    千次阅读 2018-12-29 08:48:29
    长期以来,由于研究者的专业和研究领域的不同以及他们对智能本质的理解有异,因而形成了不同的人工智能学派,各自采用不同的研究方法。与符号主义、联结主义和行为主义相应的人工智能研究方法为功能模拟法、结构模拟法...
  • 人工智能:python实现》笔记Preface 前言 Preface 前言 1.What this book covers chapter 1 介绍什么是人工智能,以及它的应用,分支和AI模型,并引领读者进行一些必要的python包的安装。 chapter 2 使用监督...
  • ai人工智能让女神 缩小女孩的想象力差距 (Closing the Imagination Gap for Girls) The term artificial intelligence (AI) was coined 64 years ago at a scholarly conference. The AI field hasn’t remained the...
  • 人工智能测试方法--探索

    万次阅读 2018-01-09 18:30:09
    什么是人工智能  再讲如何测试人工智能产品之前,我觉得我要先跟不熟悉人工智能的同学们解释一下什么是人工智能。毕竟想要测试一个东西,就要先了解它么。用一句话来概括现阶段的人工智能就是:人工智能=大数据+...
  • 人工智能语音如何实现

    万次阅读 多人点赞 2017-09-19 19:31:26
    获取这一大堆参数的方法叫做“训练”,需要使用巨大数量的语音数据,训练的方法比较繁琐,这里不讲。  但这样做有一个问题:每一帧都会得到一个状态号,最后整个语音就会得到一堆乱七八糟的状态号,相邻两帧间的...
  • 指通过数据训练出能完成一定功能的模型,是实现人工智能的手段之一,也是目前最主流的人工智能实现方法。 深度学习 一种实现机器学习的技术。是更深层次的神经网络(一种机器学习的技术)。深度即层数,超过 8 ...
  • 基于Pierre Dellacherie算法实现俄罗斯方块的人工智能(python实现)《一》 1. 文章结构 本系列文章包括三部分: 1. 用python实现俄罗斯方块:《一》 2. 个性化功能的添加:游戏结束的动画,ad广告板等:...
  • 精品收藏:GitHub人工智能AI开源项目

    万次阅读 多人点赞 2018-07-26 18:33:06
    精品收藏:GitHub人工智能AI开源项目 绝对精品!!!花了点时间,鄙人把这几年收藏的开源精品项目,整理一下,方面以后查找。其中涵盖了姿态检测,图像分割,图像分类,美学评价、人脸识别、多尺度训练,移动端的AI...
  • 上海交通大学计算机专业博士毕业,在校期间的主研方向为数据挖掘、机器学习、人工智能。毕业后即进入某大型软件上市公司从事大数据、人工智能等技术相关工作,曾先后作为技术经理或总工程师,负责大型信息平台、市级...
  • 人工智能综述及技术实现

    千次阅读 2016-11-16 14:59:47
    我们从两个相对应的角度来看AI,一是人工智能(Artificial Intelligence),二是增强智能(Augmented Intelligence),前者旨在用机器代替人类进行劳动,后者旨在让机器辅助人类工作和生活;我们还把对AI的研究分为...
  • 角色扮演游戏中敌人AI人工智能)的设计方法一  角色扮演游戏,Role Play Game(RPG),它总的来说包括三大类:动作类(即时)角色扮演;回合制角色扮演游戏;战棋类角色扮演。这三类游戏在遭遇敌人时,就是...
  • 人工智能几行代码实现换脸,python+dlib实现图文教程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 280,824
精华内容 112,329
关键字:

人工智能实现方法