2. 感知机

目标

感知机类似一个函数,接收多个输入,形成一个输出。接收的每个输入,会为其赋予不同的权重w,再将它们累加,与感知机的阈值theta比较。若小于等于阈值,则输出0;大于则输出1。

特点

一个感知机,实际上类似于“变色龙”的角色。控制其参数的构成,就可以得到多种逻辑门。“统一构造”,使得原始问题转变为了确定参数问题。在形成多种逻辑门的时候,是我们人自行设计参数,来完成我们的需求。

而机器学习,就是将这个决定参数的工作交给机器来完成。通过学习来确定合适的参数。我们需要做的就是思考构造(模型),并给计算机训练数据。

Python简单实现

引例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 感知机实现的简单代码

def AND(x1,x2):

    w1,w2,theta=0.5,0.5,0.7

    tmp=x1*w1+x2*w2-theta

    if tmp<=0:

        return 0

    else:

        return 1

1
2
3
4
5
6
7
8
9
10
11

# test AND func

print(AND(0,0))

print(AND(1,0))

print(AND(0,1))

print(AND(1,1))

    0

    0

    0

    1

使用NumPy完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# np使用

import numpy as np

x=np.array([0,1])

w=np.array([0.5,0.5])

b=-0.7

print(" w * x = "+str(w*x))

print("np.sum = "+str(np.sum(w*x)))

print("np.sum + b = "+str(np.sum(w*x) + b)) #有误差,由float定义导致,0.2无法精确表示。

     w * x = [0.  0.5]

    np.sum = 0.5

    np.sum + b = -0.19999999999999996

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# np AND

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

# 注意这里b是偏置,绝对值越大,越难激活。实际上比较的是 w*b<=b ? 0:1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# np NAND

def NAND(x1,x2):

    x=np.array([x1,x2])

    # 仅w和b不同,其余一致。

    w=np.array([-0.5,-0.5])

    b=0.7

    tmp=np.sum(w*x)+b

    if(tmp <= 0):

        return 0

    else:

        return 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# np OR

def OR(x1,x2):

    x=np.array([x1,x2])

    # 仅w和b不同,其余一致。

    w=np.array([0.5,0.5])

    b=-0.2

    tmp=np.sum(w*x)+b

    if(tmp <= 0):

        return 0

    else:

        return 1

多层感知机

XOR 逻辑门,则无法由感知机实现。

因为感知机只能形成一条直线,即将空间分成线性空间。而XOR需要非线性空间,即用曲线分割。

故使用多层感知机来完成。

实现XOR

1
2
3
4
5
6
7
8
9
10
11
12
13

# XOR

def XOR(x1,x2):

    s1=NAND(x1,x2)

    s2=OR(x1,x2)

    y=AND(s1,s2)

    return y

1
2
3
4
5
6
7
8
9
10
11

# test XOR

print("xor(0,0) : "+str(XOR(0,0)))

print("xor(0,1) : "+str(XOR(0,1)))

print("xor(1,0) : "+str(XOR(1,0)))

print("xor(1,1) : "+str(XOR(1,1)))

    xor(0,0) : 0

    xor(0,1) : 1

    xor(1,0) : 1

    xor(1,1) : 0

总结

  1. 感知机即接收多个输入,形成一个输出

  2. 不同感知机仅参数不同,其余完全一致

  3. 单个感知机仅可完成线性分割,即实现AND,NAND,OR

  4. 通过对感知机进行组合,即可实现非线性分隔,即完成复杂的函数,类似于XOR。

  5. 实际上,多层感知机足以构建起一个计算机


2. 感知机
http://blog.jiuge.host/post/20240102103800.html
作者
Pigeon.🕊
发布于
2024年1月2日
许可协议
CC BY-NC-SA 3.0