和Andrew一起机器学习(2)

跟着吴恩达手写线性回归

自己动手用python写了一个线性回归。线性回归又叫最小二乘法(ordinary least squares,OLS),是回归问题当中最经典的线性方法。通过寻找参数,使得对训练集的预测值和真实值之间的均方误差最小。

线性回归是监督学习的一种,是寻找数据特征X和数据标注y之间的线性关系的方法。写线性回归首先是从一元线性回归开始写。

单变量线性回归

首先给出一组数据(x,y)寻找一种对应关系。例如下图这组数据,大致符合一种线性关系。通过线性回归就能找到相应的回归函数去最大程度的拟合这组数据。

模型

模型指的是在构建整个算法时,使用的一种表达方法。我们把他称为假设函数(hypothesis)。这是一种监督学习方法的工作方式,示意图如下:

在单变量线性回归问题中,因为只含有一个输入特征。所以将模型表达为以下公式

其中是我们需要学习的参数,x是输入数据,y是目标数据。

代价函数

我们的目的是为模型寻找最适合的参数。参数的选择决定了我们所得到的模型的准确程度,通过使用代价函数来评判我们的模型准确程度。下图中模型预测值和实际值之间的差值即为建模误差(modeling error)。

We can measure the accuracy of our hypothesis function by using a cost function. This takes an average difference (actually a fancier version of an average) of all the results of the hypothesis with inputs from x′s and the actual output y′s.

为了使得目标最小,即所得代价函数最小。

tips:为什么是除以,因为这里无论除以还是,代价函数最优化的结果都是相同的,便于计算。

梯度下降

为了使得代价函数自动降低到最小,需要通过使用一种名为梯度下降的方法。它能够自动寻找出使得代价函数最小的值。

梯度下降的原理是:开始时刻随机选择一个参数组合,计算初试代价函数,然后寻找下一个能让代价函数下降最快的参数组合。反复进行上述步骤直到得到一个局部最小值。选择不同初试参数可以得到不同局部最小值。

赋值,使得按照梯度下降最快的方向迭代下去,其中是学习率,它决定了代价函数下降的方向步伐大小。

学习率的太大梯度下降可能会无法收敛,而学习率太小会学习速度十分低。

多元线性回归

在多元线性回归中,从单个值变成了向量,而训练值从一维向量转为矩阵。由此,假设函数也变为了矩阵形式。

同时,梯度下降中的参数也转换为向量形式,公式同上。

代码实现

一元线性回归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 模型(假设函数)
def model(a, b, x):
return a * x + b

# 代价函数
def costFunction(x, y, a, b):
return 0.5/len(y) * (np.square(y-model(a,b,x))).sum()

# 优化器(梯度下降)
def optimzation(a, b, x, y):
n = len(y)
alpha = 0.01
y_hat = model(a,b,x)
ta = (1.0/n) * ((y_hat-y)*x).sum()
tb = (1.0/n) * (y_hat-y).sum()
a = a - alpha * ta
b = b - alpha * tb
return a, b

多元线性回归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 模型(假设函数)
def model_mult(theta,x):
return np.dot(x2,theta.T)

# 代价函数
def computeCost(x, y, theta):
inner = np.power((np.dot(x,theta.T)-y),2)
return np.sum(inner)/(2*len(y))

# 优化器(梯度下降)
def optimzation_mult(theta,x,y):
n = len(y)
alpha = 0.01
y_hat = model_mult(theta,x)
t_theta = (1.0/n) * (np.dot((y_hat-y2).T,x2))
theta = theta - t_theta
return theta

关于sklearn的线性回归

那sklearn.linear_model.LinearRegression中,求解线性回归方程参数时,首先判断训练集X是不是稀疏矩阵,如是,就用Golub & Kahan双对角线化过程方法来求解;否则就调用C库LAPACK中的用基于分治法的奇异值分解来求解。

以上解法和梯度下降并没有什么关系,所以说理论和实际往往还是相差很多啊。

总结

写完了用梯度下降解线性回归,作为机器学习的入门方法,在和做课后作业的时的感觉不同。这次是详细的做完了每一个步骤,也查了好多博客。后面继续努力吧。