zoukankan      html  css  js  c++  java
  • Python机器学习/LinearRegression(线性回归模型)(附源码)

    LinearRegression(线性回归)

     

    1.线性回归简介

    线性回归定义:

      百科中解释

    我个人的理解就是:线性回归算法就是一个使用线性函数作为模型框架($y = w*x + b$)、并通过优化算法对训练数据进行训练、最终得出最优(全局最优解或局部最优)参数的过程。

    y:我们需要预测的数值;

    w:模型的参数(即我们需要通过训练调整的的值)

    x:已知的特征值

    b:模型的偏移量

    我们的目的是通过已知的x和y,通过训练找出合适的参数w和b来模拟x与y之间的关系,并最终通过x来预测y。

    分类:

      线性回归属于监督学习中的回归算法;

      线性回归作为机器学习的入门级算法,很适合刚接触机器学习的新手。虽然线性回归本身比较简单,但是麻雀虽小,五脏俱全,其中涉及到的“线性模型”、“目标函数”、“梯度下降”、“迭代”、“评价准则”等思想与其他复杂的机器学习算法是相通的,深入理解线性回归后可以帮助你更加轻松的学习其他机器学习算法。

    2.线性回归模型解析

    2.1 线性回归模型示意图

    2.2模型的组成部件

      2.2.1 假设函数(Hypothesis function)

      $h_w(x) = b + w_0x_0 + w_1x_1 + ··· +w_nx_n$

      使用向量方式表示:

    $X=egin{bmatrix}
    x_0
    \ x_1
    \vdots
    \ x_n
    end{bmatrix},W=egin{bmatrix}
    w_0
    \ w_1
    \vdots
    \ w_n
    end{bmatrix}$

      则有:$h_w(x) = W^TX+ b$

      2.2.2 损失函数:(Cost function)

      这里使用平方差作为模型的代价函数

      $J(w) = frac{1}{2m}sum_{i=1}^{m}(h_w(x^{(i)}) - y^{(i)})^2$

      2.2.3 目标函数:(Goal function)

      $minimize(J(w))$

      2.2.4 优化算法:(optimization algorithm)

      梯度下降法(Gradient descent)

      关于梯度下降法这里不详细介绍;

    3.使用python实现线性回归算法

     1 #-*- coding: utf-8 -*-
     2 import numpy as np
     3 from matplotlib import pyplot as plt
     4 
     5 
     6 #生成训练使用数据;这里线性函数为 y = 1.5*x + 1.3
     7 def data_generate():
     8     #随机生成100个数据
     9     x = np.random.randn(100)
    10     theta = 0.5   #误差系数
    11     #为数据添加干扰
    12     y = 1.5*x + 1.3 + theta*np.random.randn(100)
    13     return x,y
    14 
    15 class LinearRegression():
    16     '''
    17     线性回归类
    18     参数:
    19         alpha:迭代步长
    20         n_iter:迭代次数
    21     使用示例:
    22         lr = LinearRegression() #实例化类
    23         lr.fit(X_train,y_train) #训练模型
    24         y_predict = lr.predict(X_test) #预测训练数据
    25         lr.plotFigure()用于画出样本散点图与预测模型
    26     '''
    27     def __init__(self,alpha=0.02,n_iter=1000):
    28         self._alpha = alpha     #步长
    29         self._n_iter = n_iter    #最大迭代次数
    30 
    31     #初始化模型参数
    32     def initialPara(self):
    33         #初始化w,b均为0
    34         return 0,0
    35 
    36     #训练模型
    37     def fit(self,X_train,y_train):
    38         #保存原始数据
    39         self.X_source = X_train.copy()
    40         self.y_source = y_train.copy()
    41 
    42         #获取训练样本个数
    43         sample_num = X_train.shape[0]
    44         # 初始化w,w0
    45         self._w, self._b = self.initialPara()
    46 
    47         #创建列表存放每次每次迭代后的损失值
    48         self.cost = []
    49 
    50         #开始训练迭代
    51         for _ in range(self._n_iter):
    52             y_predict = self.predict(X_train)
    53             y_bias = y_train - y_predict
    54             self.cost.append(np.dot(y_bias,y_bias)/(2 * sample_num))
    55             self._w += self._alpha * np.dot(X_train.T,y_bias)/sample_num
    56             self._b += self._alpha * np.sum(y_bias)/sample_num
    57 
    58     def predict(self,X_test):
    59         return self._w * X_test + self._b
    60 
    61     #画出样本散点图以及使用模型预测的线条
    62     def plotFigure(self):
    63         #样本散点图
    64         plt.scatter(self.X_source,self.y_source,c='r',label="samples",linewidths=0.4)
    65 
    66         #模型预测图
    67         x1_min = self.X_source.min()
    68         x1_max = self.X_source.max()
    69         X_predict = np.arange(x1_min,x1_max,step=0.01)
    70         plt.legend(loc='upper left')
    71        
    72         plt.plot(X_predict,self._w*X_predict+self._b)
    73         plt.show()
    74 
    75 if __name__ == '__main__':
    76     #创建训练数据
    77     x_data,y_data = data_generate()
    78 
    79     #使用线性回归类生成模型
    80     lr = LinearRegression()
    81     lr.fit(x_data,y_data)
    82 
    83     #打印出参数
    84     print(lr._w,lr._b)
    85     #画出损失值随迭代次数的变化图
    86     plt.plot(lr.cost)
    87     plt.show()
    88     #画出样本散点图以及模型的预测图
    89     lr.plotFigure()
    90 
    91     #预测x
    92     x = np.array([3])
    93     print("The input x is{0},then the predict of y is:{1}".format(x,lr.predict(x)))
    线性回归代码

    更多线性回归的代码参考github线性回归

  • 相关阅读:
    20165334 我期待的师生关系
    20165228 我期望的师生关系
    20165232 预备作业3 Linux安装及学习
    20165232 学习基础和c语言基础调查
    20165232 我期望的师生关系
    20165320 第一周学习总结
    20165320 预备作业3 :Linux安装及命令入门
    20165320 预备作业2:技能学习心得与C语言学习
    20165320 我期望的师生关系
    20165203 学习基础和C语言基础调查
  • 原文地址:https://www.cnblogs.com/sienbo/p/10403330.html
Copyright © 2011-2022 走看看