回归问题较简单,回归模型也是数学建模中最为简单和入门的模型。回归问题主要采用数学神经元模型来构建成神经元线性模型。搭建成功后,计算他的误差,再利用梯度下降法来优化参数得到最后的模型。
1.1神经元模型
成年人的大脑中包含了约1000亿个神经元,每个神经元通过树突获取输入信号,通过轴突传递输出信号,神经元之间相互连接构成了巨大的神经网络,从而形成了人脑感知和意思的基础。如图1.1所示。1943年Walter
Pitts通过对生物神经元的研究,剔除了模拟生物神经元机制的人工神经网络的数学模型,成为了现代深度学习的基石。
线性模型的初建立
那么,神经元模型是怎样在人工智能神经网络中应用的呢?我们先把生物神经元模型抽象为1.2(a所示)的数学结构:神经元输入向量x,经过函数映射后得到输出y。θ是简单的参数。线性变换:f(x)=
w
T
w^T
wT+b 展开为标量形式:
**1.2(b)**可以很好的复现以上的运算逻辑,参数θ确定了神经元的状态,固定θ参数即可确定此神经元的处理逻辑。我们将神经元模型进一步的进行简化,将神经元输入节点数调整为1(即为单输入n=1),即:
y =wx+b
这就是线性模型的初现,我们很容易绘制出神经元的纯输出y和输入x的变化趋势,在此就不作赘述,w参数可以理解为直线的斜率,而b参数可以理解为直线的偏置。
N =1的输入有w,b两个未知数。我们只需取两个点即可求解。同理,对于N输入的线性神经元模型,只需采取N+1组不同的数据点即可。
1.2优化方法
1.2.1MSE 均方误差的计算
建立好模型后,就该考虑观测误差的问题了,我们假设观测误差变量。当当前模型的所有采样点上的预测值与真实值之间的差的平方和最小时,所对应的参数w,b构成的直线就是我们要找的最优直线
然而MSE虽然简单直接,但是面对大规模,高纬度数据的优化问题时计算效率很低,基本不可行,于是采用GD梯度下降算法来进行优化。
1.2.2GD 梯度下降算法
以三维函数为例z=f(x,y),函数分别对x,y求偏导数,则梯度f为向量
(
∂
z
∂
x
,
∂
z
∂
x
)
(\frac {\partial z } {\partial x },\frac {\partial z } {\partial x})
(∂x∂z,∂x∂z)
我们利用
来迭代更新x’
对于一维函数,上述向量形式可以退化成标量形式:
我们用梯度下降算法来求救两个参数。需要最小化的是均方误差函数,我们按照
的方式循环更新参数
1.3线性模型的应用
我们需将下列的数据代入线性模型再进行求解,此处温度是X,对数之后的为Y
我们将两列数据导入csv文件
再分别进行以下四个步骤
- 导入数据
- 计算误差
- 计算梯度
- 梯度更新
我们得到了以下的结果(此为迭代47次的效果)
最后附上代码:
# y = ax + b
def compute_error_for_line_given_points(b,a, points):
totalError = 0
for i in range(0, len(points)):
x = points[i, 0]
y = points[i, 1]
# computer mean-squared-error totalError += (y - (a* x + b)) ** 2
# average loss for each point
return totalError / float(len(points))
def step_gradient(b_current, a_current, points, learningRate):
b_gradient = 0
a_gradient = 0
N = float(len(points))
for i in range(0, len(points)):
x = points[i, 0]
y = points[i, 1]
# grad_b = 2(ax+b-y)
b_gradient += (2 / N) * ((a_current * x + b_current) - y)
# grad_a = 2(ax+b-y)*x
a_gradient += (2 / N) * x * ((a_current * x + b_current) - y)
# update w'
new_b = b_current - (learningRate * b_gradient)
new_w = a_current - (learningRate * a_gradient)
return [new_b, new_w]
def gradient_descent_runner(points, starting_b, starting_a, learning_rate, num_iterations):
b = starting_b
a = starting_a
# update for several times
for i in range(num_iterations):
b, a = step_gradient(b, a, np.array(points), learning_rate)
print("times", i, "a", a, "b", b)
return [b, a]
def run():
points = np.genfromtxt("data.csv", delimiter=",")
learning_rate = 0.1
initial_b = 0 # initial y-intercept guess
initial_a = 0 # initial slope guess
num_iterations = 47
print("Starting gradient descent at b = {0}, a = {1}, error = {2}"
.format(initial_b, initial_a,
compute_error_for_line_given_points(initial_b, initial_a, points))
)
print("Running...")
[b, a] = gradient_descent_runner(points, initial_b, initial_a, learning_rate, num_iterations)
print("After {0} iterations b = {1}, a = {2}, error = {3}".
format(num_iterations, b, a,
compute_error_for_line_given_points(b, a, points))
)
if __name__ == '__main__':
run()