编译环境使用的是anaconda,应用的是python语言
软件包的下载:https://mirrors.tuna.tsinghua.edu.cn/
安装后进入:
Environment-->root-->open with Jupyter NoteBook-->弹出网页-->new-->python
然后进行代码编写(代码是根据教学视频中的代码给出的)
import numpy as np
class Perceptron(object):
"""
实现感知器的类
eta:学习率
n_iter:权重向量的训练次数
w_:神经分叉权重向量
errors_:用于记录神经元判断出错次数
def _int:为初始化函数
"""
def _int_(self, eta = 0.01, n_iter=10):
self.eta=eta;
self.n_iter=n_iter
pass
def fit(self,X,y):
"""
1.fit方法是为输入训练数据,培训神经元
2.其中X是电信号向量,即输入样本向量
3.y:每一个样本所属于的分类
4.每一个X都有一个shape属性,是对X向量的描述
X:shape(n_samples,n_features)
其中n_samples是指X中有多少个输入的样本量
n_features这个分叉输入的电信号有多少个,比如神经元有三个分叉,则这个神经元
可以接受三个输入电信号
eg:x:[[1,2,3],[4,5,6]]
n_samples:2
n_features:3
y:[1,-1]表示[1,2,3]属于分类1,[4,5,6]属于分类-1
1.初始化权重向量为0
2.np.zero:数学库,初始化分量全是0的一个向量
3.其中X.shape[1]为X.shape中的n_samples的值即为2
4.为什么np.zero中要+1,是对应阈值中的对应的w0,(步调函数的阈值)
5.self.errors_表示记录错误的次数
"""
self.w_=np.zero(1+X.shape[1]);
self.errors_=[]
"""
进入训练的过程,训练n_iter,如果尝试了n_iter次都是错误的,则终止训练
"""
for _ in range(self.n_iter):
errors=0
"""
1. X:[[1,2,3],[4,5,6]] y:[1,-1]
2.zip(X,y) = [[1,2,3,1],[4,5,6,-1]]
3.for中运用权值更新算法
update=η*(y-y'),η是学习率,y是电信号的向量分类,y'是计算出来的分类
y'是对应predict所调用出来的结果
"""
for xi,target in zip(X,y):
update = self.eta * (target - self.predict(xi))
"""
1.xi是向量,update是常量
update * xi等价于:
▽w(1)=X[1]*update,▽w(2)=X[2]*update,▽w(3)=X[3]*update
self.w[1:] +=等价于:
把原来的权重分量全部加上增加的分量▽w(1),▽w(2),▽w(3)
self.w[1:]等价于
是从1开始,忽略0元素,即忽略掉0
这样就可以更新每一个神经分叉进行更新
"""
self.w[1:] += update * xi
"""
更新阈值w0,然后统计判断错误的次数,如果错误次数越来越少,学习效果
越来越好,对新数据的判断越来越准确
如果判断正确,则y-y'=0,则target - self.predict(xi)=0
"""
self.w_[0] += update;
errors += int(update !=0.0)
self.errors_.append(errors)
pass
pass
"""
1.当神经元接受信号的时候会将接受的数据弱化,通过向量的点积运算来进行弱化
2.np.dot做点积,其中权重向量就是进行弱化的那个向量
3.z=w0*1+w1*x1+w2*x2+...+xn*wn
如果z<0则输入的x属于电信号-1
"""
def net_input(self,X):
return np.dot(X,self.w_[1:])+self.w_[0]
pass
def predict(self,X):
return np.where(self.net_input(X) >= 0.0 , 1,-1)
pass
pass
import numpy as np
class Perceptron(object):
def _int_(self, eta = 0.01, n_iter=10):
self.eta=eta;
self.n_iter=n_iter
pass
def fit(self,X,y):
self.w_=np.zero(1+X.shape[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.0)
self.errors_.append(errors)
pass
pass
def net_input(self,X):
return np.dot(X,self.w_[1:])+self.w_[0]
pass
def predict(self,X):
return np.where(self.net_input(X) >= 0.0 , 1,-1)
pass
pass
以上代码是构建神经元的学习基本模型
通过将大量数据给学习模型,让学习模型通过对大量数据进行观察总结出相应规律
根据数据的特点不断的调节神经元的权重数值,当神经元的权重数值调节到合适范围之后,就可以利用训练后的模型
去对新的数据进行运算,通过运算结果就能准确对新的数据进行分类和预测
pandas是python中的提供的非常强大的数据读取类库
header=None是因为csv数据中第一行往往不是一个数据,往往是用来说明下面一些数据的信息的,但代码中file中第一行就是数据,所以设置文件头为None
file = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
import pandas as pd
df = pd.read_csv(file,header=None)
df.head(10)
运行结果:
关于CSV文件问题:(该段摘自某网友的回答)
file
= 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
import pandas as pd
df = pd.read_csv(file,header=None)
df.head(10)
1.网址是文件的原地址,数据是可以直接从网址上拔下来的。
2.如果运行以上代码csv的文件,网站只能下载txt需要下载txt后转化成csv。
以上运行结果一致。