python线性回归算法简介_Python机器学习(二):线性回归算法
机器学习研究的问题分为分类问题和回归问题。分类问题很好理解,而回归问题就是找到一条曲线,可以最大程度地拟合样本特征和样本输出标记之间的关系。当给算法一个输入时,这条曲线可以计算出相应可能的输出。回归算法最简单的就是线性回归。当样本特征只有一个时,称为简单线性回归;当样本特征有多个时,称为多元线性回归。
线性回归
1.简单线性回归
由上图可知,简单线性回归只有一个特征x,一个标记y。假定x和y之间具有类似于线性的关系,就可以使用使用简单线性回归算法。假定我们找到了最佳拟合的直线方程
最佳拟合的直线方程
则对于每一个样本点x(i),预测值如下。其中带箭头的y是预测值,称为 y head。右上角的 i 是指样本的索引。
预测值
我们希望预测值和真实值之间的差距尽量小。一般用欧氏距离来衡量。下式称为损失函数(Loss Function)
损失函数
换句话说,我们的目标就是找到一组a和b,使得下式最小
y(i)和x(i)是固定的
通过分析不同的问题,我们需要确定问题的损失函数。通过最优化损失函数,获得机器学习的模型。几乎所有的参数学习算法都是这样的套路
那么这个问题是一个典型的最小二乘法问题,即最小化误差的平方。推导可得以下公式
最小二乘法
可以用python封装成这种形式
"""
Created by 杨帮杰 on 10/1/18
Right to use this code in any way you want without
warranty, support or any guarantee of it working
E-mail: yangbangjie1998@qq.com
Association: SCAU 华南农业大学
"""
import numpy as np
class SimpleLinearRegression:
def __init__(self):
"""初始化Simple Linear Regression 模型"""
self.a_ = None
self.b_ = None
def fit(self, x_train, y_train):
"""根据训练数据集x_train,y_train训练Simple Linear Regression 模型"""
assert x_train.nidm == 1, \
"Simple Linear Regressor can only solve single feature training data."
assert len(x_train) == len(y_train), \
"the size of x_train must be equal to the size of y_train"
x_mean = np.mean(x_train)
y_mean = np.mean(y_train)
"""进行向量化可以加快训练速度"""
# num = 0.0
# d = 0.0
# for x, y in zip(x_train, y_train):
# num += (x - x_mean) * (y - y_mean)
# d += (x - x_mean) ** 2
num = (x_train - x_mean).dot(y_train - y_mean)
d = (x_train - x_mean).dot(x_train - x_mean)
self.a_ = num/d
self.b_ = y_mean - self.a_ * x_mean
return self
def predict(self, x_predict):
"""给定待预测数据集x_predict, 返回表示x_predict的结果向量"""
assert x_predict.ndim == 1, \
"Simeple Linear Regressor can only solve single feature training data."
assert self.a_ is not None and self.b_ is not None, \
"must fit before predict!"
return np.array([self._predict(x) for x in x_predict])
def _predict(self, x_single):
"""给定单个待预测数据x_single, 返回x_single的预测结果值"""
return self.a_ * x_single + self.b_
def __repr__(self):
return "SimpleLinearRegression()"
衡量线性回归模型好坏有多个标准,均方误差(Mean Squared Error)、均方根误差(Root Mean Squared Error)、平均绝对误差(Mean Absolute Error)等。一般使用MSE。
均方误差MSE
均方根误差RMSE
平均绝对误差MAE
而如果想像分类问题一样将评判得分限制在0和1之间,则应该使用R Square
R Square
右边一项的分子代表使用模型产生的错误,分母代表使用平均值进行预测产生的错误。分母也可以理解为一个模型,称为Baseline Model。
R Square的输出分为以下几种情况:
R^2 = 1,则模型不犯任何错误,完美
R^2 = 0,模型为基准模型,相当于没训练过
R^2 < 0,数据可能不存在任何线性关系
2.多元线性回归
多元线性回归,就是指样本特征值有多个。根据这多个特征值来预测样本的标记值。那么特征X和参数Θ就是一个向量。
多元线性回归
相类似地,我们需要找到一个损失函数。我们需要找到一组参数Θ,使下式尽可能小
损失函数
预测值有n个参数
为了方便进行矩阵运算,我们写成这种形式
X0不是特征输入!
预测值可以写成这种形式
预测值和参数是n维向量,X是n维矩阵
X展开是这个样子。每一行是一个样本点,每一列(除了第一列)是一种特征
展开
经过推导,得到这样一个公式。这成为多元线性回归的正规方程解(Normal Equation)。结果就是参数向量。
我也不知道怎么来的
Θ0就是简单线性回归中的b
如上,可以封装成这种形式
"""
Created by 杨帮杰 on 10/1/18
Right to use this code in any way you want without
warranty, support or any guarantee of it working
E-mail: yangbangjie1998@qq.com
Association: SCAU 华南农业大学
"""
import numpy as np
class LinearRegression:
def __init__(self):
"""初始化Linear Regression模型"""
self.coef_ = None
self.interception_ = None
self._theta = None
def fit_normal(self, X_train, y_train):
"""根据训练数据集X_train, y_train训练Linear Regression模型"""
assert X_train.shape[0] == y_train.shape[0], \
"the size of X_train must be equal to the size of y_train"
X_b = np.hstack([np.ones((len(X_train), 1)), X_train])
self._theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y_train)
self.interception_ = self._theta[0]
self.coef_ = self._theta[1:]
return self
def predict(self, X_predict):
"""给定待预测数据集X_predict, 返回表示X_predict的结果向量"""
assert self.interception_ is not None and self.coef_ is not None, \
"must fit before predict!"
assert X_predict.shape[1] == len(self.coef_), \
"the feature number of X_predict must be equal to X_train"
X_b = np.hstack([np.ones((len(X_predict), 1)), X_predict])
return X_b.dot(self._theta)
def __repr__(self):
return "LinearRegression()"
sciki-learn中使用线性回归如下
"""
Created by 杨帮杰 on 10/1/18
Right to use this code in any way you want without
warranty, support or any guarantee of it working
E-mail: yangbangjie1998@qq.com
Association: SCAU 华南农业大学
"""
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
# 加载波士顿房价的数据集
boston = datasets.load_boston()
# 清除一些不合理的数据
X = boston.data
y = boston.target
X = X[y < 50.0]
y = y[y < 50.0]
# 分离出测试集并拟合
X_train, X_test, y_train, y_test = train_test_split(X, y)
lin_reg = LinearRegression()
lin_reg.fit(X_train, y_train)
# 打印结果
print(lin_reg.coef_)
print(lin_reg.intercept_)
print(lin_reg.score(X_test, y_test))
输出如下
打印结果
3.总结
线性回归是许多其他回归和分类问题的基础。
它最大的优点是对数据具有很强的解释性。比如某一项的参数是正数,那么很可能这个特征和样本标记之间成正相关,反之成负相关。
优点:
思想简单,实现容易
是许多非线性模型的基础
具有很好的可解释性
缺点:
假设特征和标记之间有线性关系,现实中不一定
训练的时间复杂度比较高
References:
Python3 入门机器学习 经典算法与应用 —— liuyubobobo
机器学习实战 —— Peter Harrington
python线性回归算法简介_Python机器学习(二):线性回归算法相关推荐
- matlab 多元多项式回归_Python机器学习之?线性回归入门(二)
线性回归原理介绍 文章目录 机器学习分类 线性回归原理 线性回归定义 线性回归背后矩阵运算 机器学习分类 机器学习的主要任务便是聚焦于两个问题:分类和回归 分类相信大家都不会陌生,生活中会见到很多的应 ...
- opencv机器学习线性回归_Python机器学习之?线性回归入门(二)
线性回归原理介绍 文章目录 机器学习分类 线性回归原理 线性回归定义 线性回归背后矩阵运算 机器学习分类 机器学习的主要任务便是聚焦于两个问题:分类和回归 分类相信大家都不会陌生,生活中会见到很多的应 ...
- python 预测算法_通过机器学习的线性回归算法预测股票走势(用Python实现)
本文转自博客园,作者为hsm_computer 原文链接:https://www.cnblogs.com/JavaArchitect/p/11717998.html在笔者的新书里,将通过股票案例讲述P ...
- python多元线性回归实例_Python机器学习多元线性回归模型 | kTWO-个人博客
前言 在上一篇文章<机器学习简单线性回归模型>中我们讲解分析了Python机器学习中单输入的线性回归模型,但是在实际生活中,我们遇到的问题都是多个条件决定的问题,在机器学习中我们称之为多元 ...
- 基于python的贝叶斯分类算法预测_python机器学习:朴素贝叶斯分类算法
大数据挖掘DT机器学习 公众号: datayx 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法.这 ...
- python训练模型测试模型_python 机器学习中模型评估和调参
在做数据处理时,需要用到不同的手法,如特征标准化,主成分分析,等等会重复用到某些参数,sklearn中提供了管道,可以一次性的解决该问题 先展示先通常的做法 import pandas as pd f ...
- python数据结构与算法面试_python面试总结4(算法与内置数据结构)
算法与内置数据结构 常用算法和数据结构 sorted dict/list/set/tuple 分析时间/空间复杂度 实现常见数据结构和算法 数据结构/算法 语言内置 内置库 线性结构 list(列表) ...
- python重新执行条件_Python 基础(二)
封面图片来源:沙沙野 内容概览Python 中的 type() 函数 Python 中的条件判断语句一: if Python 中的条件判断语句二:while Python 中的 type() 函数ty ...
- 机器学习算法平台alink_机器学习-逻辑回归算法
1-逻辑回归算法原理推导 逻辑回归算法其实是一个分类算法,是非常经典,优秀的算法.一般我们不知道用哪个分类算法的时候,首先用逻辑回归算法试一试:它不仅可以实现二分类算法,还可以解决多分类问题 逻辑回归 ...
最新文章
- Golang + vscode 开发环境配置
- 精确分割和筛选音频从长的音频中
- macOS Sierra 10.12虚拟机安装
- 程序语言(编程语言)汇总大全
- 匈牙利算法c语言代码,漫谈匈牙利算法
- redis部署架构总结
- 为什么“三次握手,四次挥手”?
- python安装模块方法_Python安装模块的几种方法
- 【转】SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤
- vscode安装live server
- Oracle wm_concat() 函数
- 介绍两款代码自动生成器,帮助提升工作效率
- 智能毫米波雷达人体感应器,实时检测静止存在,智能化控制方案
- 线性表之带头双向循环链表
- 专访美团外卖曹振团:天下武功唯快不破
- 阿里巴巴年薪800k大数据全栈工程师成长记
- 阿里云ECS服务器使用入门教程(部署Web系统)
- selenium自动登录QQ空间(无头、规避)
- 与一位的士师傅交谈使用现在打车软件的感受
- scipy.stats 用法