Python学习part7:感知机原理及理解

Python学习part7:感知机原理及理解

感知机介绍

感知机的思想很简单,比如我们在一个平台上有很多的男孩女孩,感知机的模型就是尝试找到一条直线,能够把所有的男孩和女孩隔离开。放到三维空间或者更高维的空间,感知机的模型就是尝试找到一个超平面,能够把所有的二元类别隔离开。
本篇文章我们主要以二维平面来进行介绍
感知机的直观感受
当我们有可分区间时,就会计算出一条直线将两类点分开
在这里插入图片描述
当没有可分区间时直线会不固定(荡来荡去至迭代上限停止)
在这里插入图片描述

感知机模型的建造

为了搭建感知机模型,我们要清楚高维数据的线性可分指什么。因此我们需要定义一个超平面的概念
wx+b=0这里的w和x指n维向量
由于本篇文章只研究二维平面,故可以将公式转成
w1x1+w2x2+b=0(即Ax+By+C=0)
简单来说就是通过Ax+By+C=0这条直线将平面上的不同类点分开

感知机的训练

"""
令w1,w2,...wn,v都是实数(R) ,其中至少有一个wi不为零,由所有满足线性方程w1*x1+w2*x2+...+wn*xn=v

的点X=[x1,x2,...xn]组成的集合,称为空间R的超平面。

从定义可以看出:超平面就是点的集合。集合中的某一点X,与向量w=[w1,w2,...wn]的内积,等于v

特殊地,如果令v等于0,对于训练集中某个点X:

w*X=w1*x1+w2*x2+...+wn*xn>0,将X标记为一类

w*X=w1*x1+w2*x2+...+wn*xn<0,将X标记为另一类
"""

import numpy as np
import matplotlib.pyplot as plt

#np.random.randn(x,y,z)中x指矩阵数,y指矩阵行数,z指矩阵列数,np.random.rand()同
#randn函数返回一个或一组样本,具有标准正态分布。
p_x = (np.random.randn(100, 2) *25) #目的获得坐标(x,y),*25表示放大25倍,一般x轴范围在放大倍数的四倍,如放大25,则x范围在(-50,50)最佳
p_y = np.zeros((100, 1)) #np.zeros(())指将设置p_y为空数组

for i in range(len(p_x)):
	p_y[i] = p_x[i][0] + p_x[i][1] - 25 #表示分界线y=-x+25,分界线以上为正,以下为负
    #p_y[i] = p_x[i][0] + 0.5*p_x[i][1] - 25#分界线不唯一,可以考虑修改斜率
#np.sign()是取数字符号(数字前的正负号)的函数,如p_y<0则y=-1,p_y=0则y=0,p_y=1则y=1
y = np.sign(p_y).astype(np.int8) #目的转换p_y的类型,及浮点数转化整形

#判断可分分界线上下不同点的颜色
for i in range(len(p_x)):
	if y[i] == 1:
		plt.plot(p_x[i][0], p_x[i][1], 'ro')
	else:
		plt.plot(p_x[i][0], p_x[i][1], 'bo')

#通过y=wx+b其中w,x均为n维向量
w = np.array([0.,0.]) #初始化w,保证收敛性
b = 0 #初始化b
delta = 0.00001 #learning_rate(与循环次数要同步,学习率小,循环次数增加)

#训练(因为上面已经进行了标准化处理,我们通过y=wx+b来感知分布区间的点)
for i in range(10000):
	temp = -1
	for j in range(len(p_x)):#这里j为非负数
		if y[j] != np.sign(np.dot(w, p_x[j]) + b):
			temp = j
			break
	if temp == -1:
		break
	#print(y[temp], p_x[temp], temp, np.dot(w, p_x[j]) + b, w, b)
	#按照标准进行不断的学习和改正w和b的值,使得分布趋于正确
	w += delta * y[temp] * p_x[temp]
	b += delta * y[temp]

line_x = [-50, 50]#两层
line_y = [0, 0]

for i in range(len(line_x)):
	line_y[i] = (-w[0] * line_x[i] - b) / w[1]#Ax+By+C=0-->y=(-Ax-C)/B
print(w[0])#由于拟合斜率趋于-1,w[0],w[1]近乎相近
print(w[1])
plt.plot(line_x, line_y)
print(line_x, line_y)
plt.grid(True)#格子
plt.show()

下面是几张训练完的效果图
在这里插入图片描述
在这里插入图片描述
初次接触感知机,只是了解到皮毛,以上为个人见解,若是有误,欢迎交流
Ending!

发布了10 篇原创文章 · 获赞 19 · 访问量 1305

猜你喜欢

转载自blog.csdn.net/qq_45603919/article/details/103223805