{{docContent.title}}

线性回归

机器学习的目标

1.从数据中学习新的概念

2.连续值预测

连续值预测问题

这个蓝色的线就是股市的实际变化曲线,我们机器学习需要做的就是预测那个黄色的线

我们看一个例子

我们已知函数的公式,最后面那个是高斯噪声,那些红点就是我们利用这个公式画出来的。

但是现实生活中,我们往往只知道这个图像,但是不知道公式。所以机器学习的目的就是用于预测

线性回归问题步骤

1.计算 loss,我们根据给定的坐标点来进行计算

比如我们有100个坐标点,可以使用下面这样方法来计算

这个w0和b0其实是我们随机出来的点,·我们第一步的代码如下

points[i,0] 实际上就相当于访问二维数组。

2.计算w和b

首先计算求导,我们这里可以对平方来进行求导

对b的求导其实也是一样的

这个计算起来更简单一些,最后具体实现的代码如下

3.这一步我们就是不断循环把我们获取到的新的w和b的值赋值给原来的w和b值,然后我们利用这个新的值再次进行计算,一般情况下需要跑几千次或者几万次

最后我们把获取到的这个值进行预测

实战环节

代码在github上有,可以自行下载。。

先展示效果,这里我们经过1000多次的计算,得到的结果和误差,这里可以看到我们的误差减小了很多

实际代码如下

import numpy as np


#  第一步,计算loss
# y = wx + b
def compute_error_for_line_given_points(b, w, points):
    totalError = 0
    for i in range(0, len(points)):
        x = points[i, 0]
        y = points[i, 1]
        # computer mean-squared-error
        totalError += (y - (w * x + b)) ** 2
    # average loss for each point
    return totalError / float(len(points))


# 第二部计算和更新w和b
def step_gradient(b_current, w_current, points, learningRate):
    b_gradient = 0
    w_gradient = 0
    N = float(len(points))
    for i in range(0, len(points)):
        x = points[i, 0]
        y = points[i, 1]
        # grad_b = 2(wx+b-y)
        b_gradient += (2 / N) * ((w_current * x + b_current) - y)
        # grad_w = 2(wx+b-y)*x
        w_gradient += (2 / N) * x * ((w_current * x + b_current) - y)
    # update w
    new_b = b_current - (learningRate * b_gradient)
    new_w = w_current - (learningRate * w_gradient)
    return [new_b, new_w]


# 这里我们就开始不断循环计算
def gradient_descent_runner(points, starting_b, starting_w, learning_rate, num_iterations):
    b = starting_b
    w = starting_w
    # update for several times
    for i in range(num_iterations):
        b, w = step_gradient(b, w, np.array(points), learning_rate)
    return [b, w]


def run():
    # 我们这里先加载文件
    points = np.genfromtxt("data.csv", delimiter=",")
    learning_rate = 0.0001
    # 初始的b和w的值
    initial_b = 0  # initial y-intercept guess
    initial_w = 0  # initial slope guess
    # 计算次数
    num_iterations = 1000
    # 这里我们计算初始误差
    print("Starting gradient descent at b = {0}, w = {1}, error = {2}"
          .format(initial_b, initial_w,
                  compute_error_for_line_given_points(initial_b, initial_w, points))
          )
    print("Running...")
    [b, w] = gradient_descent_runner(points, initial_b, initial_w, learning_rate, num_iterations)
    # 下面这里我们是计算完毕后得出计算结果
    print("After {0} iterations b = {1}, w = {2}, error = {3}".
          format(num_iterations, b, w,
                 compute_error_for_line_given_points(b, w, points))
          )


if __name__ == '__main__':
    run()