人工智能原理及应用作业

1.神经网络
1.1算法描述
以人脑中的神经网络为启发,提出了神经网络算法。基本原理是,通过对大量样本集的训练和学习,使模型输出与实际值越来越接近,从而对类似的数据做出合理的预估。如图,X1,x2…是输入数据,Wij是连接单元之间的权重,Oj是隐藏层,Ok为数据输出。神经网络算法的目标是,调整权重w,使的输出与实际值之间的误差最小。隐藏层的数量是任意的,理论上如果有足够多的输入和隐藏层可模拟出任何方程。神经网络主要算法是反向传播(bp)算法,bp算法由输入数据的正向传播和误差的反向传播2个过程组成,正向传播是指输入样本(x,y_)经过网络传播可计算得到输出y, 反向传播指根据y与y_的差距,将误差由输出层向输入层反向传播,在反向传播过程中修改各神经元的权值。本文主要介绍反向传播算法。
1.2数据集划分
下载MNIST手写体数字识别数据集,将数据划分为训练集、确认集、测试集,训练集有55000张图片、确认集有5000张图片、这2个集合组成了训练数据集。测试集内有10000张图片。
1.3参数选取
a.输入层参数,因为每一张图片都由784个像素点组成,所以输入单元个数为784;
b.设计神经网络只有一层隐藏层,且选取隐藏层节点数为500;
c.输出可能为0~9之间的数字,所以输出层个数为10;
d.训练轮数选取10000;
e.每一轮训练的数据个数为100;
f.调用随机生成数函数,产生符合正态分布的权值初始值;
g.选取了0.1作为偏差值;
1.4处理步骤
1)线性模型中输入与输出的关系式为:y=∑wixi+b,但因为线性模型能够解决的问题有限,所以需要用激活函数实现去线性化。常用的激活函数有:sigmoid函数:f(x)=1/1+ex和tanh=(1-e-2x)/(1+e-2x)如下图:

sigmoid函数 tanh函数
这些激活函数图像都不是一条直线,所以通过这些函数,神经网络就是非线性的了。
2)损失函数用来定义输出值与实际值之间的接近程度,交叉熵刻画了2个概率分布之间的距离,是分类问题中使用比较广的损失函数,所以本文选用交叉熵实现。因为交叉熵刻画的是2个概率之间的距离,则我们需要把神经网络前向传播的结果转换成概率分布,所以有引入Softmax回归。
3)将交叉熵作为输入层反向传播,在反向传播过程中修改各神经元的权值,直至达到理想的精确度。
1.5结果数据记录及分析
根据代码结果分析,当没有隐藏层及激活函数时,准确度是0.9266;当有一层隐藏层,且有激活函数时,准确度是0.9788。从结果可以明显的看出,调整神经网络的结构对最终结果的正确率有非常大的影响。当有隐藏层激活函数及使用正则化时,准确度达到0.9831,可知使用正则化可以进一步对算法进行优化。

2.决策树
决策树分类算法是一种基于实例的归纳学习方法,它能从给定的无序的训练样本中,提炼出树型的分类模型。树中的每个非叶子节点记录了使用哪个特征来进行类别的判断,每个叶子节点则代表了最后判断的类别。根节点到每个叶子节点均形成一条分类的路径规则。而对新的样本进行测试时,只需要从根节点开始,在每个分支节点进行测试,类似if-else规则,沿着相应的分支递归地进入子树再测试,一直到达叶子节点,该叶子节点所代表的类别即是当前测试样本的预测类别。
2.1算法描述
算法步骤如下:
1)特征选取
首先利用给定特征划分数据集,然后对每个特征划分数据集的结果计算一次熵,最后选取熵最小的特征为最好特征值。信息熵是用来度量数据集的无序程度,通过公式

其中pi表示第i个类别在整个训练元组中出现的概率,可以用属于此类别元素的数量除以训练元组元素总数量作为估计可得到数据集的熵,熵越小,则混合数据越少,说明纯净度足够。
2)决策树生成
根据特征值采用递归的原则处理数据集,当程序遍历完所有特征值或者每个分支下的所有实例都具有相同的分类时,递归结束,则生成决策树。
3)决策树剪枝
2.2参数选取
在编程实现时,使用的是python的sklearn库中的tree.DecisionTreeClassifier函数,下面对使用到的参数做一个简要说明。

  1. criterion:选择分类特征,输入为‘gini’ or ‘entropy’ (default=”gini”),前者是基尼系数,后者是信息熵。
    2)min_samples_split:内部节点再划分所需样本数,即节点的样本数量必须达到一定值,才会考虑对其进行划分,default=2。
    3)min_impurity_split:信息增益阈值,决策树在创建分支时,信息增益必须大于此阈值,否则不分裂。default=0。
    2.3实验结果及分析
    当训练集数量为1000时,准确度为0.6721,当训练数量为5000时,准确度为0.7795。训练集数量越多,算法准确度越高。且当参数完全相同,进行重复实验时,实验结果一般会有差别,但差别很小,不影响对实验结果的分析。
    3.支持向量机
    3.1算法描述
    支持向量机是一种二分类模型,其还包括核计巧,这使它成为实质上的非线性分类器。
    它是一个特殊的线性分类器,其分类面g(x)=0满足
    (1)分类面与两类样本间的距离相等。
    (2)分类面与两类样本间的距离最大。
    因此支持向量机设计的目的,本质上是寻求一个距离最大化的等距离分类面。对于任意一个等距离的分类面,必然有无穷多个线性鉴别函数与其对应。在这些鉴别函数中,必然存在一个线性鉴别函数g(x)满足|g(x0)|=1,其中x0为支持向量,对于任意一个给定的等距离分类面,仅需考虑这样的鉴别函数。此时分类面距两类样本的间距为:

该鉴别函数满足如下性质:
(1)对支持向量x:

(2)对支持向量x:

(3)两类样本间的间隔:

3.2处理步骤
当训练数据线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机;当训练数据近似线性可分时,通过软间隔最大化学习一个线性分类器,即线性支持向量机;当训练数据线性不可分时,使用核计巧及软间隔最大化,学习非线性支持向量机。
当输入空间为欧式空间或离散空间时,核函数表示将输入从输入空间映射到特征空间得到的特征向量之间的內积。相当于把样本从原始空间中映射到一个更高维的空间,使样本在高维空间中线性可分。
3.3实验结果及分析
我们使用python的sklearn库中的svm.SVC函数来进行分类实验,在实验中,我们设定惩罚参数C为1(工业界中常常如此设置),分别使用线性核函数、三次多项式核函数、高斯核函数和sigmoid核函数对其进行分类。实验结果如下表所示。
分类准确率/分类时间 精确度/所需时间
Linear(线性核函数) 90.78%/326s
poly(多项式核函数) 70…43%/3370s
sigmoid(sigmoid核函数) 87%/644s

由结果数据可知,线性核函数的效果最好。
4.算法总结
比较3种算法性能如图表所示:
算法名称 精确度 运行时间
神经网络 0.9836 31.0
决策树 0.7798 1.037
SVM 0.9085 12.27

由上表可知,精确度:神经网络>决策树>SVM,因此在要求高精度的条件下,选用神经网络算法比较合适,而决策树虽然运行效率比较高,但其精确度差强人意;而SVM适用于对运行时间要求高的场景下,虽然精确度比神经网络差点,但运行时间不到其一半。我们应该根据需求,选择合适的算法。

附录:算法代码
1.神经网络-bp算法代码
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
from numpy.random import RandomState
import time
mst = input_data.read_data_sets(“tmp/data/”,one_hot=True)
BATCH = 100
INPUT_NODE = 784
OUTPUT_NODE = 10
LAYER_NODE = 500
TRAINS = 10000

x = tf.placeholder(tf.float32,[None,INPUT_NODE],name=‘x’)
y_ = tf.placeholder(tf.float32,[None,OUTPUT_NODE],name=‘y_’)
w1 = tf.Variable(tf.truncated_normal([INPUT_NODE,LAYER_NODE],stddev=0.1))
b1 = tf.Variable(tf.constant(0.1,shape=[LAYER_NODE]))
w2 = tf.Variable(tf.truncated_normal([LAYER_NODE,OUTPUT_NODE],stddev=0.1))
b2 = tf.Variable(tf.constant(0.1,shape=[OUTPUT_NODE]))

无隐藏层无激活函数
w = tf.Variable(tf.truncated_normal([784,10],stddev=0.1))
y = tf.nn.softmax(tf.matmul(x,w) + b2)
计算隐藏层的前向传播结果,激活函数为relu
layer = tf.nn.relu(tf.matmul(x, w1) + b1)
y = tf.nn.softmax(tf.matmul(layer, w2) + b2)

交叉熵
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0)))
优化函数优化损失函数=反向传播函数
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
with tf.Session() as sess:
tf.initialize_all_variables().run()
validate_data = {x: mst.validation.images,y_:mst.validation.labels}
test_data = {x:mst.test.images,y_:mst.test.labels}
#迭代训练神经网络
start = time.time()
for i in range(TRAINS):
train、validation组成了训练数据集,mst.train.next_batch从训练数据集中选数据
xs,ys = mst.train.next_batch(BATCH)
sess.run(train_step,feed_dict={x:xs,y_:ys})

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print('运行时间',time.time()-start)
print (sess.run(accuracy, feed_dict = test_data))

2.决策树算法
import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from tensorflow.examples.tutorials.mnist import input_data
from sklearn import svm
import time

mst = input_data.read_data_sets(“tmp/data/”,one_hot=True)
trainDatas = mst.validation.images
testDatas = mst.test.images
trainLables = mst.validation.labels
testLables = mst.test.labels
trainDatas = mst.validation.images[:1000]
trainLables = mst.validation.labels[:1000]
初始化决策树分类器
startTime = time.time()
dtc = DecisionTreeClassifier()
训练
dtc.fit(trainDatas, trainLables)
预测 保存结果
dtc.predict(testDatas)
print(‘运行时间’,time.time()-startTime)
print (“准确度:”, dtc.score(testDatas,testLables))
3.SVM算法
import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from tensorflow.examples.tutorials.mnist import input_data
from sklearn import svm
import warnings
import time
warnings.filterwarnings(‘ignore’)

mst = input_data.read_data_sets(“tmp/data/”,one_hot=False)
trainDatas = mst.validation.images
testDatas = mst.test.images
trainLables = mst.validation.labels
testLables = mst.test.labels
print(len(testLables))
startTime = time.time()
svc = svm.SVC()
svc.fit(trainDatas,trainLables)
print(‘运行时间’,time.time()-startTime)
print(‘svm精确度’,svc.score(testDatas,testLables))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值