文档章节

day-12 python实现简单线性回归和多元线性回归算法

o
 osc_z1hvg4cu
发布于 2018/04/25 00:01
字数 1275
阅读 20
收藏 0

精选30+云产品,助力企业轻松上云!>>>

 

 1、问题引入

   在统计学中,线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。一个带有一个自变量的线性回归方程代表一条直线。我们需要对线性回归结果进行统计分析。

  例如,假设我们已知一些学生年纪和游戏时间的数据,可以建立一个回归方程,输入一个新的年纪时,预测该学生的游戏时间。自变量为学生年纪,因变量为游戏时间。当只有一个因变量时,我们称该类问题为简单线性回归。当游戏时间与学生年纪和学生性别有关,因变量有多个时,我们称该类问题为多元线性回归

2、常见的统计量

  在研究该问题之前,首先了解下编程中用到的常见的统计量:

序号

概念

公式 

算法

说明

1

均值

 

 

整体的均值

2

中位数

 

排序后取中间值

 

3

众数

 

出现次数最多的数

出现频率

4

方差

 

 

数据的离散程度

5

标准差

 

s

方差的开方

2、简单线性回归实例及编程实现

  研究一个自变量(X)和一个因变量(y)的关系

       简单线性回归模型定义:

 

 

         简单线性回归方程:

 

 

  其中:

  为回归线的截距

  为回归线的斜率

  通过训练数据,求取出估计参数建立的直线方程:

 

 

  实际编程时,主要是根据已知训练数据,估计出的值

  以下面实例为例,第一列表示每月投放广告的次数,第二列表示汽车向量,通过Python编程求取线性回归方程:

投放广告数

汽车销量

1

14

3

24

2

18

1

17

3

27

 

         编程关键在于如何求取b0和b1的值,我们引入一个方程(sum of square):

 

  当上述方程的值最小时,我们认为求取到线程回归方程参数的值,对该方程求最小值可以进一步转化为求导和求极值的问题,求导过程省略,最后结论如下:

 

  实际代码:

import numpy as np
from matplotlib import pylab as pl

# 定义训练数据
x = np.array([1,3,2,1,3])
y = np.array([14,24,18,17,27])

# 回归方程求取函数
def fit(x,y):
    if len(x) != len(y):
        return
    numerator = 0.0
    denominator = 0.0
    x_mean = np.mean(x)
    y_mean = np.mean(y)
    for i in range(len(x)):
        numerator += (x[i]-x_mean)*(y[i]-y_mean)
        denominator += np.square((x[i]-x_mean))
    print('numerator:',numerator,'denominator:',denominator)
    b0 = numerator/denominator
    b1 = y_mean - b0*x_mean
    return b0,b1

# 定义预测函数
def predit(x,b0,b1):
    return b0*x + b1

# 求取回归方程
b0,b1 = fit(x,y)
print('Line is:y = %2.0fx + %2.0f'%(b0,b1))

# 预测
x_test = np.array([0.5,1.5,2.5,3,4])
y_test = np.zeros((1,len(x_test)))
for i in range(len(x_test)):
    y_test[0][i] = predit(x_test[i],b0,b1)

# 绘制图像
xx = np.linspace(0, 5)
yy = b0*xx + b1
pl.plot(xx,yy,'k-')
pl.scatter(x,y,cmap=pl.cm.Paired)
pl.scatter(x_test,y_test[0],cmap=pl.cm.Paired)
pl.show()

  蓝色表示测试数据,橙色表示预测数据。

 

3、多元线性回归实例及编程实现

   多元线性回归方程和简单线性回归方程类似,不同的是由于因变量个数的增加,求取参数的个数也相应增加,推导和求取过程也不一样。

    y=β0+βx12x2+ ... +βpxp

  对于b0、b1、…、bn的推导和求取过程,引用一个第三方库进行计算。以如下数据为例,对运输里程、运输次数与运输总时间的关系,建立多元线性回归模型:

运输里程

运输次数

运输总时间

100

4

9.3

50

3

4.8

100

4

8.9

100

2

6.5

50

2

4.2

80

2

6.2

75

3

7.4

65

4

6.0

90

3

7.6

90

2

6.1

   代码如下:

import numpy as np
from sklearn import datasets,linear_model

# 定义训练数据
x = np.array([[100,4,9.3],[50,3,4.8],[100,4,8.9],
              [100,2,6.5],[50,2,4.2],[80,2,6.2],
              [75,3,7.4],[65,4,6],[90,3,7.6],[90,2,6.1]])
print(x)
X = x[:,:-1]
Y = x[:,-1]
print(X,Y)

# 训练数据
regr = linear_model.LinearRegression()
regr.fit(X,Y)
print('coefficients(b1,b2...):',regr.coef_)
print('intercept(b0):',regr.intercept_)

# 预测
x_test = np.array([[102,6],[100,4]])
y_test = regr.predict(x_test)
print(y_test)

  如果特征向量中存在分类型变量,例如车型,我们需要进行特殊处理:

运输里程

输出次数

车型

隐式转换

运输总时间

100

4

1

010

9.3

50

3

0

100

4.8

100

4

1

010

8.9

100

2

2

001

6.5

50

2

2

001

4.2

80

2

1

010

6.2

75

3

1

010

7.4

65

4

0

100

6.0

90

3

0

100

7.6

100

4

1

010

9.3

50

3

0

100

4.8

100

4

1

010

8.9

100

2

2

001

6.5

import numpy as np
from sklearn.feature_extraction import DictVectorizer
from sklearn import linear_model

# 定义数据集
x = np.array([[100,4,1,9.3],[50,3,0,4.8],[100,4,1,8.9],
              [100,2,2,6.5],[50,2,2,4.2],[80,2,1,6.2],
              [75,3,1,7.4],[65,4,0,6],[90,3,0,7.6],
              [100,4,1,9.3],[50,3,0,4.8],[100,4,1,8.9],[100,2,2,6.5]])
x_trans = []
for i in range(len(x)):
    x_trans.append({'x1':str(x[i][2])})
vec = DictVectorizer()
dummyX = vec.fit_transform(x_trans).toarray()
x = np.concatenate((x[:,:-2],dummyX[:,:],x[:,-1].reshape(len(x),1)),axis=1)
x = x.astype(float)
X = x[:,:-1]
Y = x[:,-1]
print(x,X,Y)

# 训练数据
regr = linear_model.LinearRegression()
regr.fit(X,Y)
print('coefficients(b1,b2...):',regr.coef_)
print('intercept(b0):',regr.intercept_)

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
100天搞定机器学习|Day8 逻辑回归的数学原理

机器学习100天 Day1数据预处理 100天搞定机器学习 Day2简单线性回归分析 100天搞定机器学习 Day3多元线性回归 100天搞定机器学习 Day4-6 逻辑回归 100天搞定机器学习 Day7 K-NN Day7,我们学...

机器学习与统计学
2019/07/29
0
0
基于jupyter notebook的python编程-----利用梯度下降算法求解多元线性回归方程,并与最小二乘法求解进行精度对比

基于jupyter notebook的python编程-----利用梯度下降算法求解多元线性回归方程,并与最小二乘法求解进行精度对比目录 一、梯度下降算法的基本原理 1、梯度下降算法的基本原理 二、题目、表格...

陈一月的编程岁月
04/04
0
0
一文教你全面掌握用Python实现线性回归

全文共4968字,预计学习时长15分钟或更长 本文旨在为读者理解和应用线性回归时提供参考。虽然线性回归算法很简单,但是只有少数人能真正理解其基本原则。 本文首先会深入挖掘线性回归理论,理...

读芯术
2019/07/27
71
0
Python 线性回归(Linear Regression) 基本理解

背景 学习 Linear Regression in Python – Real Python,对线性回归理论上的理解做个回顾,文章是前天读完,今天凭着记忆和理解写一遍,再回温更正。 线性回归(Linear Regression) 刚好今天...

osc_ow62fcn9
04/16
8
0

没有更多内容

加载失败,请刷新页面

加载更多

面试必问之mysql基础

mysql存储引擎 如何选择mysql存储引擎 先得了解下各个存储引擎区别 功能 MylSAM MEMORY InnoDB Archive 功能 MylSAM MEMORY InnoDB Archive 存储限制 256TB RAM 64TB None 支持事务 No No Ye...

lipengxs
38分钟前
16
0
错误:将标头发送到客户端后无法设置标头 - Error: Can't set headers after they are sent to the client

问题: I'm fairly new to Node.js and I am having some issues. 我对Node.js相当陌生,遇到了一些问题。 I am using Node.js 4.10 and Express 2.4.3. 我正在使用Node.js 4.10和Express 2......

法国红酒甜
49分钟前
18
0
Spring中事务不生效的几种情况

数据库引擎不支持事务。 没有被Spring管理。 方法不是public的。 自身调用问题。 数据源没有配置事务管理器。 不支持事务。 异常被吃了。 异常类型错误。 事务失效类型: 数据库引擎不支持事...

九分石人
今天
31
0
从Linux内核理解JAVA的NIO

前言 IO 可以简单分为磁盘 IO 和 网络 IO ,磁盘 IO 相对于网络 IO 速度会快一点,本文主要介绍 磁盘 IO ,网络 IO 下周写。 JAVA 对 NIO 抽象为 Channel , Channel 又可以分为 FileChannel ...

万古云霄
今天
22
0
Material Design用在c#的wpf app中

官网:http://materialdesigninxaml.net/ 样式丰富 做网站和手机不粗 个人觉得不适合用在.net framework中,在.net core中应该大有作为。...

齐勇cn
今天
28
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部