机器学习——简单线性回归(原理推导+算法描述+代码实现)

Posted miaoqianling

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习——简单线性回归(原理推导+算法描述+代码实现)相关的知识,希望对你有一定的参考价值。

实验环境:Python 3.6

编辑器:Jupyter Notebook 6.0.1

实验要求:可以调用numpy、pandas基础拓展程序包,不可以调用sklearn机器学

 

 

——————————————————我是分割线喵————————————————————

 ————————————(如果想要代码可以直接下拉到最后)————————————

 

线性模型的一般形式:

  技术图片

 

向量形式:

  技术图片

 

线性模型的优点:

  1、形式简单、易于建模

  2、可解释性

  3、是非线性模型的基础,可以在线性模型的基础上引入层级结构或高维映射

 

举个西瓜书里的例子:

  系数可以反应该属性对该瓜是否是好瓜的影响因素大小

  技术图片

 

单一属性的线性回归目标:

  技术图片

 

参数/模型估计:最小二乘法

  技术图片

 

最小化均方误差:

技术图片

 

分别对ω和b求导,得:

技术图片

 

 得到闭式解:

技术图片

 

 

 ——————————————————我是分割线喵————————————————————

 

在jupyter notebook中的代码实现:

    1、先用一个例子,模拟出点:    

  技术图片

 

 

    2、通过最小二乘法得到线性回归,红色标出:

 

技术图片

 

 

 ——————————————————代码———————————————————

 

二元的简单线性回归算法代码,可以作为自定义包留着以后用,我在sublime里面写的。

  (如何在jupyter中导入自定义包?)

 

 1 import numpy as np
 2 
 3 class SimpleLinearRegression1:
 4     def __init__(self):
 5         """初始化Simple Linear Regression 模型"""
 6         self.a_ = None
 7         self.b_ = None
 8         #a和b不是用户送来的参数,是得出的结果
 9     #x_train和y_train只用来提供训练,训练得出所需参数之后,数据就没用了
10 
11     def fit(self, x_train, y_train):
12         """根据训练数据集x_train,y_train训练Simple Linear Regression 模型"""
13         assert x_train.ndim == 1, 14             "Simple Linear Regressor can only solve simple feature training data"
15         assert len(x_train) == len(y_train), 16             "the size of x_train must be equal to the size of y_train"
17         #算法实现代码
18         x_mean = np.mean(x_train)
19         y_mean = np.mean(y_train)
20 
21         num = 0.0
22         d = 0.0
23         for x, y in zip(x_train, y_train):
24             num += (x - x_mean) * (y - y_mean)
25             d += (x - x_mean) ** 2
26 
27         self.a_ = num / d
28         self.b_ = y_mean - self.a_ * x_mean
29 
30         return self
31     
32     def predict(self, x_predict):
33         """给定待预测数据集x_predict, 返回表示x_predict的结果向量"""
34         assert x_predict.ndim == 1, 35             "Simple Linear Regressor can only solve single feature training data"
36         assert self.a_ is not None and self.b_ is not None, 37             "must fit before predict"
38 
39         return np.array([self._predict(x) for x in x_predict])
40 
41     def _predict(self, x_single):
42         """给定单个待预测数据x_single, 返回x_single的预测结果值"""
43         return self.a_ * x_single + self.b_
44 
45     def __repr__(self):
46         return "SimpleLinearRegression1()"

 

 

接着在jupyter notebook测试一下刚刚写好的算法:

(myMachineLearningCode是我自定义的文件夹,上面的代码文件命名为SimpleLinearRegression.py)

 

  技术图片

 

这样简单的线性回归算法就实现了,但是用for循环去得到最小二乘法的分子分母效率很低,可以改成使用向量法得到分子分母。

(机器学习——简单线性回归之向量法(代码实现))

 

以上是关于机器学习——简单线性回归(原理推导+算法描述+代码实现)的主要内容,如果未能解决你的问题,请参考以下文章

详细推导线性回归

机器学习之Logistic 回归算法

机器学习--线性回归算法的原理及优缺点

线性回归

机器学习经典算法源码分析系列-- 线性回归

机器学习总结四:逻辑回归与反欺诈检测案例