机器学习(神经网络基础篇)——个人理解篇3(概念+代码)

1  算法简介:感知机

 感知机 ≈ 一个会自己调整规则的智能开关,是最简单的“人工神经元”,用来把数据分成两类(比如“是/否”)。

1.1 理解+特点+局限性

直观解释:
想象你要判断“今天是否适合打游戏”,根据两个条件:

时间是否充足(比如 ≥2小时)
作业是否完成(比如已完成)
感知机的工作方式:

输入数据:把条件量化(比如时间=3小时,作业完成=1)。
加权求和:给每个条件一个“重要性评分”(比如时间权重0.6,作业权重0.4),计算总分:
总分 = 3×0.6 + 1×0.4 = 2.2
判断结果:设定一个阈值(比如1.5),总分超过阈值就输出“适合打游戏”(2.2 > 1.5 → 输出“是”)。

核心特点:
二分类工具:只能回答“是/否”类问题(比如判断邮件是“正常”还是“垃圾”)。
线性边界:用一条直线(或平面)把数据分成两类,适合简单问题(比如能用直线分开的数据)。
自动学习:如果判断错了,会自动调整权重(比如发现作业更重要,就提高作业的权重)。
局限:
只能解决“线性可分”问题(比如无法处理“螺旋形”分布的数据)。
改进版:后来人们发明了多层感知机(神经网络),可以解决更复杂的问题。

1.2 图例以及公式

通过对输入信号赋予不同的权重,在此基础上进行线性叠加,将其结果与“阈值”判断是否允许信号继续“流动”,如图1所示

图一 感知机信号流动图例

用数学公式表达的话是:

2 感知机背后的简单逻辑

2.1 逻辑电路简介

逻辑电路是数字电子系统的基础,通过基本逻辑门(与、或、非)组合实现特定的逻辑功能,广泛用于计算机、通信设备和控制系统。

如图二,是三中基础逻辑门的介绍

小总结
逻辑电路是用电子开关实现的“布尔代数”,把“是/否”判断转化为物理信号,让机器学会“思考”。

思考:为什么要介绍逻辑电路,和感知机有什么关系?

其实就是用机器来代替人的一个逻辑推理的过程,让机器决定赋予多大的权重。学习是确定 合适的参数的过程,而人要做的是思考感知机的构造(模型)。

2.2 感知机的Python语言实现

先简单实现一个AND的逻辑电路:

#——————————输入————————————:

#AND的逻辑电路

def And (x1 , x2):
    w1, w2, Q = 0.5, 0.5, 0.7
    N = w1*x1 + w2*x2
    if N >= Q:
        print("经判断线性叠加值大于阈值Q,判定输出为1")
        return 1
    else:
        print("经判断线性叠加值小于阈值Q,判定输出为0")
        return 0

# 先输入,再打印提示
x1 , x2 = map(float , input("请分别赋予两个输入值x1 , x2:").split())
print(f"输入的两个值分别是:, x1 = {x1} , x2 = {x2}")
And(x1 , x2)

#—————————输出——————————-:

请分别赋予两个输入值x1 , x2: 0.7 0.4
输入的两个值分别是:, x1 = 0.7 , x2 = 0.4
经判断线性叠加值小于阈值Q,判定输出为0

2.3单层神经网络(无激活函数)

经过不等式变换,公式重新绘制如下:

新定义:b 为偏置,w1,w2则为权重。下面采用数组的形式,重新编码:

#——————数组形式进行编码——————————
#输入:
import numpy as np
def prection (w , x , b , theta = 0):
    out_coming = np.sum(w * x ) + b
    return 1 if out_coming > theta else 0 #  可以添加一个阈值参数θ,实现更通用的感知机
    print("加权和加偏置的结果:",out_coming)
x = np.array([0.7 ,0.4])
w = np.array([0.5 ,0.5])
b = -0.7
print("输出的值是:", prection(w , x , b))



#输出:

输出的值是: 0


进一步理解:具体地说,w1和w2是控制输入信号的重要性的参数,而偏置是调 整神经元被激活的容易程度(输出信号为1的程度)的参数。比如,若b为 −0.1,则只要输入信号的加权总和超过0.1,神经元就会被激活。但是如果b 为−20.0,则输入信号的加权总和必须超过20.0,神经元才会被激活。像这样, 偏置的值决定了神经元被激活的容易程度。

问题来了,感知机只能实现AND的网络电路么?

答案当然是否定的:以下是基于Python实现的非门 或门的代码:

#_______只是定义逻辑,不运算
#非门的逻辑电路

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

2.3.1单层感知机的局限性

问题:感知机能否实现异或门的逻辑?

当然不能,往下看!!!

异或门真值表介绍:

即仅当x1或x2中的一方为 1时,才会输出1(“异或”是拒绝其他的意思)

首先,我们试着将或门的动作形象化。或门的情况下,当权重参数 (b, w1,w2) = (−0.5,1.0, 1.0)时,此时的感知机可以用下式表示:
 

在空间当中或门表示如下图:

感知机会生成由决策边界直线 -0.5 + x₁ + x₂ = 0 划分的二维空间,将输入空间分为两个区域:

直线一侧输出 1(△表示)
另一侧输出 0(○表示)

对于逻辑或门(OR)的情况:

当 (x₁, x₂) = (0,0) 时输出 0
当输入为 (0,1)、(1,0) 或 (1,1) 时均输出 1

关键问题:对于异或门(XOR)的情况,能否像或门那样用一条直线完美区分:

(0,0) 和 (1,1) → 输出 0(○)
(0,1) 和 (1,0) → 输出 1(△)?

在空间中的异或门:

想要用一条直线将上图中的○和△分开,无论如何都做不到。事实上, 用一条直线是无法将○和△分开的

2.4线性和非线性空间定义

感知机的局限性就在于它只能表示由一条直线分割的空间。由下图这样的曲线分割而成的空间称为 非线性空间,由直线分割而成的空间称为线性空间。

2.5多层感知机

简单介绍一下与非或门的符号,如下图:

同过三个基础的逻辑门电路组合,可以实现异或么的功能,如下图:

其中x1,x2可以视为第一层输入,s1,s2可以视为第二层输入(依赖于第一层的逻辑关系),y是最后的输出。其异或么对应的真值表如下:

2.5.1 多层感知机的Python实现

#定义函数功能
def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y

#预期的输入与输出
XOR(0, 0) # 输出0
XOR(1, 0) # 输出1
XOR(0, 1) # 输出1
XOR(1, 1) # 输出0

进一步简化可得( 用感知机表示异或门):

信号传递过程:

1.第0层的两个神经元接收输入信号,并将信号发送至第1层的神经元。

.第1层的神经元将信号发送至第2层的神经元,第2层的神经元输出y。

换句话来说:“单层感知机 无法表示的东西,通过增加一层就可以解决”。实际上,感知机还可以表示计算机!!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值