机器学习实验报告Word格式文档下载.docx
《机器学习实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《机器学习实验报告Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
ID3算法通过计算每个属性的信息增益,认为信息增益高的是好属性,每次划分选取信息增益最高的属性为划分标准,重复这个过程,直至生成一个能完美分类训练样例的决策树。
在ID3算法中,决策节点属性的选择运用了信息论中的熵概念作为启发式函数。
在这种属性选择方法中,选择具有最大信息增益(informationgain)的属性作为当前划分节点。
通过这种方式选择的节点属性可以保证决策树具有最小的分枝数量,使得到的决策树冗余最小。
伪代码:
二、实验过程
1.实验数据集
这个样例集中,每个属性都是离散值的,连续的属性已经被离散化。
将图中的样例集转换成图2中所示的格式并保存到文件中以供项目程序读取数据。
图2中“@attribute”行所对应的是样例集中的测试属性和目标属性,以及它们属性值。
而“@data”行后面的每一行数据则对应了样例集中的一条样例。
测试属性:
outlook,天气情况,属性值为{sunny,overcast,rainy};
temperature,气温,属性值为{hot,mild,cool};
humidity,湿度,属性值为{high,normal};
Windy,是否有风,属性值为{TRUE,FALSE}。
目标属性:
Play,是否适合打球,属性值为{yes,no}。
RID
outlook
temperature
humidity
windy
play
1
sunny
hot
high
FALSE
no
2
TRUE
3
overcast
yes
4
rainy
mild
5
cool
normal
6
7
8
9
10
11
12
13
14
输出:
图3所示为本项目最终的输出结果。
项目的输出结果详细的给出了在构建决策树的过程中候选属性的信息增益、测试属性的选取结果、测试属性的各个属性值所对应的分支、目标属性选取结果以及目标概念buys_computer的决策树JSON格式输出,并使用项目生成的决策树进行预测分析。
根据生成的xml文件画出决策树如图所示:
2.实现步骤:
第一步:
从文件weather.arff中读取测试样例的属性attribute和样例数据data,方法voidreadARFF(Filefile)实现了数据的读取这项工作。
第二步:
开始递归地创建决策树。
首先为样例集中的每一个测试属性分配一个权值,权值越小代表属性的重要性越高。
创建决策树的过程中要计算样本的总体熵,计算各个属性的信息增益,将信息增益值最大的属性定为测试属性(根结点),然后开始从根节点开始递归地创建子结点。
实现代码参考方法publicdoublecalEntropy(ArrayList<
Integer>
subset,intindex)。
第三步:
输出目标概念weather的决策树xml格式,此项需要引入jaxen-1.1.1.jar包,编译整个项目并运行生成决策树。
关键代码:
//给定原始数据的子集(subset中存储行号),当以第index个属性为节点时计算它的信息熵
publicdoublecalEntropy(ArrayList<
subset,intindex)
{
intsum=subset.size();
doubleentropy=0.0;
int[][]info=newint[attributevalue.get(index).size()][];
for(inti=0;
i<
info.length;
i++)
info[i]=newint[attributevalue.get(decatt).size()];
int[]count=newint[attributevalue.get(index).size()];
sum;
{
intn=subset.get(i);
Stringnodevalue=data.get(n)[index];
intnodeind=attributevalue.get(index).indexOf(nodevalue);
count[nodeind]++;
Stringdecvalue=data.get(n)[decatt];
intdecind=attributevalue.get(decatt).indexOf(decvalue);
info[nodeind][decind]++;
}
entropy+=getEntropy(info[i])*count[i]/sum;
returnentropy;
}
//构建决策树
publicvoidbuildDecisionTree(Stringname,Stringvalue,
ArrayList<
subset,LinkedList<
selatt)
Elementele=null;
@SuppressWarnings("
unchecked"
)
List<
Element>
list=root.selectNodes("
//"
+name);
Iterator<
iter=list.iterator();
while(iter.hasNext())
ele=iter.next();
if(ele.attributeValue("
value"
).equals(value))
break;
if(infoPure(subset))
ele.setText(data.get(subset.get(0))[decatt]);
return;
intminIndex=-1;
doubleminEntropy=Double.MAX_VALUE;
selatt.size();
i++){
if(i==decatt)
continue;
doubleentropy=calEntropy(subset,selatt.get(i));
if(entropy<
minEntropy)
{
minIndex=selatt.get(i);
minEntropy=entropy;
}
StringnodeName=attribute.get(minIndex);
selatt.remove(newInteger(minIndex));
ArrayList<
String>
attvalues=attributevalue.get(minIndex);
for(Stringval:
attvalues){
ele.addElement(nodeName).addAttribute("
val);
al=newArrayList<
();
for(inti=0;
subset.size();
if(data.get(subset.get(i))[minIndex].equals(val))
{
al.add(subset.get(i));
}
buildDecisionTree(nodeName,val,al,selatt);
BP神经网络
1、BP神经网络简介
在人工神经网络发展历史中,很长一段时间里没有找到隐层的连接权值调整问题的有效算法。
直到误差反向传播算法(BP算法)的提出,成功地解决了求解非线性连续函数的多层前馈神经网络权重调整问题。
BP网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。
BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。
它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。
BP神经网络模型拓扑结构包括输入层(input)、隐层(hidelayer)和输出层(outputlayer)。
2、算法原理
由于传统的感知器和线性神经网络有自身无法克服的缺陷,它们都不能解决线性不可分问题,因此在实际应用过程中受到了限制。
而BP网络却拥有良好的繁泛化能力、容错能力以及非线性映射能力。
因此成为应用最为广泛的一种神经网络。
BP算法的基本思想是把学习过程分为两个阶段:
第一阶段是信号的正向传播过程;
输入信息通过输入层、隐层逐层处理并计算每个单元的实际输出值;
第二阶段是误差的反向传递过程;
若在输入层未能得到期望的输出值,则逐层递归的计算实际输出和期望输出的差值(即误差),以便根据此差值调节权值。
这种过程不断迭代,最后使得信号误差达到允许或规定的范围之内。
基于BP算法的多层前馈型网络模型的拓扑结构如上图所示。
BP算法的数学描述:
三层BP前馈网络的数学模型如上图所示。
三层前馈网中,输入向量为:
;
隐层输入向量为:
输出层输出向量为:
期望输出向量为:
。
输入层到隐层之间的权值矩阵用V表示,
,其中列向量
为隐层第j个神经元对应的权向量;
隐层到输出层之间的权值矩阵用W表示,
为输出层第k个神经元对应的权向量。
下面分析各层信号之间的数学关系。
对于输出层,有
对于隐层,有
以上两式中,转移函数f(x)均为单极性Sigmoid函数:
f(x)具有连续、可导的特点,且有
以上共同构成了三层前馈网了的数学模型。
当网络输出和期望输出不相等时,存在输出误差E如下:
将以上误差定义式展开至隐层,有
进一步展开至输入层,有
由上式可以看出,网络输入误差是两层权值W和V的函数,因此调整权值可以改变误差E。
显然,调整权值的原则是使误差不断的减小,因此应使权值的调整量与误差的负梯度成正比,即:
式中负号表示梯度下降,常数
表示比例系数,在训练中反映了学习速率。
容易看出,BP学习算法中,各层权值调整公式形式上都是一样的,均有3个因素决定,即:
学习速率、本层误差信号和本层输入信号X/Y。
其中输出层误差信号同网络的期望输出与实际输出之差有关,直接反映了输出误差,而各隐层的误差信号与前面各层的误差信号都有关,是从输出层开始逐层反传过来的。
3、实验
实验输入与输出:
本次实验做的是一个数字分类的实验,目的是对于任意的整数(int型),BPNN在经过训练之后,能够准确地判断出它是奇数还是偶数,正数还是负数。
首先对于训练的样本(是随机生成的数字),将它转化为一个32位的向量,向量的每个分量就是其二进制形式对应的位上的0或1。
将目标输出视作一个4维的向量,[1,0,0,0]代表正奇数,[0,1,0,0]代表正偶数,[0,0,1,0]代表负奇数,[0,0,0,1]代表负偶数。
训练样本为1000个,学习200次。
实验结果:
如图所示,BPNN在经过训练之后,能够准确地判断出它是奇数还是偶数,正数还是负数。
privatevoidforward(double[]layer0,double[]layer1,double[][]weight){
//thresholdunit.
layer0[0]=1.0;
for(intj=1,len=layer1.length;
j!
=len;
++j){
doublesum=0;
for(inti=0,len2=layer0.length;
i!
=len2;
++i)
sum+=weight[i][j]*layer0[i];
layer1[j]=sigmoid(sum);
}
/**
*Calculateoutputerror.
*/
privatevoidoutputErr(){
doubleerrSum=0;
for(intidx=1,len=optDelta.length;
idx!
++idx){
doubleo=output[idx];
optDelta[idx]=o*(1d-o)*(target[idx]-o);
errSum+=Math.abs(optDelta[idx]);
optErrSum=errSum;
*Calculatehiddenerrors.
privatevoidhiddenErr(){
for(intj=1,len=hidDelta.length;
doubleo=hidden[j];
doublesum=0;
for(intk=1,len2=optDelta.length;
k!
++k)
sum+=hidOptWeights[j][k]*optDelta[k];
hidDelta[j]=o*(1d-o)*sum;
errSum+=Math.abs(hidDelta[j]);
hidErrSum=errSum;
欢迎您的下载,
资料仅供参考!
致力为企业和个人提供合同协议,策划案计划书,学习资料等等
打造全网一站式需求