学习报告21-02-28

1.prolog
2.回归分析法
3.matlab神经网络

Prolog

声明式编程语言,它与我们平时最常遇到的命令式编程语言有很大的不同。命令式语言需要你精确地告诉计算机如何完成一项工作,而声明式语言则是需要你提供信息和推论而无需知道如何做。

我们只需在程序中阐述事实,并加讯问命令即可

1、 小写字母为常量,大写字母、特殊符号等为变量。对象名如果非要用大写字母、空格等特殊字符,就必须要加单引号。在SWI-Prolog中,甚至支持汉字作为对象名(当然必须得加引号)。
2、 一个完整的语句以英文句号“.”结束。可以用/* */来表示注释,也可以用%来作为注释符。
3、 将事实录入后,再运行后,会有问号提示符“?-”,我们可以进行询问。在Prolog中,变量名的首字母必须大写。提问只要将语句中的常量改写为变量,即会输出所有满足此语句的常量。不是一次输出全部,如果想看下一个答案,可以键入字符“;”,这样Prolog就可以继续进行搜索。如果想到此为止,就按回车键。
有时,我们对变量的值并不关心,我们可以使用空变量。空变量记作“”。比如,要提问:“有学哲学的男生吗?”可以这样提问:
?- male(
), studies(_, philosophy).
只会返回true或不true

4、 主谓宾语句
谓(主,宾).
谓(主,直接宾语,间接宾语).
如果希望谓语双向互通,可以提前定义
friend(X, Y) :- friend(Y,X). X和Y是朋友
:-表示推理关系,只有右边的语句全部true,左边才为true。
5、 集合(元素). 可定义元素属于此集合
6、 与或非
,为与、;为或、+为非
例 ?- year(X, 1), age(X, Y), Y > 20, studies(X, chemistry). 在一年级中,有没有20多岁,且学习化学的男生?
?- studies(hazel, mathematics); studies(hazel, chemistry). Hazel在学数学或是化学吗?
?- male(X), +(studies(X, history)). 不学历史的男生有谁?

调试

盒子模型
盒子模型把一个谓词想象为一个盒子,Prolog解释程序的控制流通过这个盒子。如图所示,盒子的四个角上稳中有降有四个进、出端口,这些端口的含义分别是:
CALL:Prolog为满足某个目标进入盒子时经过的端口;
EXIT:Prolog在目标得到满足(即匹配成功)后离开盒子时所经过的端口;
FAIL:Prolog在目标未能满足(即匹配失败)时退出盒子所经过的端口;
REDO:Prolog为了再次满足某个目标进行回溯时,重新进入盒子的端口。
载入程序文件后,为了实现调试功能,应当在运行程序前,在提示符“?-”后键入命令:trace. 调试程序对每个调用都在括号中给出一个数字。该数字表示调用的“深度”,即初始目标调用期间所做的目标调用次数。在得出第一个答案后,要按“;”搜索另一个答案,其他按回车或“c”就可以继续。
; :回溯。转到当前目标的REDO端口;
f :失败。转到当前目标的FAIL端口;
r :重复。从EXIT端口转至该目标的CALL端口;
s :跳。在目标的CALL端口告诉调试程序路过所有的提示符,直到该目标的EXIT或FAIL端口;
L :显示当前谓词的全部子句;
a :中止。返回Prolog环境;
e :退出Prolog系统,它将放弃已做的全部工作;
h :帮助。显示命令选项。

运算

1.+ 加 - 减 * 乘 / 除
div 整除
mod 整数的余数
is 令表达式求值 X is <数学表达式>,变量X将被赋值为表达式的值,在回溯时不赋值。
X > Y X大于Y
X < Y X小于Y
X >= Y X大于或等于Y
X =< Y X小于或等于Y
X = Y X等于Y
X = Y X不等于Y
sin(x)、cos(x)等三角函数、log(x)等对数函数、绝对值函数abs(x)、平方根函数sqrt(x)
递归
程序自己调用自己,经典例子即阶乘。需先定义根0! = 1(停止条件),后定义n! = n x (n - 1)!(递归定义)
factorial(0,1). %0的阶乘是1%停止条件必须放在递归规则之前
factorial(Num,Answer) :-
Num1 is Num-1,
factorial(Num1,Answer1),
Answer is Num*Answer1.

询问时,即输入?- factorial(n,W). %n为任意整数,W为任意大写字母或者大写字母开头的单词

递归规则的停止条件.
递归谓词 :-
某些初始计算.
递归谓词.
某些最终运算.

截断
Prolog为用户提供了一种可存在于程序中并控制回溯水平的机制,即所谓的“截断(cut)”。Porlog中用叹号“!”表示截断
example :- a, b, c, !, d, e, f.
叹号之前的目标进行反复回溯直到目标c满足,经过截断符号后,回溯只在d,e,f间进行

1、 在递归的停止条件后加截断
可防止在给出回答后继续回溯,即键入分号时,系统陷入无限循环的错误
power(_, 0, 1). :- !.
power(X, Y, Pow) :-
Y_tmp is Y - 1,
power(X, Y_tmp, Pow_tmp),
Pow is Pow_tmp * X.

截断的另一个常用方式是与谓词fail联用。fail是一个Prolog标准谓词,由于它总是失败,因而可引起回溯。截断可设置在fail前面,以防止失败后的回溯。截断与fail联用通常可用否定谓词“+”代替,+是Prolog另一个标准谓词,如果目标X失败,则目标+(X)成功;如果X成功,则会失败。

选择结构和循环结构
用Prolog语言编写过程式程序在可读性上比起其它语言要逊色得多,切记在Prolog编程中应尽量避免过程式编程。


set([yuansu1,yuansu2……])
表头和表尾的概念是理解Prolog中表处理的基础。表头是一个元素,而表尾本身是一个表。表具有递归的数据结构,因为它是由表头和另一个表(表尾)组成的。正像其递归结构那样,表也可以递归定义。比如:
考虑到[a, b, c],该表表头=a,表尾=[b, c];表尾也是一个表,表头 = b,表尾=[c];而表尾[c],也是一个表,表头=c,表尾=[ ]。
其中竖线“|”是Prolog中用于分隔表头和表尾的符号。[H|T],竖线前为表头

在这里插入图片描述
确定一个对象是否为某个表的成员。例如,我们有一个表List,内容是一些编程语言的名字。查找程序如下:
find(List,[List|]).
find(List,[
|T]) :- find(List,T).
进入知识库,试图与规则一匹配,因为目标与表头不同,故失败;
继续搜索,试图与规则二匹配,目标和表尾作为参数,重新回到规则一,直到成功。
两个表的追加。有时需要把两个表合并成一起形成新表,这个过程叫做并置或追加。下面这段代码可实现表的追加,concatenate(A,B,C).后就可以将表B追加到表A后形成表C。

回归分析法

一元回归
在这里插入图片描述

注意这里σ2不是由除以n得到,而是除以(n-2),这个二代表了两个参数α和β

多元回归

模型
y=β0+β1x1+……+βmxm+ε
ε~N(0,σ2),βn,σ2都是未知参数

将各组观察值带入
Yi=β0+β1xi1+……+βmxim+εi (i=1,2,……,n)
其中各εi相互独立,且εi~N(0,σ2)

在这里插入图片描述

假设X的秩等于m+1,即列满秩
则XTY=(XTX)β
解得β=(XTX)-1XTY

在这里插入图片描述

当m=1时,就变成一元回归分析
回归模型的假设检验
显著性检验
H0:β1=β2=……βm=0
H1:至少有一个βj≠0(j=1,2,……,m)
当假设H0成立时,说明回归方程不显著,采用线性回归不合适
当备选假设H1成立,则回归方程显著
在这里插入图片描述在这里插入图片描述

若H0成立
Se/σ2x2(n-m-1),SR/σ2x2(m)

在这里插入图片描述
神经网络
1, 多层向前神经网络
在这里插入图片描述输入层即为初始指标
隐层和输入层有权值的连接,出输入层外,每一节点的输入为前一层所有节点输出值的和。每一节点的激励输出值由节点输入,激励函数及偏置量决定。

第i层为各节点的输入,通常需要归一化到-1和1之间(或0到1)
在第j层,节点的输入值为
Netj=Σwjioij
其中θj为阈值,正阈值的作用将激励函数演x轴向左平移,节点的输出值为oj=f(netj)
式中f为节点的激励函数,通常选择如下sigmoid函数:
F(x)=1/[1+exp(-x)]
//这是一个单调增加有界函数且负无穷处=0,正无穷处=1,f(0)=1/2
所以用它映射之后还是在0到1区间内,且一一对应
在第k层的网络节点输出为:
Netk=Σwkjojk。而输出为ok=f(netk

网络经过计算后,输出值和输入值会存在误差,对每一个输入的模式样本p,平方误差Ep为Ep=1/2Σk(tpk-opk)2
全部学习样本总误差为
E=1/2pΣpΣk(tpk-opk)2
在学习过程中,系统将调整连接权和阈值,使Ep尽可能下降
Matlab相关函数
1、 网络初始化函数
net=newff([xm……xM],[h1,h2……hk],[f1,f2……fk])
xm和xM分别为列向量,储存各样本数据的最小值和最大值
注意方框号里面只会是举证或者向量
第二个输入变量是一个行向量,输入各层节点数
第三个输入变量是字符串,代表该层的传输函数
常用tansig(x)=[1-exp(-2x)]/[1+exp(-2x)]映射-1到1,logsig(x)=1/[1+exp(-x)]映射0到1
还可以用设定函数
Net.trainParam.epochs=1000 设定迭代次数
Net.trainFcn=’traingm’ 设定带动量的梯度下降算法
2、 网络训练函数
[net,tr,Y1,E1]=train(net,X,Y)
其中X为nM矩阵,n为输入变量的个数,M为样本数,注意是按列排放的,一列代表一个样本;
Y为m
M矩阵,m为输出变量的个数
3、 网络泛化函数
Y2=sim(net,X1)
其中X1为输入数据矩阵,各列为样本数据

在这里插入图片描述一维函数,所以只填一组最大值和最小值,隐层节点选六个,输出层节点只能选一个(即y),每层用tansig。

在这里插入图片描述
可以用三层神经网络进行判别
输入为15个二维向量,输出是判断谁是Af谁是Apf(判断是否类),因此可用0,1法
设输出也是15个二维向量,其中Af对应(1,0)Apf对应(0,1)
只需要将三个未知向量带入,看其偏于(1,0)还是(0,1)

在这里插入图片描述注意这里求最大值最小值的地方,由于原本matlab只会求横向量最大最小,这里加‘是为了转置,求列向量最大最小,后面初始化网络的时候,再转置回来
隐层节点数只能自己试不要太多,不要太少

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值