用python实现感知器

一、感知器的实现

  1. 把权重初始化为0或者小的随机数。
  2. 对每个训练样本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.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)]

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
发布了70 篇原创文章 · 获赞 5 · 访问量 3518

猜你喜欢

转载自blog.csdn.net/qq_42647903/article/details/102995720
今日推荐