线性回归模型(Linear Regression)及Python实现
线性回归模型(Linear Regression)及Python实现
1.模型
对于一份数据,它有两个变量,分别是Petal.Width和Sepal.Length,画出它们的散点图。我们希望可以构建一个函数去预测Sepal.Length,当我们输入Petal.Width时,可以返回一个预测的Sepal.Length。从散点图可以发现,可以用一条直线去拟合,这时我们可以构建一元线性回归模型:hθ(x) = θ0 + θ1x1 (x1= Petal.Width)。当然,如果我们的特征X不止一个的话,我们可以构造多元线性回归模型,hθ(x) = ∑θixi (i = 0,...,n , x0 = 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 (j = 0,1,...,n, α为学习速率, J(θ)/∂θj 为J的偏导数) 不断同时更新θj直到收敛
正规方程法:
线性回归模型(Linear Regression)及Python实现的更多相关文章
- Python - 线性回归(Linear Regression) 的 Python 实现
背景 学习 Linear Regression in Python – Real Python,前面几篇文章分别讲了"regression怎么理解","线性回归怎么理解& ...
- 机器学习经典算法具体解释及Python实现--线性回归(Linear Regression)算法
(一)认识回归 回归是统计学中最有力的工具之中的一个. 机器学习监督学习算法分为分类算法和回归算法两种,事实上就是依据类别标签分布类型为离散型.连续性而定义的. 顾名思义.分类算法用于离散型分布预測, ...
- Python 线性回归(Linear Regression) - 到底什么是 regression?
背景 学习 Linear Regression in Python – Real Python,对 regression 一词比较疑惑. 这个 linear Regression 中的 Regress ...
- Python 线性回归(Linear Regression) 基本理解
背景 学习 Linear Regression in Python – Real Python,对线性回归理论上的理解做个回顾,文章是前天读完,今天凭着记忆和理解写一遍,再回温更正. 线性回归(Lin ...
- 从损失函数优化角度:讨论“线性回归(linear regression)”与”线性分类(linear classification)“的联系与区别
1. 主要观点 线性模型是线性回归和线性分类的基础 线性回归和线性分类模型的差异主要在于损失函数形式上,我们可以将其看做是线性模型在多维空间中“不同方向”和“不同位置”的两种表现形式 损失函数是一种优 ...
- 机器学习之多变量线性回归(Linear Regression with multiple variables)
1. Multiple features(多维特征) 在机器学习之单变量线性回归(Linear Regression with One Variable)我们提到过的线性回归中,我们只有一个单一特征量 ...
- 【深度学习】线性回归(Linear Regression)——原理、均方损失、小批量随机梯度下降
1. 线性回归 回归(regression)问题指一类为一个或多个自变量与因变量之间关系建模的方法,通常用来表示输入和输出之间的关系. 机器学习领域中多数问题都与预测相关,当我们想预测一个数值时,就会 ...
- 从零单排入门机器学习:线性回归(linear regression)实践篇
线性回归(linear regression)实践篇 之前一段时间在coursera看了Andrew ng的机器学习的课程,感觉还不错,算是入门了. 这次打算以该课程的作业为主线,对机器学习基本知识做 ...
- 多重线性回归 (multiple linear regression) | 变量选择 | 最佳模型 | 基本假设的诊断方法
P133,这是第二次作业,考察多重线性回归.这个youtube频道真是精品,用R做统计.这里是R代码的总结. 连续变量和类别型变量总要分开讨论: 多重线性回归可以写成矩阵形式的一元一次回归:相当于把多 ...
- 【342】Linear Regression by Python
Reference: 用scikit-learn和pandas学习线性回归 首先获取数据存储在 pandas.DataFrame 中,获取途径(CSV 文件.Numpy 创建) 将数据分成 X 和 y ...
随机推荐
- NOIP模拟 table - 矩阵链表
题目大意: 给一个n*m的矩阵,每次交换两个大小相同的不重叠的子矩阵,输出最后的矩阵 题目分析: 这题向我们展示了出神入化的链表是如何炼成的.思想都懂,实现是真的需要技术,%%% 用一副链表来表示该矩 ...
- Java 中StringBuffer与StringBuilder区别(转)及String类的一些基本操作代码
String 字符串常量StringBuffer 字符串变量(线程安全) 多个线程访问时,不会产生问题(Synchronized)StringBuilder 字符串变量(非线程安全) 多个线程访问时 ...
- CSS布局--左侧自适应母元素高度
平常项目中经常会遇到有左侧导航菜单的高度不固定,需要与母元素或右侧元素等高的情况,以前就自以为是的使用js来设置,不仅不方便还会出现各种bug,后来就突然想到了一个好方法.有可能这方法已经被其他人用烂 ...
- 80. Domino Internet Password
Internet口令保存在Domino文件夹的个人文档的HTTPPassword域中,和文档中的username一起用于藉各种Internet协议訪问Dominoserver时的校验,最经常使用的就是 ...
- 关于Dagger 2的文章汇总
首先是我真正看懂了的第一篇文章 代码GG之家的 Dagger2图文详解 这篇文章很直接,还配有代码demo.至少我是看懂了. Dagger2 使用详解 这篇文章同样配有demo,同时文末还有很多有用的 ...
- asp.net中c#求百分比
double m= 50;double n= 100; Response.Write((m/ (m+ n)).ToString("0%"));Response.Write((m/ ...
- Windows 10 子系统Linux重启(不重启Win10)
Using CMD (Administrator) net stop LxssManager net start LxssManager
- WPF 3D 获取鼠标在场景的3d坐标
原文:WPF 3D 获取鼠标在场景的3d坐标 上一篇中我们谈到了WPF 3d做图的一些简单原理,这里我们简单介绍一下怎样获得鼠标在场景中的3d坐标,知道了3d坐标就可以进行很多操作了: 首先介绍一下3 ...
- 【剑指offer】直扑克
个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想測測自己的手气,看看能不能抽到顺子,假设抽到的话,他决定去买体育彩票,嘿嘿! ! "红心A,黑桃3,小王,大王,方 ...
- C# WinForm 文件上传下载
/// <summary> /// WebClient上传文件至服务器 /// </summary> /// <param name="fileNamePath ...