线性回归之最小二乘法

线性回归

线性回归是很常见的一种回归,线性回归可以用来预测或者分类,主要解决线性问题。

最小二乘法

线性回归过程主要解决的就是如何通过样本来获取最佳的拟合线。最常用的方法便是最小二乘法,它是一种数学优化技术,它通过最小化误差的平方和寻找数据的最佳函数匹配。

代数推导:

  1. 假设拟合直线为y=ax+b
  2. 对任意样本点(xi,yi)
  3. 误差为e=yi−(axi+b)
  4. 当S=∑ni=1ei2为最小时拟合度最高,即∑ni=1(yi−axi−b)2最小。
  5. 分别求一阶偏导

    ∂S∂b=−2(∑i=1nyi−nb−a∑i=1nxi)

∂S∂a=−2(∑i=1nxiyi−b∑i=1nxi−a∑i=1nxi2)

6.分别让上面两式等于0,并且有nx¯=∑ni=1xi,ny¯=∑ni=1yi

7.得到最终解

a=∑ni=1(xi−x¯)(yi−y¯)∑ni=1(xi−x¯)2

b=y¯−ax¯

结果也可以如下

a=n∑xiyi−∑xi∑yin∑xi2−(∑xi)2

b=∑xi2∑yi−∑xi∑xiyin∑xi2−(∑xi)2

代码实现

import numpy as np
import matplotlib.pyplot as plt

def calcAB(x,y):
    n = len(x)
    sumX,sumY,sumXY,sumXX =0,0,0,0
    for i in range(0,n):
        sumX  += x[i]
        sumY  += y[i]
        sumXX += x[i]*x[i]
        sumXY += x[i]*y[i]
    a = (n*sumXY -sumX*sumY)/(n*sumXX -sumX*sumX)
    b = (sumXX*sumY - sumX*sumXY)/(n*sumXX-sumX*sumX)
    return a,b,

xi = [1,2,3,4,5,6,7,8,9,10]
yi = [10,11.5,12,13,14.5,15.5,16.8,17.3,18,18.7]
a,b=calcAB(xi,yi)
print("y = %10.5fx + %10.5f" %(a,b))
x = np.linspace(0,10)
y = a * x + b
plt.plot(x,y)
plt.scatter(xi,yi)
plt.show()

运行结果

矩阵推导

  1. 对于y=ax+b转为向量形式

    W=[w0w1]$‘,‘$X=[1x1]

  2. 于是y=w1x1+w0=WTX
  3. 损失函数为

    L=1n∑i=1n(yn−(WTX)2)=1n(y−XW)T(y−XW)

    最后可化为

1nXTWTXW−2nXTWTy+1nyTy

  1. 令偏导为0

∂L∂W=2nXTXW−2nXTy=0

另外,(XTX)−1XTX=E,EW=W
则,

(XTX)−1XTXW=(XTX)−1XTy

W=(XTX)−1XTy

代码实现

import numpy as np
import matplotlib.pyplot as plt

x = [1,2,3,4,5,6,7,8,9,10]
y = [10,11.5,12,13,14.5,15.5,16.8,17.3,18,18.7]

A = np.vstack([x,np.ones(len(x))]).T

a,b = np.linalg.lstsq(A,y)[0]
print("y = %10.5fx + %10.5f" %(a,b))
x = np.array(x)
y = np.array(y)

plt.plot(x,y,'o',label='data',markersize=10)
plt.plot(x,a*x+b,'r',label='line')
plt.show()

运行结果

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================

时间: 2024-10-08 17:10:34

线性回归之最小二乘法的相关文章

线性回归之——最小二乘法

一.引言 这段时间学习<机器学习>,学到第5章的"Logistic回归",感觉相当吃力.追本溯源,从"Logistic回归"到"线性回归",再到"最小二乘法".最终定格到了<高等数学>(第六版·下册)第九章第10节"最小二乘法",这才了解到最小二乘法背后的数学原理出自哪里. "最小二乘法"是最优化问题中建立经验公式的一种实现方法.了解它的原理,对于了解"

TensorFlow训练单特征和多特征的线性回归

线性回归 线性回归是很常见的一种回归,线性回归可以用来预测或者分类,主要解决线性问题.相关知识可看"相关阅读". 主要思想 在TensorFlow中进行线性回归处理重点是将样本和样本特征矩阵化. 单特征线性回归 单特征回归模型为:y=wx+b 构建模型 X = tf.placeholder(tf.float32, [None, 1]) w = tf.Variable(tf.zeros([1, 1])) b = tf.Variable(tf.zeros([1])) y = tf.matm

想了解机器学习?你需要知道的十个基础算法

关于机器学习,你需要知道的十个基础算法 毫无疑问,作为人工智能的子领域-机器学习在过去的几年中越来越受欢迎.由于大数据是目前科技行业最热门的趋势,基于大量的数据机器学习在提前预测和做出建议方面有巨大的潜力.一些有关机器学习常见的例子有:Netflix基于你以前看过的电影再给你做出影片的推荐,或者亚马逊根据你以前买过的书籍再给你进行图书推荐. 如果想了解更多有关机器学习的知识,要从哪里开始呢?作者第一次入门是在哥本哈根海外交流时选了一门有关人工智能的课程.这门课程的讲师是丹麦科技大学(Techni

《实用机器学习》——1.4 本书概述

1.4 本书概述 本书主要从解决实际问题的角度来介绍常用的机器学习算法.在1.3节中我们讨论了机器学习中常见的4类典型问题,基本上覆盖了目前实际中可以使用机器学习算法来解决的主要问题类型.在本书中,我们将主要讨论对应的4类算法,包括: 回归算法: 分类算法: 推荐算法: 排序算法. 其中回归算法和分类算法是两类最常用的算法,也是其他很多算法的基础,因此我们首先予以介绍.推荐系统在目前有了越来越多的应用,而排序算法在搜索引擎等领域也获得了广泛的应用,因此我们也会对常用的推荐算法和排序算法进行介绍.

我的2017年文章汇总——机器学习篇

2018,你跟自己做了约定了吗?为了遇见更好的自己. 近期准备把过去一年写的文章按照分类重新整理推送一遍,包括:"分布式"."机器学习"."深度学习"."NLP"."Java深度"."Java并发核心"."JDK源码"."Tomcat内核". 本篇推送机器学习相关文章. 强化学习 机器学习之条件随机场(CRF) 隐马尔可夫模型的Viterbi解码算

最小二乘多元线性-在VC++中 用最小二乘法 求解多元线性回归

问题描述 在VC++中 用最小二乘法 求解多元线性回归 各位大神,小弟刚学VC++,想通过一组大量的数据来计算某个公式的系数,类似于:Q=aX+bY+cZ不知道该如何用vc来编写程序,用来计算abc三个待定系数的值,望告之,谢谢. 解决方案 http://download.csdn.net/detail/jing632/3671922http://blog.csdn.net/mysniper11/article/details/17200811

4、spss做多元线性回归

回归一直是个很重要的主题.因为在数据分析的领域里边,模型重要的也是主要的作用包括两个方面,一是发现,一是预测.而很多时候我们就要通过回归来进行预测.关于回归的知识点也许不一定比参数检验,非参数检验多,但是复杂度却绝对在其上.回归主要包括线性回归,非线性回归以及分类回归.本文主要讨论多元线性回归(包括一般多元回归,含有虚拟变量的多元回归,以及一点广义差分的知识).请大家不要觉得本人偷奸耍滑,居然只有一个主题,两个半知识点.相信我,内容会很充实的. 对于线性回归的定义主要是这样的:线性回归,是基于最

用 PHP 实现的简单线性回归:(一)

数据库在 PHP 中的重要性 PHP 领域中缺少了一个功能强大的工具:基于语言的数学库.在这个由两部分组成的系列文章中,Paul Meagher 希望通过提供一个如何开发分析模型库的示例来启发 PHP 开发人员去开发和实现基于 PHP 的数学库.在第 1 部分中,他演示了如何使用 PHP 作为实现语言来开发和实现简单线性回归(Simple Linear Regression)算法包的核心部分.在第 2 部分中,作者在该包中添加了一些功能:针对中小规模数据集的有用的数据分析工具. 简介与其它开放源

excel线性回归拟合线Trend函数是这样来使用的

  一.函数简要 函数名:Trend 函数功能:返回一条线性回归拟合线的值. 即找到适合已知数组 known_y's 和 known_x's 的直线(用最小二乘法),并返回指定数组 new_x's 在直线上对应的 y 值. 函数语法及参数说明: TREND(known_y's, [known_x's], [new_x's], [const])TREND 函数语法具有下列参数 (参数:为操作.事件.方法.属性.函数或过程提供信息的值.): Known_y's 必需.关系表达式 y = mx + b