实验环境: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循环去得到最小二乘法的分子分母效率很低,可以改成使用向量法得到分子分母。
(机器学习——简单线性回归之向量法(代码实现))