本文为塞巴斯蒂安所著"python机器学习"感知器一节读书笔记.
class Perceptron(object):
def __init__(self, eta=0.01, n_iter=50, random_state=1):#初始化
self.eta = eta# 学习率(between 0.0 and 1.0)
self.n_iter = n_iter# 最大迭代次数
#只有两个类线性可分,并且学习速率(eta)足够小,这样感知器的收敛性才能得到保证。
#如果两个类不能用线性决策边界分离,可以为训练集设置最大迭代次数,及容忍错误的
#阈值(w_[0]=-θ,不是eta),否则分类感知器将永远都不会停止更新权重
self.random_state = random_state# 用于初始化权重的随机数生成器的种子
def net_input(self, X):#计算净输入
#这里X只是参数的名字,实际传入数据集X的一行xi,不是传入整个数据集X,
#参数名字可以自己起
return np.dot(X, self.w_[1:]) + self.w_[0]#返回第i行的净输入
def predict(self, X):#返回分类标签
#这里X只是参数的名字,实际传入数据集X的一行xi,不是传入整个数据集X,
#参数名字可以自己起
return np.where(self.net_input(X) >= 0.0, 1, -1)
#返回第i行的分类标签
def fit(self, X, y):#传入数据集X和正确分类标签y
rgen = np.random.RandomState(self.random_state)
self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1])#初始化权重
# 总共5个指标,w_[0]=-θ(θ是阈值)对应指标(指标0)值设定为1,
# 花萼长(指标1),花萼宽(指标2),花瓣长(指标3),花瓣宽(指标4)
# 从self.w_[1]到self.w_[4]这四个值是花萼长,花萼宽,花瓣长,花瓣宽这四个指标的权重,即self.w_[1:]
# 定义w_[0]=-θ(θ是阈值),对应指标0(值为1),
# 所以净输入X.dot[w]= 1 *self.w_[0] + np.dot(X, self.w_[1:])
self.errors_ = []#初始化列表,errors_[i]代表第i次迭代的误分类数
for _ in range(self.n_iter):#最大迭代次数的循环体
errors = 0#每次迭代开始清零误分类数
for xi, target in zip(X, y):#遍历X每一行的循环体,一行一行的判断,
#公式 self.w_+=self.eta * (target - self.predict(xi))* xi
#调用predict(xi)方法计算分类标签,注意这里是把数据集的一行传给predict(xi)
update = self.eta * (target - self.predict(xi))
self.w_[1:] += update * xi
self.w_[0] += update #定义w_[0]=-θ(θ是阈值),对应指标0(值为1),就是乘1
errors += int(update != 0.0)#当分类正确时,
#update = self.eta * (target - self.predict(xi))=0,取反,即为分类错误的
self.errors_.append(errors)#将第i次迭代的误分类数记录到列表中
return self #返回实例本身,可以实现连续调用