机器学习研究的问题分为分类问题和回归问题。分类问题很好理解,而回归问题就是找到一条曲线,可以最大程度地拟合样本特征和样本输出标记之间的关系。当给算法一个输入时,这条曲线可以计算出相应可能的输出。回归算法最简单的就是线性回归。当样本特征只有一个时,称为简单线性回归;当样本特征有多个时,称为多元线性回归。

线性回归

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机器学习(二):线性回归算法相关推荐

  1. python多元线性回归实例_Python机器学习多元线性回归模型 | kTWO-个人博客

    前言 在上一篇文章<机器学习简单线性回归模型>中我们讲解分析了Python机器学习中单输入的线性回归模型,但是在实际生活中,我们遇到的问题都是多个条件决定的问题,在机器学习中我们称之为多元 ...

  2. matlab 多元多项式回归_Python机器学习之?线性回归入门(二)

    线性回归原理介绍 文章目录 机器学习分类 线性回归原理 线性回归定义 线性回归背后矩阵运算 机器学习分类 机器学习的主要任务便是聚焦于两个问题:分类和回归 分类相信大家都不会陌生,生活中会见到很多的应 ...

  3. opencv机器学习线性回归_Python机器学习之?线性回归入门(二)

    线性回归原理介绍 文章目录 机器学习分类 线性回归原理 线性回归定义 线性回归背后矩阵运算 机器学习分类 机器学习的主要任务便是聚焦于两个问题:分类和回归 分类相信大家都不会陌生,生活中会见到很多的应 ...

  4. python重新执行条件_Python 基础(二)

    封面图片来源:沙沙野 内容概览Python 中的 type() 函数 Python 中的条件判断语句一: if Python 中的条件判断语句二:while Python 中的 type() 函数ty ...

  5. python决策树分类案例_python实现决策树分类算法

    本文实例为大家分享了python实现决策树分类算法的具体代码,供大家参考,具体内容如下 1.概述 决策树(decision tree)--是一种被广泛使用的分类算法. 相比贝叶斯算法,决策树的优势在于 ...

  6. python数圈算法_Python实现随机爬山算法

    随机爬山是一种优化算法.它利用随机性作为搜索过程的一部分.这使得该算法适用于非线性目标函数,而其他局部搜索算法不能很好地运行.它也是一种局部搜索算法,这意味着它修改了单个解决方案并搜索搜索空间的相对局 ...

  7. python实现排序算法_python实现各种排序算法

    冒泡排序 """ 分析 1. 算法是一种与语言无关的东西,更确切地说就算解决问题的思路,就是一个通用的思想的问题 2. 冒泡算法作为最简单的一种排序算法,我们的关注点不应 ...

  8. pythonopencv算法_python opencv之SURF算法示例

    本文介绍了python opencv之SURF算法示例,分享给大家,具体如下: 目标: SURF算法基础 opencv总SURF算法的使用 原理: 上节课使用了SIFT算法,当时这种算法效率不高,需要 ...

  9. 逻辑回归算法——经典的二分类算法

    一.概述 1.逻辑回归(Logistic Regression)算法是分类算法,而不是回归算法 2.决策边界:可以是非线性的(高阶) 二.sigmoid函数 1.定义: g ( z ) = 1 1 + ...

  10. 机器学习算法_机器学习之EM算法和概率图模型

    [晓白]今天我准备更新Machine Learning系列文章希望对机器学习复习和准备面试的同学有帮助!之前更新了感知机和SVM,决策树&代码实战,关注我的专栏可以的文章哦!今天继续更新EM算 ...

最新文章

  1. 一文概览图卷积网络基本结构和最新进展(附视频代码)
  2. openstack--1--基础环境搭建
  3. 微服务java模块内存管理_Java 9模块服务
  4. vue获取table一列数据_VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)...
  5. lua软件测试自动化,一种基于Lua脚本的嵌入式软件自动化测试系统及方法专利_专利查询 - 天眼查...
  6. C语言基础教程之常量
  7. Node.js开发指南中的例子(mysql版)
  8. bochs怎么运行Linux系统,Ubuntu上使用Bochs
  9. java mpeg ps转mpeg-4_MPEG4格式转换器下载_枫叶MPEG4格式转换器(MPEG转换器) 9.0.5.0 共享版_极速下载站...
  10. 其他——精灵 4 RTK常见问题
  11. 11.什么是Heuristic
  12. 26个字母大写及小写分别对应的ASCII码值
  13. C# GDAL读、写shape中文乱码
  14. 如何高效搜索公众号文章(r11笔记第35天)
  15. argument type mismatch 属性参数不匹配
  16. 最佳Android系统 | 运行在台式机、笔记本手提电脑的安卓Android系统
  17. BH1750简单介绍
  18. 555-大数据查重-位图算法
  19. 测试管理之绩效考核指标--测试计划+测试用例+测试环境部署工作指标!!!
  20. 【python之re模块学习第2天】正则表达式的应用:贪婪模式与懒惰模式

热门文章

  1. C语言编程-9_4 字符统计
  2. AngularJS Directive 命名规则
  3. 「SDOI2017」树点涂色 解题报告
  4. postgresql 模式与用户,及跨库访问
  5. spring启动quartz定时器
  6. memcache简单操作
  7. 通过I2C总线向EEPROM中写入数据,记录开机次数
  8. 二、自定义控件之RadioButtonList
  9. 《简约之美:软件设计之道》总结
  10. 移动端JS事件、移动端框架