Python感知机算法实现

感知机算法是机器学习最基本的理论算法之一,其原理如下图所示:

该算例和应用以及数据集可从博主的github内下载:https://github.com/Airuio/python-

Python感知机算法实现

其python代码如下:

improt numpy as np

class perceptron(object):

def __init__(self,eta = 0.1,n_iter = 10):

self.eta = eta

self .n_iter = n_iter

def fit(self,x,y):

self.w_ = np.zeros(1+x.shape[1]) //创建一个全为0的一维矩阵,长度为样本x特征数加1,加一是补充闵值的权重。

self.errors_ = []

for _ in range(self.n_iter):

errors = 0

for xi,target in zip(x,y): //关联样本特征和预测值

update = self.eta * (target - self.predict(xi) )

self.w_[1:] += update * xi

self.w_[0] += update

errors += int(update != 0 )

self.errors_.append(errors)

return self //方法级联,自己返回修改后的自己

def net_input(self,x):

return np.dot(x, self.w_[1:])+self.w[0] //计算预测值

def predict(self, x):

return np.where(self.net_input(x) >= 0.0, 1, -1) //三元语句,满足大于0返回1,不满足返回-1

以上为感知器算法的实现,导入为模块perceptron_achieve。

接下来使用这个感知器来进行一个简单的分类计算:

以鸢尾花数据集LIRS数据集为对象进行统计分类,代码如下:

from perceptron_achieve import perceptron

import numpy as np #np用于实现算法中的一些操作

import pandas as pd #pd主要用于读取数据

import matplotlib.pyplot as plt #导入作图API

from matplotlib.colors import ListedColormap #结果可视化的高级可选用工具,可以自己配色

df = pd.read_excel(io = 'lris.xlsx',header = None) #读取数据为Dataframe结构,没有表头行

y = df.iloc[0:100,4].values #取前100列数据,4列为标识

y = np.where(y == 'Iris-setosa', -1,1)

X = df.iloc[0:100,[0,2]].values #iloc为选取表格区域,此处取二维特征进行分类,values为返回不含索引的表

plt.scatter(X[:50,0],X[0:50,1],color = 'red',marker = 'o', label = 'setosa') #绘制点图

plt.scatter(X[50:100,0],X[50:100,1],color = 'blue',marker = 'x', label = 'versicolor')

plt.xlabel('petal lenth') #添加坐标轴名称

plt.ylabel('sepal lenth')

plt.legend(loc = 2) #画出曲线标签以及标签的位置参数

plt.show() #出图

#以上六行与分类无关,仅仅是为了直观的感受两块数据的分布区域

ppn = perceptron(eta = 0.1,n_iter = 10)

ppn.fit(X,y) #完成了分类的任务,下面进行结果展示

plt.plot(range(1,len(ppn.errors_)+1),ppn.errors_,marker = 'o') #设置图像基本选项,x,y轴和样本标记

plt.xlabel('Epoches')

plt.ylabel('numbers of wrong classfications')

plt.xlim((1,10)) #设置取值区间

plt.ylim((0,4))

plt.show() #该图展示了迭代次数的收敛结果至第六次完全收敛

print(ppn.w_) #打印结果,下面对分类结果做可视化处理

def plot_decision_region(X,y,classifier,resolution = 0.02):

markers = ('s','x','o','~','v')

colors = ('red','blue','lightgreen','gray','cyan')

cmap = ListedColormap(colors[:len(np.unique(y))])

#画出界面

x1_min, x1max = X[:,0].min() - 1, X[:,0].max() + 1

x2_min, x2max = X[:,1].min() - 1, X[:,1].max() + 1

xx1,xx2 = np.meshgrid(np.arange(x1_min,x1max,resolution),

np.arange(x2_min,x2max,resolution)) #生成均匀网格点,

'''meshgrid的作用是根据传入的两个一维数组参数生成两个数组元素的列表。如果第一个参数是xarray,

维度是xdimesion,第二个参数是yarray,维度是ydimesion。那么生成的第一个二维数组是以xarray为行,

ydimesion行的向量;而第二个二维数组是以yarray的转置为列,xdimesion列的向量。'''

Z = classifier.predict(np.array([xx1.ravel(),xx2.ravel()]).T)

Z = Z.reshape(xx1.shape)

#在全图上每一个点(间隔0.2)计算预测值,并返回1或-1

plt.contourf(xx1,xx2,Z,alpha = 0.5,cmap = cmap) #画出等高线并填充颜色

plt.xlim(xx1.min(),xx1.max())

plt.ylim(xx2.min(),xx2.max())

#画上分类后的样本

for idx,cl in enumerate(np.unique(y)):

plt.scatter(x=X[y==cl,0], y=X[y==cl,1],alpha=0.8, #其中使用到了布尔索引

c=cmap(idx),marker=markers[idx],label=cl)

plot_decision_region(X,y,classifier = ppn)

plt.xlabel('sepal lenth [cm]')

plt.ylabel('petal lenth [cm]')

plt.legend(loc = 2)

plt.show()

算例得到如下图所示的结果:

Python感知机算法实现


分享到:


相關文章: