激活函数

文章发布时间:

文章总字数:
497

预计阅读时间:
2 分钟

之前对于一个函数的精确拟合的方式,对于一个智能体来说比较罕见,我们更多的是判断一个一个东西对,或者不对,最多再多一个不确定。这样的判断方式自然就和先前的拟合函数的方法相差甚远。为了达到这样的效果,我们便使用激活函数对之前的预测模型进行分类。而到此,我们才真正接触到了完整的Rosenblatt感知器模型。

为了进行分类,我们自然一开始就想到分段函数。但是这种函数在代码的层面上比较难以实现,所以,我们便引入了Logistic函数。

当然,我们一般取它的标准形式,即:

对于这样的函数我们可以使用nupmy库的exp()函数来实现:1/(1+np.exp(-y))。

这样我们便可以使用它来对预测结果进行分类了

利用复合函数求导的知识,对加入了激活函数的预测函数求偏导数。

1
2
3
4
5
6
7
              deda = -2*(y-a)
dadz = a*(1-a)
dzdw = x

dedw = deda*dadz*dzdw
dzdb = 1
dedb = deda*dadz*dzdb

再把这段代码加入之前的代码,在进行一些修改,我们可以得到最后的源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import dataset
import matplotlib.pyplot as plt
import numpy as np
xs, ys = dataset.get_beans(100)


print(xs)
print(ys)


plt.title("STF", fontsize=12)
plt.xlabel("B")
plt.ylabel("T")

plt.scatter(xs, ys)

w = 0.1
b = 0.1
y_pre = w*xs + b
plt.plot(xs, y_pre)
plt.show()

for _ in range(5000):
for i in range(100):
x = xs[i]
y = ys[i]

z = w*x + b
a = 1/(1+np.exp(-z))
e = (y-a)**2


deda = -2*(y-a)
dadz = a*(1-a)
dzdw = x

dedw = deda*dadz*dzdw
dzdb = 1
dedb = deda*dadz*dzdb

alpha = 0.05

w = w - alpha*dedw
b = b - alpha*dedb

if _%100 == 0:
plt.clf()
plt.scatter(xs, ys)
z = w*xs + b
a = 1/(1+np.exp(-z))
plt.xlim(0,1)
plt.ylim(0,1.2)
plt.plot(xs, a)
plt.pause(0.01)#暂停0.01秒

运行后可以观察到:

很好的对两类数据进行了分类。