回归用于预测输入变量和输出变量之间的关系,特别是当输入变量的值发生变化时,输出变量的值随之发生的变化。回归模型正是表示从输入变量到输出变量之间映射的函数,回归问题的学习等价于函数拟合:选择一条函数曲线使其很好地拟合已知数据且很好地预测未知数据。
2.线性回归的分类:如果研究的线性代数只包含一个自变量和一个因变量,且二者的关系可以通过一条直线近似的刻画时,这种回归就称为一元线性回归。
如果回归分析中涉及到两个及以上的自变量,且自变量与因变量是线性关系,就称为多元线性回归。
3.一元线性回归模型的拟合 3.1梯度下降的一般步骤假设函数:y = f ( x 1 , x 2 , x 3 . . . . x n ) 只有一个极小点。
初始给定参数为X 0 = ( x 1 0 , x 2 0 , x 3 0.... x n 0 ) 。
从这个点如何搜索才能找到 原函数的极小值点?
方法:
①首先设定一个较小的正数 α , ε;
②求当前位置出处的各个偏导数:
③修改当前函数的参数值,公式如下:
④如果参数变化量小于 ,退出;否则返回第2步。
3.2梯度下降的三种不同方法3.2.1批量梯度下降法(Batch Gradient Descent)
使用训练集中的所有数据进行梯度下降的演绎,是一种全局最优解。每迭代一次都需要训练集中的所有样本。
优点:可以得到一个全局最优解。
缺点:当训练集中的样本过大时,迭代速度变得很慢。
3.2.2随机梯度下降法(Stochastic Gradient Descent)
从样本中随机选择一组数据进行迭代,训练速度很快。但是整个过程充满了随机性,最终求得的解往往不是全局最优解,而是局部最优解。当迭代次数足够多时,会接近于全局最优解。
优点:训练速度快。
缺点:过程有随机性,准确度不高。
3.2.3小批量梯度下降法(Mini-batch Gradient Descent)
小批量梯度下降法对包含n个样本的数据集进行计算。综合了上述两种方 法,既保证了训练速度快,又保证了准确度。
3.3一元线性回归函数推导3.3.1一元函数的初步拟合
整个推导过程主要用到待定系数法和求导,具体步骤如下:
首先设定一个一元函数,将此函数看作是已知函数,进行梯度下降算法的迭代(注意:此处w和b都是未知量),若要求得最终的函数,我们必须寻找w和b的关系,将其带入进行换元,将两个变量转化为一个变量,寻求最优解。
接下来,通过均方误差损失函数寻找w和b的关系。
3.3.2一元函数拟合的条件寻找
在此,我们可以通过预测值与真实值之间的差方进行总误差的衡量,表现在图像上则为图像整体的离散程度。
如下图所示:
推导过程如下:
通过求出差方,得到均方差的一阶二阶导数。当通过梯度下降法进行拟合时,在最终得到的那一点处,必须满足:1.该点一阶导数为零
2.该点必须是最低点,这就意味着在这一点处是凹的,其偏导等于零(大于零是因为梯度下降,而在该点处是极值,偏导为零,详细可见我写的梯度下降法笔记)
由此,我们可以通过训练集求出x和y的平均数,得到a与b的关系(3.3.2),也就是w和b(3.3.1)的关系,从而能够通过换元法将整个式子化成单一变量的式子,进行梯度下降的拟合。
代码实现:
import numpy as np
from matplotlib import pylab as pl
#Defining training data
x = np.array([1,3,2,1,3])
y = np.array([14,24,18,17,27])
# The regression equation takes the function
def fit(x,y):
if len(x) != len(y):
return
numerator = 0.0
denominator = 0.0
x_mean = np.mean(x)
y_mean = np.mean(y)
for i in range(len(x)):
numerator += (x[i]-x_mean)*(y[i]-y_mean)
denominator += np.square((x[i]-x_mean))
print('numerator:',numerator,'denominator:',denominator)
b0 = numerator/denominator
b1 = y_mean - b0*x_mean
return b0,b1
# Define prediction function
def predit(x,b0,b1):
return b0*x + b1
# Find the regression equation
b0,b1 = fit(x,y)
print('Line is:y = %2.0fx + %2.0f'%(b0,b1))
# prediction
x_test = np.array([0.5,1.5,2.5,3,4])
y_test = np.zeros((1,len(x_test)))
for i in range(len(x_test)):
y_test[0][i] = predit(x_test[i],b0,b1)
# Drawing figure
xx = np.linspace(0, 5)
yy = b0*xx + b1
pl.plot(xx,yy,'k-')
pl.scatter(x,y,cmap=pl.cm.Paired)
pl.scatter(x_test,y_test[0],cmap=pl.cm.Paired)
pl.show()
结果展示:



