线性回归

寒假的时候听 wkw 说到最小二乘法,有空了便研究了一下...woc 司马懿式妙啊!

那这一篇就聊聊最小二乘法,线性回归,拟合,还有基于线性回归的机器学习吧。

一、最小二乘法

首先看一个最小二乘法的例子:

线性回归

某次实验得到了四个数据点 \(\displaystyle (x,y)\):\(\displaystyle (1,6)\)、\(\displaystyle (2,5)\)、\(\displaystyle (3,7)\)、\(\displaystyle (4,10)\)(上图中红色的点)。我们希望找出一条和这四个点最匹配的直线\(\displaystyle y=\beta _{1}+\beta _{2}x\),即找出在某种“最佳情况”下能够大致符合如下超定线性方程组的 \(\displaystyle \beta _{1}\) 和 \(\displaystyle \beta _{2}\):

\(\displaystyle {\begin{alignedat}{4}\beta _{1}+1\beta _{2}&&\;=\;&&6&\\\beta _{1}+2\beta _{2}&&\;=\;&&5&\\\beta _{1}+3\beta _{2}&&\;=\;&&7&\\\beta _{1}+4\beta _{2}&&\;=\;&&10&\\\end{alignedat}}\)

最小二乘法采用的手段是尽量使得等号两边的方差最小,也就是找出这个函数的最小值

\(\displaystyle {\begin{aligned}S(\beta _{1},\beta _{2})=&\left[6-(\beta _{1}+1\beta _{2})\right]^{2}+\left[5-(\beta _{1}+2\beta _{2})\right]^{2}\\&+\left[7-(\beta _{1}+3\beta _{2})\right]^{2}+\left[10-(\beta _{1}+4\beta _{2})\right]^{2}.\\\end{aligned}}\)

最小值可以通过对 \(\displaystyle S(\beta _{1},\beta _{2})\) 分别求 \(\displaystyle \beta _{1}\) 和 \(\displaystyle \beta _{2}\) 的偏导数,然后使它们等于零得到。

\(\displaystyle {\frac {\partial S}{\partial \beta _{1}}}=0=8\beta _{1}+20\beta _{2}-56\)

\(\displaystyle {\frac {\partial S}{\partial \beta _{2}}}=0=20\beta _{1}+60\beta _{2}-154\)

如此就得到了一个只有两个未知数的方程组,很容易就可以解出:

\(\displaystyle \beta _{1}=3.5\)

\(\displaystyle \beta _{2}=1.4\)

也就是说直线 \(\displaystyle y=3.5+1.4x\) 是最佳的。

二、线性回归

回归是指回归分析,回归分析可以由给出的自变量估计因变量的条件期望。

线性回归则是指使用一些自变量之类估计基础函数的过程。

线性回归的目的:提取输入变量,输出变量相关的基本线性模型。这就要用到最小二乘法了。

用一条弯曲的曲线去拟合效果可能会更好,但是线性回归不允许这样。

线性回归的优势是效率,用曲线拟合可能会更好,但是会很慢。

线性回归有以下几个模型:

  1. 中值绝对误差:这是给定自变量集中误差的所有中值,这是一个极其强大的指标,单个无差点不会偏离错误的度量,从而更不会偏离平均的错误度量。
  2. 解释方差分数:这个指标可以解释数据变化,例如集中的变化,得到一个评分,评分为 1.0 表示为绝对完美的模型。
  3. R2 分数:这个分数指一个确定的系数。完美的评分是 1.0,当然,R2 分数可以为负。

三、Python 实例

所使用的数据:http://demo.rainman.me/data.txt

Code   ViewPrint
  1. # -*- coding: utf-8 -*-
  2. import numpy as np
  3. from sklearn import linear_model
  4. import matplotlib.pyplot as plt
  5. import sklearn.metrics as sm
  6. import pickle as pickle
  7. data_file = "data.txt"
  8. x = []
  9. y = []
  10. with open(data_file, 'r') as f:
  11.     for line in f.readlines():
  12.         xt, yt = [float(i) for i in line.split(',')]
  13.         x.append(xt)
  14.         y.append(yt)
  15. num_training = int(0.8 * len(x))
  16. num_test = len(x) - num_training
  17. x_train = np.array(x[:num_training]).reshape((num_training, 1))
  18. y_train = np.array(y[:num_training])
  19. x_test = np.array(x[num_training:]).reshape((num_test, 1))
  20. y_test = np.array(y[num_training:])
  21. linear_regressor = linear_model.LinearRegression()
  22. linear_regressor.fit(x_train, y_train)
  23. y_train_predict = linear_regressor.predict(x_train)
  24. y_test_predict = linear_regressor.predict(x_test)
  25. plt.figure()
  26. plt.scatter(x_train, y_train, color='green')
  27. plt.plot(x_train, y_train_predict, color='black', linewidth=4)
  28. plt.scatter(x_test, y_test, color='red')
  29. plt.plot(x_test, y_test_predict, color='blue', linewidth=4)
  30. plt.title('Training data')
  31. plt.show()
  32. print (round(sm.mean_absolute_error(y_test, y_test_predict), 2))
  33. print (round(sm.mean_squared_error(y_test, y_test_predict), 2))
  34. print (round(sm.median_absolute_error(y_test, y_test_predict), 2))
  35. print (round(sm.explained_variance_score(y_test, y_test_predict), 2))
  36. print (round(sm.r2_score(y_test, y_test_predict), 2))
  37. output_model_file = 'saved_model.pkl'
  38. with open(output_model_file, 'wb') as f:
  39.     pickle.dump(linear_regressor, f)
  40. with open(output_model_file, 'rb') as f:
  41.     model_linregr = pickle.load(f)
  42. y_test_pred_new = model_linregr.predict(x_test)

程序输出:

  1. 0.54
  2. 0.38
  3. 0.54
  4. 0.68
  5. 0.68

五个数据分别是:平均绝对误差,均方误差,中值绝对误差,解释方差分数,R2 分数。

拟合的图像:

线性回归

如果我的文章对您有帮助,请我喝杯咖啡吧~

支付宝转账打赏⬆️

微信钱包转账打赏⬆️

    A+
发布日期:2017年02月19日  所属分类:编程代码
标签:

目前评论:17   其中:访客  16   博主  0   引用   1

  1. 衣皇后 0

    很荣幸来访您的博客,留言只是证明我来过!

  2. godaddy 1

    从百度进来的,拜读一下贵站博文先

  3. 衣皇后 1

    从百度进来的,博客不错哦!

  4. 增达网 1

    增达网,终生只需99元:

    群发软件免费下,无限广告免费发,

    全站流量免费享,十级提成免费拿。

    逆向网赚,不用推广,照样赚钱!

    注册网址:

    http://www.a111888.zengda.xin/

    QQ:2042970736

    QQ群:274583838

    丁酉年(鸡)三月初五 2017-4-1

  5. 衣皇后 1

    学习使人进步,到此拜读!

  6. QQ81451974 0

    富强、民主、文明、和谐,自由、平等、公正、法治, 爱国、敬业、诚信、友善。

  7. 增达网QQ-79041015 0

    感觉不错哦,认真拜读咯!

  8. 增达网 2

    增达网:

    群发软件免费下,无限广告免费发,

    百万流量免费享,十级提成免费拿。

    ①:手机营销软件,QQ营销软件,博客营销软件,论坛营销软件,邮件营销软件,终生免费下载

    ②:独立二级域名,可建八个栏目,可以无限制发布自己的产品、项目、广告

    ③:您发布的广告在官网首页和全体免费会员网站显示,终生免费共享全站百万流量

    ④:逆向网赚,上线替下线发展,自动下滑,五五倍增,十级提成,不用推广也赚钱。

    注册网址:

    http://www.1688.zengda.xin/

    丁酉年(鸡)二月廿七 2017-3-24

  9. 增达网QQ-33092290 1

    真是时光荏苒!

  10. 增达网 1

    群发软件免费下,无限广告免费发,

    百万流量免费享,十级提成免费拿。

    增达网免费注册网址:

    http://www.a111888.zengda.xin/

    QQ:2042970736

  11. 增达网 1

    从百度进来的,拜读一下贵站博文先
    丁酉年(鸡)二月十五 2017-3-12

  12. 增达网 0

    就是喜欢看你博客!

  13. 三五豪侠传 0

    拜读大侠博客,感悟人生道理!

  14. themebetter 3

    寒假也不忘学习,厉害。

  15. 八零后 0

    感谢分享 也欢迎到我的站点看看

  16. vultr优惠码 1

    朋友 交换链接吗

评论加载中...

来自外部的引用: 1

  • 雨人博客 | 分享生活,留住感动

发表评论

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen: