线性回归模型(Linear Regression)及Python实现

http://www.cnblogs.com/sumai

1.模型

对于一份数据,它有两个变量,分别是Petal.Width和Sepal.Length,画出它们的散点图。我们希望可以构建一个函数去预测Sepal.Length,当我们输入Petal.Width时,可以返回一个预测的Sepal.Length。从散点图可以发现,可以用一条直线去拟合,这时我们可以构建一元线性回归模型:hθ(x) = θ0 + θ1x1 (x1= Petal.Width)。当然,如果我们的特征X不止一个的话,我们可以构造多元线性回归模型,hθ(x) = ∑θix(i = 0,...,n , x= 1)。

2.评价

对于上述的线性回归模型hθ(x),我们需要求出θ来。可以想象,参数θ的取值有无数多种,那么我们应该怎么样选取合适的参数θ? 直观的去理解,我们希望估计出来的hθ(x)与实际的Y值尽量的靠近,因此我们可以定义一个损失函数J(θ) = (1/2m)∑(hθ(x(i)) − y(i))2,m为样本量。当然,损失函数可以有很多种定义方法,这种损失函数是最为经典的,由此得到的线性回归模型称为普通最小二乘回归模型(OLS)。

3.优化

我们已经定义好了损失函数J(θ),接下来的任务就是求出参数θ。我们的目标很明确,就是找到一组θ,使得我们的损失函数J(θ)最小。最常用的求解方法有两种:批量梯度下降法(batch gradient descent), 正规方程方法(normal equations)。 前者是一种通过迭代求得的数值解,后者是一种通过的公式一步到位求得的解析解。在特征个数不太多的情况下,后者的速度较快,一旦特征的个数成千上万的时候,前者的速度较快。另外,先对特征标准化可以加快求解速度。

 批量梯度下降法:θj := θj − α· ∂J(θ)/∂θj  (j = 0,1,...,n, α为学习速率, J(θ)/∂θj 为J的偏导数)  不断同时更新θj直到收敛

   正规方程法:θ = (XTX)−1XTY

4.python代码实现

 # -*- coding: utf-8 -*-
"""
Created on Tue Feb 23 16:06:54 2016 @author: SumaiWong
""" import numpy as np
import pandas as pd
from numpy.linalg import inv
from numpy import dot iris = pd.read_csv('iris.csv')
# 拟合线性模型: Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width # 正规方程法
temp = iris.iloc[:, 1:4]
temp['x0'] = 1
X = temp.iloc[:,[3,0,1,2]]
Y = iris.iloc[:, 0]
Y = Y.reshape(len(iris), 1)
theta_n = dot(dot(inv(dot(X.T, X)), X.T), Y) # theta = (X'X)^(-1)X'Y
print theta_n #批量梯度下降法
theta_g = np.array([1., 1., 1., 1.]) #初始化theta
theta_g = theta_g.reshape(4, 1)
alpha = 0.1
temp = theta_g
X0 = X.iloc[:, 0].reshape(150, 1)
X1 = X.iloc[:, 1].reshape(150, 1)
X2 = X.iloc[:, 2].reshape(150, 1)
X3 = X.iloc[:, 3].reshape(150, 1)
J = pd.Series(np.arange(800, dtype = float))
for i in range(800):
# theta j := theta j + alpha*(yi - h(xi))*xi
temp[0] = theta_g[0] + alpha*np.sum((Y- dot(X, theta_g))*X0)/150.
temp[1] = theta_g[1] + alpha*np.sum((Y- dot(X, theta_g))*X1)/150.
temp[2] = theta_g[2] + alpha*np.sum((Y- dot(X, theta_g))*X2)/150.
temp[3] = theta_g[3] + alpha*np.sum((Y- dot(X, theta_g))*X3)/150.
J[i] = 0.5*np.sum((Y - dot(X, theta_g))**2) #计算损失函数值
theta_g = temp #更新theta print theta_g
print J.plot(ylim = [0, 50])

代码所用的数据下载地址:http://files.cnblogs.com/files/sumai/iris.rar

5.局部加权回归(LWR)

当遇到类似下面情况的数据时,我们用简单的线性回归去拟合的话显然不合适,这时候局部加权回归就适用了。局部加权回归的思想是重点考虑你输入特征X附近的情况,同时不那么重视离你输入特征较远的情况,这就是所谓的“局部加权”。如下图所示,当我们要预测X大约为-1时,Y的值。这时候我就重点考虑X=-1附近的点,然后拟合出回归直线,作出预测。

局部加权回归的损失函数为:

与线性回归的损失函数相比,多了一个w权值。其中 x 是要预测的特征,这样假设的道理是离 x 越近的样本权重越大,越远的影响越小。τ是带宽参数,用来调节“局部”的大小。
  

求出参数θ的方法有以下两种

批量梯度下降法:θj := θj − α· ∂J(θ)/∂θ (j = 0,1,...,n, α为学习速率, J(θ)/∂θ为J的偏导数)  不断同时更新θj直到收敛

   正规方程法:

线性回归模型(Linear Regression)及Python实现的更多相关文章

  1. Python - 线性回归(Linear Regression) 的 Python 实现

    背景 学习 Linear Regression in Python – Real Python,前面几篇文章分别讲了"regression怎么理解","线性回归怎么理解& ...

  2. 机器学习经典算法具体解释及Python实现--线性回归(Linear Regression)算法

    (一)认识回归 回归是统计学中最有力的工具之中的一个. 机器学习监督学习算法分为分类算法和回归算法两种,事实上就是依据类别标签分布类型为离散型.连续性而定义的. 顾名思义.分类算法用于离散型分布预測, ...

  3. Python 线性回归(Linear Regression) - 到底什么是 regression?

    背景 学习 Linear Regression in Python – Real Python,对 regression 一词比较疑惑. 这个 linear Regression 中的 Regress ...

  4. Python 线性回归(Linear Regression) 基本理解

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

  5. 从损失函数优化角度:讨论“线性回归(linear regression)”与”线性分类(linear classification)“的联系与区别

    1. 主要观点 线性模型是线性回归和线性分类的基础 线性回归和线性分类模型的差异主要在于损失函数形式上,我们可以将其看做是线性模型在多维空间中“不同方向”和“不同位置”的两种表现形式 损失函数是一种优 ...

  6. 机器学习之多变量线性回归(Linear Regression with multiple variables)

    1. Multiple features(多维特征) 在机器学习之单变量线性回归(Linear Regression with One Variable)我们提到过的线性回归中,我们只有一个单一特征量 ...

  7. 【深度学习】线性回归(Linear Regression)——原理、均方损失、小批量随机梯度下降

    1. 线性回归 回归(regression)问题指一类为一个或多个自变量与因变量之间关系建模的方法,通常用来表示输入和输出之间的关系. 机器学习领域中多数问题都与预测相关,当我们想预测一个数值时,就会 ...

  8. 从零单排入门机器学习:线性回归(linear regression)实践篇

    线性回归(linear regression)实践篇 之前一段时间在coursera看了Andrew ng的机器学习的课程,感觉还不错,算是入门了. 这次打算以该课程的作业为主线,对机器学习基本知识做 ...

  9. 多重线性回归 (multiple linear regression) | 变量选择 | 最佳模型 | 基本假设的诊断方法

    P133,这是第二次作业,考察多重线性回归.这个youtube频道真是精品,用R做统计.这里是R代码的总结. 连续变量和类别型变量总要分开讨论: 多重线性回归可以写成矩阵形式的一元一次回归:相当于把多 ...

  10. 【342】Linear Regression by Python

    Reference: 用scikit-learn和pandas学习线性回归 首先获取数据存储在 pandas.DataFrame 中,获取途径(CSV 文件.Numpy 创建) 将数据分成 X 和 y ...

随机推荐

  1. hbase 2.0.2 put和delete的一些坑

    测试的inbox表为多版本表,封装的scanTable已设置查询全部版本,以下的测试基于hbase2.0.2 一.put(针对相同的rowkey) 测试1.使用方法链的形式对同一个put添加数据到不同 ...

  2. 【基础练习】【线性DP】codevs1576 最长严格上升子序列题解

    连题目都不放了,就是标题中说的那样.裸题 于是直接上代码 暑假要来了 好好学习 --炉火照天地,红星乱紫烟. 赧郎明月夜.歌曲动寒川.

  3. uitableview顶部多出20距离, UIScollView顶部多出64距离

    self.automaticallyAdjustsScrollViewInsets = NO;看 这个UIViewController的这个属性你就明白了,此属性默认为YES,这样UIViewCont ...

  4. oracle 全部查询和表空间,以及其关系

    select * from dba_users;   查看数据库里面全部用户,前提是你是有dba权限的帐号.如sys,system select * from all_users;     查看你能管 ...

  5. Azure 与 AI

    微软 Build 2017 开发者大会:Azure 与 AI 的快速发展   欢迎大家持续关注葡萄城控件技术团队博客,更多更好的原创文章尽在这里~~ 一年一度的微软 Build 大会准时起航,本年度大 ...

  6. noip刷题记录 20170823

    独木桥 怎么说呢 #include<iostream> #include<cstdio> #include<algorithm> using namespace s ...

  7. C#6

    C#6   1. 只读自动属性(Read-only auto-properties) C# 6之前我们构建只读自动属性: 1 public string FirstName { get; privat ...

  8. PCI GXL学习之再造篇

    作者:朱金灿 来源:http://blog.csdn.net/clever101 再造一个PCI GXL?听起来是一件颇有难度的事,实际上并非不可能.本文拟从必要性.可行性和技术路线等方面谈谈再造PC ...

  9. 从Client应用场景介绍IdentityServer4(一)

    原文:从Client应用场景介绍IdentityServer4(一) 一.背景 IdentityServer4的介绍将不再叙述,百度下可以找到,且官网的快速入门例子也有翻译的版本.这里主要从Clien ...

  10. nginx配置http跳转https

    配置相当简单,在配置文件头部加一行,如下: server { listen *:;//监听80端口 https://www.chenruhui.com$request_uri;//需要跳转的网页 } ...