Build a linear model from scratch
机器学习简介
机器学习的流程可以用这张图来表达。
下面来解释下这张图。
目标:求得一个函数g(x),使得这个函数的输出与f(x)的输出越一致越好。
名词解释:
target function : 真实的函数。God's Function。预测正确率为100%的函数。
training data : 由target function产生的历史数据。
hypothesis set : 一个函数的集合。例如所有的一元线性函数集合,如 $y=w_0 + w_1x_1$的函数。
learning algorithm: 学习算法,学习算法包含两个部分,loss function定义和optimization求解两个部分。这两个部分是机器学习的核心,不同算法之间的区别主要是loss function不大一样。
g(x): g(x) 是我们真实求得的函数。
unknown distribution of x : 是x,包含了过去的数据,以及未来的数据。
线性回归例子
unknown distribution of x : $x\in R$
target function : $y=3+2x $, where $y \in R$
training data : ${x_{i}, y_{i}}$, where $i=1,2,3,...N$
hypothesis set : $y=w_0 + w_1x$
learning algorithm : 线性回归
loss function : $\sum_{i}(w_0 + w_1x_i - y_i)^2$
optimization : 梯度下降
举个生活中的例子,如果大家买过二手房,就知道买二手房之前是需要对房价进行评估的。我们知道有很多因素会影响房子的定价,例如房子的面积,房子的大小。
unkown distribution of x : 房子的面积
target function : y = 0.5 + 2x : 单位万,我们假设房价的价格是一平米两万,加上基础的费用例如房产证办理的费用,这些费用只是工本费,和房价没有关系。假设是3万。
training data : 例如,其中有一套房子的面积与房价为$x_{i} = 100, y_{i}=203$。我们有100个这样的数据N=100.
数学定义
下面我们对线性回归涉及到的一些参数进行数学化定义,方便求解。
我们用$x_{i}, y_{i}$表示第i个样本。
我们的Loss function定义为:
$L=\frac{1}{2N}\sum_{i=1}^N(w_0 + w_1x_i - y_i)^2$
这个函数是一个凸函数,所以是可以求得最小值的。一般而言,凸函数可以通过gradient descent进行求解。下面我们来求参数。gradient descent的具体概念后边再具体讲。
我们首先来求$w_0$的偏导
$dw_0= \frac{\partial L}{\partial w_0} = \frac{1}{N}\sum_{i=1}^N(w_0 + w_1x_i - y_i)$
$dw_1=\frac{\partial L}{\partial w_1} = \frac{1}{N}\sum_{i=1}^N(w_0 + w_1x_i - y_i)x_i$
整个梯度下降的过程为:
- 随机初始$w_0, w_1$, 指定$\alpha$ = 1e-4, 迭代次数K=10
- for t = 1,2,3,...K:
按照上边的公式计算出$dw_0$与$dw_1$。
$w_0 = w_0 - \alpha dw_0$
$w_1 = w_1 - \alpha dw_1$
最小可行性代码
代码
import numpy as np
from matplotlib import pyplot as plt
### Generate Data
w_0_t = 0.5
w_1_t = 2
x = np.random.random(100)
y = w_0_t + w_1_t * x
### Parameter Initialize
K = 1000
alpha = 0.1
w_0 = 0
w_1 = 0
### Gradient Descent
for k in xrange(K):
dw_0 = 0
dw_1 = 0
for i in xrange(len(y)):
dw_0 += (w_0 + w_1 * x[i] - y[i])
dw_1 += (w_0 + w_1 * x[i] - y[i]) * x[i]
dw_0 /= len(y)
dw_1 /= len(y)
w_0 -= alpha * dw_0
w_1 -= alpha * dw_1
Result
print "expected {} {} got {} {}".format(w_0_t, w_1_t, w_0, w_1)
Output
expected 0.5 2 got 0.501425451782 1.99737793288