1 分类
人在思考的过程中,往往不会产生精确的数值估计,而常做的事情是分类
。
但是这种阶跃函数就不能拟合出一条回归的直线了,这么画都感觉误差很大
这样时是不是好多了
那么怎么表示这样的关系呢?机制如你,想到分段函数
:
远的不说,这个大括号看着就很头疼,看着就是个不好处理的家伙。
我们接下来,看一种更为优雅的Logistic函数
:
不过我们一般会采用标准的Logistic函数
,L=1,k=1,y0=0
可以看出来这个函数的计算结果始终在0到1之间,他的名字也暗示了这一点:很适合做逻辑判断,即分类。
知识补充:
此时这里函数关系为:
2 函数求导进行求解出最小代价函数
接下来,我们按照之前的方法,分别e对w、b求偏导,然后合成:
补充Logistic函数
的求导:
理解复合函数求导中从外到内的这一过程,这有助于我们后续理解神经网络的精髓:
3 代码实现
豆豆数据集模拟:dataset.py
import numpy as np def get_beans(counts): xs = np.random.rand(counts) xs = np.sort(xs) ys = np.zeros(counts) for i in range(counts): x = xs[i] yi = 0.7*x+(0.5-np.random.rand())/50+0.5 if yi > 0.8: ys[i] = 1 return xs,ys
豆豆毒性分布如下:
加入激活函数后的梯度随机下降算法:activation.py
import dataset import matplotlib.pyplot as plt import numpy as np # 豆豆数量m m = 100 xs, ys = dataset.get_beans(m) # 配置图像 plt.title("Size-Toxicity Function", fontsize=12) plt.xlabel("Bean Size") plt.ylabel("Toxicity") plt.scatter(xs, ys) w = 0.1 b = 0.1 z = w * xs + b a = 1 / (1 + np.exp(-z)) # 加入激活函数 plt.plot(xs, a) plt.show() # alpha为学习率 alpha = 0.01 # 训练5000次 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 # 对w和b求偏导 deda = -2 * (y - a) dadz = a * (1 - a) dzdw = x dzdb = 1 dedw = deda * dadz * dzdw dedb = deda * dadz * dzdb 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秒