机器学习之线性回归问题分析及实战(附python源代码)

1、何为线性回归?

      线性回归从直观上讲就是寻找一线性函数(一次函数)来尽可能拟合一离散数据序列,使求得的线性函数能够直观正确的反映离散数据序列的变化规律。

2、如何求线性回归函数?

  •  step1:在求线性回归函数之前,需要建立一个评价函数来评价线性函数对数据序列的拟合效果,在这称为loss函数,公式如下所示:

                                                                    loss=\sum_{i}^{N}\left ( w*x_{i} +b-y_{i}\right )^{2}

        我们需要寻找使得loss最小的线性函数,其中最主要的参数就是w和b,我们通过优化w和b来使得loss最小。

  • step2:在得到loss函数之后,我们需要使得loss最小,在这里我们引入一种叫做梯度下降的算法来使得loss函数最小。梯度下降算法从直观上来讲就是优化w和b使得loss值向loss函数导数的的反方向变化,使得loss值最小。梯度下降算法用数学公式描述如下:

                                                                      w^{'}=w-lr*\frac{\partial loss }{\partial w}

                                                                      b^{'}=b-lr*\frac{\partial loss }{\partial b} 

                                                            \frac{\partial loss}{\partial w}=\sum_{i}^{N}\frac{2}{N}*\left (w*x_{i}+b-y_{i} \right )*x_{i}

                                                            \frac{\partial loss}{\partial b}=\sum_{i}^{N}\frac{2}{N}*\left (w*x_{i}+b-y_{i} \right ) 

       其中lr称为学习率。

  • step3:step2过程循环训练多次,得到最佳拟合曲线。

3、线性回归实战及源代码

     我们对上述过程编写了相关python代码,并采用了100个点数据进行训练,代码及结果附后。

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 31 10:08:56 2020

@author: lenovo
"""
import numpy as np
import matplotlib.pyplot as plt
#step1:计算loss
def loss(b,w,points):
    totalError = 0
    for i in range(0,len(points)):
        x=points[i,0]
        y=points[i,1]
        totalError = totalError+((w*x+b)-y)**2
    #平均loss
    return totalError/float(len(points))

#step2:计算梯度
def gradient_update(b_current,w_current,points,lr):
    b_grad = 0
    w_grad = 0
    N=float(len(points))
    for i in range(0,len(points)):
        x = points[i,0]
        y = points[i,1]
        b_grad = b_grad + (2/N)*((w_current*x+b_current)-y)
        w_grad = w_grad + (2/N)*x*((w_current*x+b_current)-y)
    #update b
    new_b = b_current-lr*b_grad
    #update w
    new_w = w_current-lr*w_grad
    return [new_b,new_w]

#step3:梯度下降
def gradient_descent(points,b_start,w_start,lr,num_loop):
    b = b_start
    w = w_start
    for i in range(num_loop):
        b,w=gradient_update(b,w,np.array(points),lr)
    return [b,w]
#step4:执行回归
def execute():
    points = np.genfromtxt("data.csv", delimiter=",")
    #矩阵转化
    ar=np.array(points)
    x=ar[:,0]
    y=ar[:,1]
    plt.figure(1)
    plt.plot(x, y,'r.')
    lr = 0.0001
    b_start = 0 # 初始值
    w_start = 0 # 初始值
    num_loop = 1500 #循环次数
    print("Starting gradient descent at b = {0}, w = {1}, error = {2}"
          .format(b_start, w_start,
                  loss(b_start, w_start, points))
          )
    print("Executing...")
    [b, w] = gradient_descent(points, b_start, w_start, lr, num_loop)
    print("After {0} loop b = {1}, w = {2}, error = {3}".
          format(num_loop, b, w,
                 loss(b, w, points))
          )
    y1=w*x+b;
    plt.plot(x, y1,'b')
execute();

      我们利用了 上述代码对100个离散数据序列进行了仿真,得到拟合曲线结果如下图。

机器学习之线性回归问题分析及实战(附python源代码)_第1张图片

 

你可能感兴趣的:(机器学习,python,算法,机器学习)