第一讲——一元一次函数感知器:如何描述直觉
Rosenblatt感知器模型
朴素但又意义非凡
第一个神经元模型——MCCulloch-Pitts模型,Rosenblat感知器模型正是让这个最简单的神经元模型拥有自我调整的能力
代码实现
import dataset
from matplotlib import pyplot as plt
xs,ys = dataset.get_beans(100)
print(xs)
print(ys)
#配置图像
plt.title("Size-Toxicity Function",fontsize = 12)#设置图像名称
plt.xlabel("Bean Size")
plt.ylabel("Toxicity")
plt.scatter(xs,ys )
plt.show()
w = 0.5
for j in range(100)
for i in range (100)
x = xs[i]
y = ys[i]
y_pre = w* x
error = y - y_pre
alpha = 0.05
w = w + alpha * error * x
y_pre = w * xs
print(y_pre)
plt.plot(xs,y_pre)
plt.show()
使用了两个for循环嵌套以提高训练次数,训练结果如下:
第二讲 方差代价函数——知错
现代神经网络的实现方式
事物出现的频率,收敛于它的概率
代价函数(Cost Function) ——当参数w取不同值时,对环境中的问题数据预测时产生不同的误差error。反过来,利用代价函数最低点的w值,把它放回到预测函数中,这时候预测函数也就很好的完成了对数据的拟合
代码实现:
import dataset
import matplotlib.pyplot as plt
import numpy as np
xs,ys = dataset.get_beans(100)
w = 0.100
# plot the figure
plt.title ("Size-Toxicity Function",fontsize = 12)
plt.xlabel("Bean size")
plt.ylabel("Toxicity")
plt.scatter(xs,ys)
y_pre = w* xs
plt.plot(xs,y_pre)
plt.show()
es = (ys - y_pre)**2
sum_e = np.sum(es)
sum_e = (1/100) * sum_e
print(sum_e)
ws = np.arange(0,3,0.1)
es = []
for w in ws:
y_pre = w * xs
y_pre = w * xs
e = (1/100) * np.sum((ys - y_pre)**2)
es.append(e)
plt.plot(ws,es)
plt.show()
w_min = np.sum(xs * ys) / np.sum(xs * xs)
y_pre = w_min * xs
plt.title("Size-Toxcity Function Final",fontsize = 12)
plt.xlabel("Bean Size")
plt.ylabel("Toxcity")
plt.scatter(xs,ys)
plt.plot(xs,y_pre)
plt.show()
梯度下降(一)
根据error的代数式可以看出,error的大小其实是一个以w为自变量的开口向上的抛物线函数,因此可以通过数据点(x,y)处erroe函数的梯度值来动态调整w的值。常见有:全局梯度下降(并行计算,计算量大)、随机梯度下降(不能并行计算)。mini batch —— mini批量梯度下降则结合了两者的优点,每次从样本中抽取100~200个数据进行梯度下降。
y = w * x函数模型代码实现:
import dataset
import matplotlib.pyplot as plt
import numpy as np
xs,ys = dataset.get_beans(100)
w = 0.100
# plot the figure
plt.title ("Size-Toxicity Function",fontsize = 12)
plt.xlabel("Bean size")
plt.ylabel("Toxicity")
plt.scatter(xs,ys)
w = 0.1
y_pre = w * xs
for _ in range(100):
for i in range(100):
x = xs[i]
y = ys[i]
# a= x ^ 2
# b = -2*x*y
# c = y^2
k = 2*(x**2)*w + (-2*x*y)
alpha = 0.1
w = w -alpha*k
plt.clf()
plt.scatter(xs,ys)
plt.xlim(0,1)
plt.ylim(0,1.2)
y_pre = w * xs
plt.plot(xs,y_pre)
plt.pause(0.1)
梯度下降(二)
在(一)中基于与y=wx的函数模型推算出的梯度下降模型,并不能满足二维空间平面中的所有散点,即:y=wx的函数模型限制了预测直线在空间中的自由移动,只有一个 旋转自由度,因此将函数模型“升维”为y = wx + b形式,即相应的error变为error(w,b)的二元函数,因此通过三维图像表示如下:
那么接下来就是同样利用梯度下降的思维找到曲面的最低点,就是问题的最优解:
基于梯度下降思路以及方差代价函数的神经元模型如下所示:
高维梯度下降算法代码实现:
import dataset
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
xs,ys = dataset.get_beans(100)
w = 0.100
b = 100
y_pre = w * xs + b
# plot the figure
plt.title ("Size-Toxicity Function",fontsize = 12)
plt.xlabel("Bean size")
plt.ylabel("Toxicity")
plt.scatter(xs,ys)
plt.plot(xs ,y_pre)
plt.show()
for _ in range(500):
for i in range(100):
x = xs[i]
y = ys[i]
dw = 2 * x**2*w + 2*x*b - 2*x*y
db = 2 * b + 2* x *w - 2*y
alpha = 0.02
w = w - alpha * dw
b = b - alpha * db
plt.clf()
plt.scatter(xs,ys)
y_pre = w * xs + b
plt.xlim(0,1)
plt.ylim(0,1.2)
plt.plot(xs,y_pre)
plt.pause(0.01)