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!