一、感知器的实现
- 把权重初始化为0或者小的随机数。
- 对每个训练样本x(i):
- a.计算输出值
y
。 - b.更新权重。
import numpy as np
class Perceptron(object):
def __init__(self,eta = 0.01,n_iter = 50,random_state = 1): #用给定的学习率η(eta)和训练次数n_iter初始化 新的Perceptron对象。
self.eta = eta
self.n_iter = n_iter
self.random_state = random_state # 确定随机数种子,使随机训练结果可以重现
def fit(self,X,y):
rgen = np.randomState(self.random_state)
self_w = rgen.normal(loc = 0.0,scale = 0.01,size = 1 + X.shape[1]) #初始化self.w_的权重,为以y轴为对称轴,0.01为标准差,得到的初始权重存入向量Rm+1
#m代表数据集的维数或特征数,+1为偏差单位向量的第一个分量。
#self.w_[0]代表偏差单位。
self.errors_= []
for _ in range(self.n_iter): #遍历训练集的所有样本
errors = 0
for xi.targe in zip(X,y): #感知器学习规则更新权重
update = self.eta * (targe-self.predict(xi)) #并更新权重
self.w_[1:]+=update *xi
self.w_[0] +=update
errors +=int(update !=0.0)
self.errors_.append(errors) #每个迭代中收集到的分类错误记入self.errors_列表
return self
def net_input(self,X): #计算向量点积 wTx
return np.dot(X,self.w_[1:]+ self.w_[0])
def predict(seld,X):
return np.where(self.net_iput(X) >=0.0,1,-1) #净输入传递到阈值函数,产生一个二元输出-1或+1,即预 测样本的分类标签。
二、知识补充:
numpy.random.RandomState.random(a)
生成伪随机数,相当于在固定的集合里面随机选取a
个数- 下面解释原博文链接https://blog.csdn.net/huanhuan_Coder/article/details/80762208
np.random.normal()
的意思是一个正态分布,normal这里是正态的意思。
numpy.random.normal(loc=0,scale=1e-2,size=shape) ,意义如下:
参数loc(float):正态分布的均值,对应着这个分布的中心。loc=0说明这一个以Y轴为对称轴的正态分布
参数scale(float):正态分布的标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦
参数size(int 或者整数元组):输出的值赋在shape里,默认为None
- 定义:
zip([iterable, ...])
zip()
是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。利用*
号操作符,可以将list unzip(解压)
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c)
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped)
[(1, 2, 3), (4, 5, 6)]
- 原博文链接https://blog.csdn.net/u012149181/article/details/78913416
dot()
返回的是两个数组的点积(dot product)
1.如果处理的是一维数组,则得到的是两数组的內积(顺便去补一下数学知识)
In : d = np.arange(0,9)
Out: array([0, 1, 2, 3, 4, 5, 6, 7, 8])
In : e = d[::-1]
Out: array([8, 7, 6, 5, 4, 3, 2, 1, 0])
In : np.dot(d,e)
Out: 84
2.如果是二维数组(矩阵)之间的运算,则得到的是矩阵积(mastrix product)。
In : a = np.arange(1,5).reshape(2,2)
Out:
array([[1, 2],
[3, 4]])
In : b = np.arange(5,9).reshape(2,2)
Out: array([[5, 6],
[7, 8]])
In : np.dot(a,b)
Out:
array([[19, 22],
[43, 50]])
np.where(condition, x, y)
,满足条件(condition),输出x,不满足输出y。np.shape
,查看矩阵的维数
c = array([[1,1],[1,2],[1,3],[1,4]])
>>> c.shape
(4, 2)
>>> c.shape[0]
4
>>> c.shape[1]
2