感知器

感知器,也可翻译为感知机,是Frank Rosenblatt在1957年就职于Cornell航空实验室(Cornell Aeronautical Laboratory)时所发明的一种人工神经网络。它可以被视为一种最简单形式的前馈式人工神经网络,是一种二元线性分类器。作为神经网络(深度学习)的起源 的 算法。 因此,学习感知机的构造也就是学习通向神经网络和深度学习的一种重要思想。

  • 在数学上描述为,感知器是使用特征向量来表示的前馈式人工神经网络(二元分类器),把矩阵上的输入(实数值向量)映射到输出值 f ( x ) f(x) f(x)(二元的值)上。
  • ω \omega ω是实数的表式(权重的向量,也是weight的首字母), 下图为例,例子。 x 1 , x 2 x_1,x_2 x1x2是 输入 信号, y 是 输出 信号, w 1 , w 2 w_1,w_2 w1w2 是权重, 图中的将 x 1 , x 2 x_1,x_2 x1x2送入神经元,或被分别乘以固定的权重 w 1 x 1 , w 2 x 2 w_1x_1,w_2x_2 w1x1w2x2
  • 神经元会计算传送过来的信号的总和 ω ⋅ x \omega · x ωx = ( w 1 x 1 + w 2 x 2 w_1x_1+w_2x_2 w1x1+w2x2)此为矩阵运算中的点积 ,当该总和超过某个界限值 θ \theta θ时,才会输出1,这也称神经元被激活了。 θ \theta θ称为阈值。
  • f ( x ) f(x) f(x) (0 或 1)用于对进行分类,看它是肯定的还是否定的,这属于二元分类问题。如果 是负的,那么加权后的输入必须产生一个肯定的值并且大于 ,这样才能令分类神经元大于阈值0。从空间上看,偏置改变了决策边界的位置(虽然不是定向的)。
  • 由于输入直接经过权重关系转换为输出,所以感知机可以被视为最简单形式的前馈式人工神经网络。

感知器_第1张图片

  • 把上图的感知机处理过程用数学表达式体现如下
    (1) y = { 0 , w 1 x 1 + w 2 x 2 ≤ θ 1 , w 1 x 1 + w 2 x 2 > θ y= \left \{\begin{array}{cc} 0, &w_1x_1+w_2x_2 \le \theta \\ 1, &w_1x_1+w_2x_2 \gt \theta \end{array}\right. \tag 1 y={0,1,w1x1+w2x2θw1x1+w2x2>θ(1)

  • 感知机的多个输入信号都有各自固有的权重, 这些权重发挥着控制各个信号的重要性的作用。 换句话说, 权重越大, 对应该权重的信号的重要性就越高。


用感知机实现与门

感知器_第2张图片

  • 实际上, 满足上图 的条件的参数的选择方法有无数多个。 比如, 当 为 (0. 5, 0. 5, 0. 8) 或者 (1. 0, 1. 0, 1. 0) 时, 同样也满足与门的条件。

  • 代码实现

def AND( x1, x2): 
	w1, w2, theta = 0. 5, 0. 5, 0. 7 
	tmp = x1* w1 + x2* w2 
	if tmp <= theta: 
		return 0 
	elif tmp > theta: 
		return 1
  • 将阈值转变为偏置 此时 θ = − b \theta=-b θ=b ,(1)式变为如下
    (2) y = { 0 , b + w 1 x 1 + w 2 x 2 ≤ 0 1 , b + w 1 x 1 + w 2 x 2 > 0 y= \left \{\begin{array}{cc} 0, &b+w_1x_1+w_2x_2 \le 0 \\ 1, &b+w_1x_1+w_2x_2 \gt 0 \tag 2 \end{array}\right. y={0,1,b+w1x1+w2x20b+w1x1+w2x2>0(2)
  • b称为偏置,一个不依赖于任何输入值的常数。偏置可以认为是激励函数的偏移量,或者给神经元一个基础活跃等级。换句话说,偏置是调整神经元被激活的容易程度(输出信号为1的程度)的参数。

感知器_第3张图片

  • 如上图,添加了权重为b的输入信号1。 这个感知 机 将 x 1 , x 2 x_1,x_2 x1x2, 1 三个信号作为神经元的输入, 将其和各自的权重相乘后, 传送至下一个神经元。 在下一个神经元中, 计算这些加权信号的总和。
  • 如式(2)所说的,如果这个输出的总和超过0, 则输出 1, 否则输出 0。

实现与门

def AND( x1, x2): 
	x = np. array([ x1, x2]) 
	w = np. array([ 0. 5, 0. 5]) 
	b = -0. 7 
	tmp = np. sum( w* x) + b 
	if tmp <= 0: 
		return 0 
	else: 
		return 1

实现与非门

def NAND( x1, x2): 
	x = np. array([ x1, x2]) 
	w = np. array([- 0. 5, -0. 5]) # 仅 权 重 和 偏 置 与 AND 不同!
	b = 0. 7 
	tmp = np. sum( w* x) + b 
	if tmp <= 0: 
		return 0 
	else: 
		return 1

实现或门


def OR( x1, x2): 
	x = np. array([ x1, x2]) 
	w = np. array([ 0. 5, 0. 5]) # 仅 权 重 和 偏 置 与 AND 不同! 
	b = -0. 2 
	tmp = np. sum( w* x) + b 
	if tmp <= 0: 
		return 0
	else: 
		return 1

你可能感兴趣的:(python机器学习,Python机器学习)