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

喜欢而已 提交于 2019-11-28 18:58:46

实验环境: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循环去得到最小二乘法的分子分母效率很低,可以改成使用向量法得到分子分母。

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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!