⾃⼰设计⼀个感知机实现⼆分类算法
实现⼀个简单的神经⽹络,做⼀个简单的⼆分类算法。为了理解神经⽹络,我们应该先理解神经⽹络的组成单元——神经元。神经元也叫做感知器。感知器算法在上个世纪50-70年代很流⾏,也成功解决了很多问题。并且,感知器算法也是⾮常简单的。在⼈⼯神经⽹络领域中,感知器也被指为单层的⼈⼯神经⽹络,以区别于较复杂的多层感知器(Multilayer Perceptron)。 作为⼀种线性分类器,(单层)感知器可说是最简单的前向⼈⼯神经⽹络形式。尽管结构简单,感知器能够学习并解决相当复杂的问题。感知器主要的本质缺陷是它不能处理线性不可分问题。
感知器有如下组成部分:
输⼊权值 激活函数 输出
以下程序切实实现权值更新,根据误差结果更新迭代,并且观察每次迭代后误差变化,⽹络趋于收敛。并且对测试集结果进⾏⼆分类,并且⽤可视化图⽚展⽰。
其中,在处理过程中,对python类概念、以及多个第三⽅库有⼀定了解,⽐如numpy、matplotlib等。
1.创建⼀个类作为分类器,可处理更新权重信息、记录误差信息
class AdalineG(object):
"""
eta:float
学习效率,处于0和1之间
n_iter:int 对训练数据进⾏学习改进次数
w_:⼀维向量
存储权重数值
operator是什么意思error_: 存储每次迭代改进时,⽹络对数据进⾏错误判断的次数
"""
def__init__(lf,eta=0.01,n_iter=50):
lf.n_iter = n_iter
def net_input(lf, X):
return np.dot(X, lf.w_[1:]) + lf.w_[0]
def activation(lf, X):
艾薇儿歌曲mvreturn lf_input(X)
def predict(lf, X):
return np.where(lf.activation(X) >=0, 1, -1)
def fit(lf, X, y):
"""
X:⼆维数组[n_sampls, n_features]
n_samples 表⽰X中含有训练数据条⽬数
n_faetures 含有4个数据的⼀维向量,⽤于表⽰⼀条训练条⽬
y:⼀维向量
⽤于存储每⼀训练条⽬对应的正确分类
"""
lf.w_ = np.zeros(1 + X.shape[1])
for i in range(lf.n_iter):
strokeoutput = lf_input(X)
errors = (y-output)
lf.w_[1:] += lf.eta * X.T.dot(errors)
lf.w_[0] += lf.eta * errors.sum()
cost = (errors ** 2).sum() /2.0
承担的英文
return lf
file="iris1.xlsx"
import pandas as pd
#header为none⽬的表⽰第⼀⾏并不是头⽂件信息,并且读⼊
ad_excel(file,header=None)
import matplotlib.pyplot as plt
荨麻属import numpy as np
y=df.loc[0:99,4].values
#对第四列数据信息进⾏处理,并且将其结果作为真实分类结果。
y=np.where(y=="Iris-tosa",-1,1)
#只需要第0列和第2列数据作为数据集
X=df.iloc[0:100,[0,2]].values
3.更新权重,渐进下降。
ada = AdalineG(eta=0.0001, n_iter=50)
ada.fit(X, y)
#以上⽤来更新权重,获取⼀个最新的权重值,作为分类器
4.准备测试集数据进⾏测试、展⽰⼆分类测试结果
lors import ListedColormap
#resolution划分数据的步长
def plot_decision_regions(X, y, classifier, resolution=0.02):
#数据描点的形状,具体可见画图⽅法
marker = ('s', 'x', 'o', 'v')
#数据点的颜⾊
colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')中文在线翻译英语
#根据数据种类选择形状和颜⾊,例如我们只有两类-1和1,只选择前两个红⾊和蓝⾊
cmap = ListedColormap(colors[:len(np.unique(y))])
#选择两列数据的最⼤值和最⼩值以便绘制数据轴坐标起⽌点
x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max()
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max()
#将x1、x2最⼤最⼩值通过arange函数得到的向量,扩展成两个⼆维矩阵
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution)) #预测(y=-1/1)
Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) #ravel还原成单维向量
#绘制
Z= Z.reshape(xx1.shape) #将Z转换成与xx1⼀样的⼆维数组
#x,y轴信息结果
plt.xlim(xx1.min(), xx1.max())
plt.ylim(xx2.min(), xx2.max())
#plot和scatter本质上没有区别画图2d
#按照分类最终结果绘图
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=marker[idx], label=cl)
英语集训营5.输⼊数据、进⾏测试,可视化展⽰结果
plot_decision_regions(X, y, classifier=ada)
#数据的填充,增加数据,进⾏测试
情人节快乐 英文plt.title('Adaline-Gradient descent')
plt.xlabel('花茎长度')
plt.ylabel('花瓣长度')
plt.legend(loc='upper left')
plt.show()
结果如图所⽰:
元旦主持词
6.打印模型对数据判断的错误次数(逐渐迭代⽹络收敛过程) 在之前训练过程中,错误结果已保存
结果如图所⽰:
整个过程,⾃⼰⼿敲⼀遍,即深刻了印象,也了解了基本原理,⼀步⼀步往前⾛啦。plt.plot(range (1, st_)+1), st_, marker='o')plt.xlabel('Epochs (迭代次数)')
凡夫俗子是什么意思plt.ylabel('sum-squard-error')
plt.show()