原始感知机入门——python3实现
运用最简单的原始(对应的有对偶)感知机算法实现线性分类。
参考书目:《统计学习方法》(李航)
算法原理:
踩到的坑:以为误分类的数据只使用一次,造成分类结果很差,在train函数内加个简单的递归,解决问题;不同的学习率结果差别很大,通过循环学习率取最优解决。
AND:个人理解尚浅,理论和代码都未免有差错,欢迎指出错误共同学习,不胜感激。
代码如下:win7 32bit + python3.4 + pycharm
import numpy as np
from matplotlib import pyplot as plt # train matrix
def get_train_data():
M1 = np.random.random((100,2))
M11 = np.column_stack((M1,np.ones(100)))
M2 = np.random.random((100,2)) - 0.7
M22 = np.column_stack((M2,np.ones(100)*(-1)))
MA = np.vstack((M11,M22)) plt.plot(M1[:,0],M1[:,1], 'ro')
plt.plot(M2[:,0],M2[:,1], 'go')
min_x = np.min(M2)
max_x = np.max(M1)
# 此处返回 x 是为了之后作图方便
x = np.linspace(min_x, max_x, 100) return MA,x # 方便在train函数中识别误分类点
def func(w,b,xi,yi):
num = yi*(np.dot(w,xi)+b)
return num # 训练training data
def train(MA, w, b):
# M 存储每次处理后依旧处于误分类的原始数据
M = []
for sample in MA:
xi = sample[0:2]
yi = sample[-1]
# 如果为误分类,改变w, b
# n 为学习率
if func(w,b,xi,yi) <= 0:
w += n*yi*xi
b += n*yi
M.append(sample)
if len(M) > 0:
# print('迭代...')
train(M, w, b)
return w,b # 作出分类线的图
def plot_classify(w,b,x, rate0):
y = (w[0]*x+b)/((-1)*w[1])
plt.plot(x,y)
plt.title('Accuracy = '+str(rate0)) # 随机生成testing data 并作图
def get_test_data():
M = np.random.random((50,2))
plt.plot(M[:,0],M[:,1],'*y')
return M
# 对传入的testing data 的单个样本进行分类
def classify(w,b,test_i):
if np.sign(np.dot(w,test_i)+b) == 1:
return 1
else:
return 0 # 测试数据,返回正确率
def test(w,b,test_data):
right_count = 0
for test_i in test_data:
classx = classify(w,b,test_i)
if classx == 1:
right_count += 1
rate = right_count/len(test_data)
return rate if __name__=="__main__":
MA,x= get_train_data()
test_data = get_test_data()
# 定义初始的w,b
w = [0,0]
b = 0
# 初始化最优的正确率
rate0 = 0
# 循环不同的学习率n,寻求最优的学习率,即最终的rate0
# w0,b0为对应的最优参数
for i in np.linspace(0.01,1,100):
n = i
w,b = train(MA,w,b)
# print(w,b)
rate = test(w,b,test_data)
if rate >= rate0:
rate0 = rate
w0 = w
b0 = b
print('Until now, the best result of the accuracy on test data is '+str(rate))
print('with w='+str(w0)+' b='+str(b0))
print('---------------------------------------------')
# 在选定最优的学习率后,作图
plot_classify(w0,b0,x,rate0)
plt.show()
输出:
原始感知机入门——python3实现的更多相关文章
- 如何才能快速入门python3?
一些朋友自学python过程中,发现书也能看懂,书上的玩具代码也能看懂,但为啥自己不能做习题,不能写代码解决问题,自己不能动手写代码? 原因是初学者没有学会计算思维.解决问题的方法.编程思路. 编程思 ...
- 吴裕雄 python 机器学习——人工神经网络与原始感知机模型
import numpy as np from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D from ...
- Python3入门 Python3+Selenium做UI页面测试的学习
https://ke.qq.com/course/310732 一直计划着系统地看看Python3,这两天不用加班了,在网上下了些资源,自己演练一番. Python3标识符保留字,直接命令行中可以查看 ...
- 一起入门python3之元组和数列
这一节我们来说一下,元组(tupe)&数列(list).每天苦逼的工作不易啊,哎.不过呢一腔热血学习.哈哈哈哈 #井号代表注释哈. 0x01 数列-list 数列可以说是一种集合 ...
- 全面系统Python3入门+进阶课程 ✌✌
全面系统Python3入门+进阶课程 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 无论是大数据.人工智能还是机器学习,Python都是最热门的首选语言 ,这 ...
- 千行代码入门Python
这个是从网上找到的一份快速入门python的极简教程,大概一千行左右,个人觉得不错,特此收藏以备后用. # _*_ coding: utf-8 _*_ """类型和运算- ...
- 【Python3】SMTP发送邮件
犹豫和反复浪费了大量时间. 与朋友言 在完成一个邮件发送程序之前我根本不明白什么是邮件,哪怕已经读过廖雪峰大神的文章,没有贬低大神的意思,大神的博客已经非常的详细, 是我的眼大肚皮小毛病在作祟,由一个 ...
- MRJob 极速入门教程,使用Python玩转Hadoop
想要Hadoop乖巧地运行Python程序,学习mrjob可能是最直接.最简单的方法了,你甚至都不要按安装部署Hadoop集群.mrjob拥有很多优秀的特性比如: 支持多步骤的MapReduce任务工 ...
- 自学入门 Python 优质中文资源索引
所有资源基于 Python3 版本,全部中文内容,适用于 爬虫 / Web / 数据 方向,每个单元根据学习习惯从 书籍 / 文档 / 视频 中选择一类即可,建议任选一本书籍,然后配合文档类进行学习. ...
随机推荐
- volatile关键字及编译器指令乱序总结
本文简单介绍volatile关键字的使用,进而引出编译期间内存乱序的问题,并介绍了有效防止编译器内存乱序所带来的问题的解决方法,文中简单提了下CPU指令乱序的现象,但并没有深入讨论. 以下是我搭建的博 ...
- js 读取 地址栏参数 转
用JS获取地址栏参数的方法(超级简单) 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var re ...
- 根据UUID和MD5, 生成可以用作Token的字符串
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util. ...
- AutoCAD2006启动慢解决方案
一. 1.打开控制面板.2.选择Internet选项.3.在Internet属性对话框里,点高级标签.4.清除“检查发行商的证书吊销”选项.5.单击应用,然后单击OK.6.重新启动,运行应用程序. 二 ...
- UISegmentControl
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- vs启动调试很慢的解决办法
1.关闭所有 Visual Studio 2010 实例. 2.单击“开始”,选择“运行...”. 3.键入“devenv.exe /resetuserdata”. 此命令会运行几分钟时间,与此同时, ...
- HDU--1863--畅通工程--并查集
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- javascript如何用户的判断操作系统
<script> alert(window.navigator.userAgent); if(window.navigator.userAgent.indexOf("Window ...
- js动画之链式运动
链式运动就是当一个运动完,又启动另外一个运动,这个怎么实现呢?这里我们是用用回调函数实现一套链式动画 显示给div左移100像素,然后然后透明度变100 <!DOCTYPE html> & ...
- 005-Scala数组操作实战详解
005-Scala数组操作实战详解 Worksheet的使用 交互式命令执行平台 记得每次要保存才会出相应的结果 数组的基本操作 数组的下标是从0开始和Tuple不同 缓冲数组ArrayBuffer( ...