线性回归模型_1

Build a linear model from scratch

机器学习简介

机器学习的流程可以用这张图来表达。

线性回归模型_1_第1张图片
幻灯片1.jpg

下面来解释下这张图。
目标:求得一个函数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

你可能感兴趣的:(线性回归模型_1)