原始感知机入门——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()

   

  输出:

时间: 2024-09-29 01:51:01

原始感知机入门——python3实现的相关文章

如何才能快速入门python3?

一些朋友自学python过程中,发现书也能看懂,书上的玩具代码也能看懂,但为啥自己不能做习题,不能写代码解决问题,自己不能动手写代码? 原因是初学者没有学会计算思维.解决问题的方法.编程思路. 编程思路的养成需要一个过程的,在编码过程中思考,多动手敲代码. 有时候,想不明白的地方,有人稍微点破一下,那层纸就很容易破. 请看下面的例子. 编程思路一: 经常有人问,一个文本文件,要抽取多少行以后的文本. 相信记数循环,大家都看得懂,也会写.下面的代码就是利用记数循环来解决这个问题. 代码一: 一个几

吴裕雄 python 机器学习——人工神经网络与原始感知机模型

import numpy as np from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D from sklearn.neural_network import MLPClassifier def creat_data(n): ''' 创建线性可分数据集 :param n: 正例样本的个数(同时也是负例样本的个数) :return: 返回一个线性可分数据集,数据集大小为 2*n ''' np.ra

一起入门python3之元组和数列

这一节我们来说一下,元组(tupe)&数列(list).每天苦逼的工作不易啊,哎.不过呢一腔热血学习.哈哈哈哈 #井号代表注释哈. 0x01 数列-list        数列可以说是一种集合,我们可以随时的对里面的数据进行删减等操作.且看下面的操作>>>hi = ['hello','world']         #如此便是创建一个数列,里面的元素为hello,world然后赋值给hi>>>hi.append("ergouzi") #加入一

入门-Python-3

Python 运算符 什么是运算符? 举个简单的例子 4 +5 = 9 . 例子中,4 和 5 被称为操作数,"+" 称为运算符. Python语言支持以下类型的运算符: 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算符 成员运算符 身份运算符 运算符优先级 接下来让我们一个个来学习Python的运算符. Python算术运算符 以下假设变量a为10,变量b为20: 运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数

Python3快速入门

Python3快速入门Python3快速入门(一)--Python简介https://blog.51cto.com/9291927/2385592Python3快速入门(二)--Python3基础https://blog.51cto.com/9291927/2409575Python3快速入门(三)--Python3标准数据类型https://blog.51cto.com/9291927/2409580Python3快速入门(四)--Python包管理https://blog.51cto.com

收藏-千行代码入门Python

github地址:GitHub - xianhu/LearnPython: 以撸代码的形式学习Python 很多人反应打不开,可能是因为网速的原因.内容较多,耐心等待一会! ============================================================ 自己以代码的形式整理的Python入门文档,不算空行.注释等,应该不到一千行. 认认真真读完.练习完这些代码,应该就能上手工作了. 可能在网页上显示的效果不理想,可以手动复制下来粘贴到文本文件中,利用no

千行代码入门Python

这个是从网上找到的一份快速入门python的极简教程,大概一千行左右,个人觉得不错,特此收藏以备后用. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

【Python3】SMTP发送邮件

犹豫和反复浪费了大量时间. 与朋友言 在完成一个邮件发送程序之前我根本不明白什么是邮件,哪怕已经读过廖雪峰大神的文章,没有贬低大神的意思,大神的博客已经非常的详细, 是我的眼大肚皮小毛病在作祟,由一个邮件程序入门python3的确是很不错的,如果可能,我希望朋友们从廖大神的python2程序自行琢磨出python3版本,这对理解字符编码很有帮助. 利器在手,天下我有,python编程推荐pycharm,有了pycharm有飞起来的冲动,fly fly fly 有码才快乐 1 #begin 2 i

多层感知机,非权值共享型卷积神经网络,权值共享型卷积神经网络之间的关系

前言:最近学习深度学习,有感写一点总结. 我们常常所说的神经网络,一般是指原始的多层感知机,简称MLP,它是在原始感知机堆叠多层而成的,MLP完全由全连接层组成(当然也有激活函数),即Caffe里的IP层.MLP的最大的缺点在于参数众多,比如说我们的网络层为1000--1000--500--20,那么它的总的参数为:1000*1000+1000*500+500*20. 参数过多不好训练,容易产生过拟合现象. 卷积神经网络,即CNN,它大大减少的网络参数的数目,通过1. 权值共享 2. 局部连接