## 人工智能实验 lab3 实验报告
### PLA 感知机学习方法
#### 一、算法原理
PLA 是针对二元分类问题,它可以用来解决二维或者高维的**线性可分**问题。在二分类问题中,PLA 算法通过一个共享的权重向量$w=(w_1,w_2,...,w_d)$和某个样例的特征向量$x=(x_1,x_2,x_3...x_d)$ 做向量的内积,并通过与某个阈值$w_0$来比较大小,我们可以定义如果内积的结果大于阈值,就判为一类,反之则属于另外一类,就起到了二分类的效果。
![](https://www.writebug.com/myres/static/uploads/2022/5/8/5fbdf46070364ed422f26e76c4b070dd.writebug)
为了方便我们的算法中使用矩阵的乘法运算,也方便优化或求导,我们可以把阈值转化成一个参数融入到权重向量中:
![](https://www.writebug.com/myres/static/uploads/2022/5/8/fdc305c5fd9b4a5b0eb7d844e55c9e56.writebug)
其中:
![](https://www.writebug.com/myres/static/uploads/2022/5/8/9813f4921885839611c9b93e42d97e9f.writebug)
PLA 的算法步骤是:
1. 先将权重矩阵和阈值合并,并给每一个样本特征向量前加一个 1
2. 随机初始化一个权重矩阵
3. 计算每个样本点的特征向量和权重矩阵的乘积,然后判断是大于 0 还是小于 0(使用符号函数 `sign` 来计算)。遍历所有的样本点,如果找到一个预测错误的样本,就更新权重向量,直到所有的训练样本都预测正确。如果遇到错误的样本可以通过下面的式子对权重矩阵进行更新:
![](https://www.writebug.com/myres/static/uploads/2022/5/8/dd62f3404a39b41895b6e4a363ebcb60.writebug)
PLA 并不一定会停下来,因为如果数据存在噪声或者线性不可分的时候就会一直有错误的点,因此我们需要设置一个总的迭代次数来让算法停止。
4. 训练结束后我们会得到一个权重矩阵,我们通过这个权重矩阵和要预测的 x 做内积来预测它的标签
#### 二、伪代码
````
procedure PLA_algorithm(data,w):
// input: data 待训练的数据集样本点
// w 要训练的初始权重矩阵
// return: w 训练出的权重矩阵
iteration=15
for i in range(iteration):
// PLA算法迭代iteration或者没有错误点的时候停止
isComplete=1
for point in data:// 遍历所有的样本点
res = point.dot(w) // 计算当前点和权重矩阵的点乘
if sign(res)=sigh(label) // 如果计算结果的符号和这个点原本的符号相同,就继续下个点
continue
else:
// 出现错误的点,更新权重向量w并立刻返回
w=w+label*x
isComplete=False// 出现了错误的点,下次要继续迭代
if isComplete:
// 如果遇到一次是没有错误点的就可以直接退出了
break
return w
````
#### 三、代码展示
传统 PLA 算法:
````python
def PLA_algorithm(data):
'''
PLA算法,当算法迭代次数达到上限,或者没有错误的点的时候停止
'''
iteration=15
w = np.ones(len(data[0])) # 定义权重向量
count=0
for _ in range(iteration):
# PLA算法迭代iteration或者没有错误点的时候停止
count+=1
isComplete=1
for point in data:
# 遍历每个数据点不断更新w
x=np.append(np.array([1]),point[:-1]) #在开头加一个1表示阈值
res = x.dot(w)
if (point[-1]==1 and np.sign(res)==1) or (point[-1]==0 and np.sign(res)==-1) or res == 0:
continue
else:
# 出现错误的点,更新权重向量w并立刻返回
w=w+(-np.sign(res))*x
isComplete=False
if isComplete:
# 如果遇到一次是没有错误点的就可以直接退出了
break
print("训练迭代了%d次"%(count))
return w
````
对 PLA 算法进行升级口袋算法,因为口袋算法每次迭代要更新权重矩阵 W,如果线形不可分,在遍历数据集的时候如果开头几个点一直有错误,就一直利用不到后面的数据点,所以口袋算法采用了随机选取数据点,找到错误的点进行更新的方法:
````python
def PLA_algorithm(data):
'''
PLA算法,当算法迭代次数达到上限,或者没有错误的点的时候停止
'''
iteration=15
w = np.ones(len(data[0])) # 定义权重向量
count=0
for _ in range(iteration):
# PLA算法迭代iteration或者没有错误点的时候停止
count+=1
isComplete=1
for point in data:
# 遍历每个数据点不断更新w
x=np.append(np.array([1]),point[:-1]) #在开头加一个1表示阈值
res = x.dot(w)
if (point[-1]==1 and np.sign(res)==1) or (point[-1]==0 and np.sign(res)==-1) or res == 0:
continue
else:
# 出现错误的点,更新权重向量w并立刻返回
w=w+(-np.sign(res))*x
isComplete=False
if isComplete:
# 如果遇到一次是没有错误点的就可以直接退出了
break
print("训练迭代了%d次"%(count))
return w
````
训练完成后,我们会得到一个权重矩阵 W,我们可以利用这个权重矩阵来对我们划分的验证集进行验证:
````python
def k_fold(dataSet,k,i):
'''
对数据集进行训练集和验证集的划分
:param dataSet: 数据集
:param k: 划分成k个部分
:param i: 选取第i个部分为验证集
:return: 返回训练和验证集的数据
'''
total = len(dataSet)
step_len=total//k # 求出每一份的长度
val_begin=i*step_len
val_end=val_begin+step_len
return np.vstack((dataSet[:val_begin],dataSet[val_end:])),dataSet[val_begin:val_end]
def validation(validation_set,w):
count=0
total=validation_set.shape[0]
for point in validation_set:
# 遍历每个数据点不断更新w
x=np.append(np.array([1]),point[:-1]) #在开头加一个1表示阈值
res = x.dot(w)
if (point[-1]==1 and np.sign(res)==1) or (point[-1]==0 and np.sign(res)==-1) or res == 0:
count+=1
print("PLA在验证集上的正确率为:%f"%(count/total))
````
#### 四、 实验结果以及分析:
我尝试了 100 次迭代并统计每一次迭代后的在验证集上的准确率,作出的图像如下所示:
![](https://www.writebug.com/myres/static/uploads/2022/5/8/9c758d1f0a4903afde53eead131cceac.writebug)
可以看到因为数据集不是线形可分的,所以 PLA 找不到一个最优的解,每次迭代更新了一次后,准确率就会波动,有可能上升也可能下降,因此可见 PLA 对于线形不可分的数据集表现并不是很出色。
再看口袋算法,每次迭代都随机选取一个点,如果是错误的就进行更正,并和当前的最好 w 进行对比,如果在训练集上表现更好,就替换原来的最好 w。可以看到,每次迭代后在验证集上的正确率一直是上升趋势,可见,口袋算法比起传统的 PLA 在非线形可分的数据集上有更好的表现效果。
![](https://www.writebug.com/myres/static/uploads/2022/5/8/1e8e39bf419908004e75b324f25e702b.writebug)
#### 五、思考题:
1. 有什么手段可以让 PLA 适用于非线形可分的数据集:
对于非线形可分的数据集,传统 PLA 算法不会停下来,因为一直会有错误的点,如果我们仅仅是设置迭代次数让它停下来的话,我们这一次纠正了这个点,下一次纠正另外一个点的时候,有可能导致前一个点有变成错误的的点了。所以 P
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
PLA 是针对二元分类问题,它可以用来解决二维或者高维的**线性可分**问题。在二分类问题中,PLA 算法通过一个共享的权重向量$w=(w_1,w_2,...,w_d)$和某个样例的特征向量$x=(x_1,x_2,x_3...x_d)$ 做向量的内积,并通过与某个阈值$w_0$来比较大小,我们可以定义如果内积的结果大于阈值,就判为一类,反之则属于另外一类,就起到了二分类的效果。
资源推荐
资源详情
资源评论
收起资源包目录
基于Python PLA 感知机学习方法【100011903】 (168个子文件)
train.csv 1.61MB
car_train.csv 45KB
check_train.csv 4KB
check_test.csv 1KB
train.csv 466B
17341190_KNN_regression.csv 163B
17341190_KNN_classification.csv 24B
实验九.iml 490B
DQN_othello.iml 483B
mid-project.iml 453B
期末project.iml 453B
实验十.iml 453B
TFIDF.iml 431B
IMG_FEA564CF7D01-1.jpeg 119KB
1567528568175.jpg 358KB
board.jpg 292KB
1567528859003.jpg 110KB
LICENSE 1KB
人工智能实验lab1 实验报告.md 23KB
人工智能实验 博弈树搜索.md 18KB
人工智能实验九.md 15KB
README.md 14KB
人工智能实验lab3 实验报告.md 13KB
人工智能笔记整理.pdf 22.28MB
Lec 12 不确定性推理 II .pdf 19.12MB
Lec 9 约束满足问题.pdf 10MB
Lec 11 不确定性推理 I .pdf 5.28MB
T04_Answer.pdf 3.31MB
Lec 6 盲目搜索.pdf 3.23MB
Lec 10 知识表示与推理.pdf 2.89MB
lab_9无信息搜索&启发式搜索.pdf 2.87MB
17341180_17341190_report.pdf 2.64MB
lab1.pdf 2.4MB
Lec 8 博弈树搜索.pdf 2.14MB
Lec 7 启发式搜索.pdf 2.04MB
Lec 13 不确定性推理 III .pdf 1.77MB
Lec 2 样例学习 I.pdf 1.74MB
lab2_DT.pdf 1.43MB
lab7_循环神经网络.pdf 1.43MB
Lec 14 Planning.pdf 1.41MB
Lec 3 样例学习 II.pdf 1.41MB
lab11_强化学习.pdf 1.25MB
lab11_强化学习.pdf 1.25MB
人工智能实验lab1 实验报告.pdf 1.18MB
Lec 5 人工神经网络 II.pdf 1.12MB
T03_Answer.pdf 1.11MB
T02_Answer.pdf 1022KB
17341180_17341190_report.pdf 1013KB
Lec 4 人工神经网络 I.pdf 908KB
Lec 14 Planning solutions.pdf 907KB
17341190_yeshengyuan_lab3.pdf 860KB
lab8 集成学习.pdf 859KB
lab10_DQN与Policy Network.pdf 811KB
lab10_博弈树搜索.pdf 732KB
17341190_yeshengyuan_lab2.pdf 732KB
Lec 12 不确定性推理 II p49 答案.pdf 586KB
lab3 PLA&LR.pdf 543KB
Lec 11 不确定性推理 I 背景.pdf 460KB
人工智能期末考试卷.pdf 267KB
A1-2019.pdf 158KB
Lec 12 不确定性推理 II p80 答案.pdf 149KB
A3-2019.pdf 90KB
A4-2019.pdf 83KB
实验报告编写建议.pdf 73KB
A2-2019.pdf 53KB
image-20190927180226197.png 190KB
image-20191120222919385.png 183KB
image-20191120152236751.png 165KB
image-20190928211616952.png 154KB
image-20191120222618183.png 144KB
[email protected] 119KB
image-20191120152828552.png 116KB
image-20191120152750407.png 116KB
[email protected] 109KB
[email protected] 89KB
image-20191205112530478.png 82KB
[email protected] 80KB
[email protected] 79KB
[email protected] 77KB
image-20190928213156137.png 73KB
image-20190928213442585.png 69KB
image-20191202214555146.png 65KB
image-20191205105007314.png 57KB
image-20191205112705678.png 57KB
image-20191205112616410.png 55KB
image-20191205104658113.png 49KB
image-20191202214804132.png 49KB
image-20191205104623929.png 47KB
image-20191205112640457.png 46KB
image-20191205112551618.png 46KB
image-20191202214830654.png 45KB
image-20191202214813693.png 45KB
image-20191202212827746.png 44KB
image-20191205104516117.png 43KB
image-20191202214539972.png 43KB
image-20191205104442825.png 40KB
image-20190928120321069.png 38KB
image-20191205104407905.png 38KB
image-20191120223417197.png 36KB
image-20191202212556952.png 32KB
共 168 条
- 1
- 2
资源评论
神仙别闹
- 粉丝: 2687
- 资源: 7642
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功