# 注:使用线性回归算法的前提是,假设数据存在线性关系,如果最后求得的准确度R < 0,则说明很可能数据间不存在任何线性关系(也可能是算法中间出现错误),此时就要检查算法或者考虑使用其它算法;

一、功能与特点

 1)解决回归问题

 2)思想简单,实现容易

   # 因为算法运用了很多的数学推到,使计算机实现变得容易

 3)许多非线性模型的基础

 4)结果具有很好的可解释性

   # 算法系统通过学习数据,训练模型,可以学到真实世界中真实的知识

 5)蕴含机器学习中的很多重要思

二、定义与思路

  • 目的:根据样本特征,预测样本的其它性质、特征或数据;
  • 思路:寻找一条直线,最大程度的“拟合”样本特征和样本输出标记之间的关系,建立数学模型,求解最优的数学模型对应的参数;
  • 怎么才算最大程度的“拟合”:让数据集中的所有样本点,距离线性模型的距离的和最小;
  • :根据房子的面积预测房子的价格,面积是房子特征,价格是房子的输出标记;

三、简单线性回归

  • 单线性回归:样本特征只有一个;
  • 数学模型:y = ax + b

四、最优化简单线性回归

 1)思路

  • 假设的线型关系:y = ax + b
  • (xi, yi):为训练集中的一个样本点
  • ý = axi + b,(xi, ý):是根据数学模型得到的点
  • |ý - yi| = |axi + b - yi|:一个预测值与其真实值之间的距离
  • 训练集中,所有样本的预测值与其真实值之间的距离和,优化出最小距离和所对应的a、b,即为得出最优的数学模型;
  • 公式:(axi + b - yi2,来表示一个样本点的距离,而不用绝对值,因为优化过程中使用绝对值计算不方便;

 

 2)公式

  • m:训练集中的m个样本
  • x(i) 和 y(i):训练集中的特征和其对应的标记值

  • x + - 和 y + -:训练集中特征和标记的均值

 3)优化过程

  • 优化求参数b的表达式
  • 优化求参数a的表达式
  1. 一般用J(a, b)表示损失函数
  2. a、b是要求的参数,x、y是训练集中已知的数据
  3. 运算思路:将运算式整理成向量之间进行运算的形式(向量化)

 4)向量化

  • 向量化:将运算式整理成向量之间进行运算的形式
  • 优点:向量之间运算效率更高;
  • 例:J(a, b) = np.sum(array1.array2) == np.dot(array1, array2) == array1.dot(array2),而不是采用for循环;
  • 注1:array1 * array2,两向量对应数据相乘,结果还是一个array
  • 注2:np.dot(array1, array2),两向量相乘所得新向量的数据和

五、简单线性回归算法的代码实现和使用

 1)内部代码实现

import numpy as np
from sklearn.metrics import r2_score 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.ndim == 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) self.a_ = (x_train - x_mean).dot(y_train - y_mean) / (x_train - x_mean).dot(x_train - x_mean)
self.b_ = y_mean - self.a_ * x_mean return self def predict(self, x_predict):
"""给定待预测数据集x_predict,返回表示x_predict的结果向量"""
assert x_predict.ndim == 1, \
"Simple 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,返回x的预测结果值"""
return self.a_ * x_single + self.b_ def score(self, x_test, y_test):
"""根据测试数据集 x_test 和 y_test 确定当前模型的准确度""" y_predict = self.predict(x_test)
return r2_score(y_test, y_predict) def __repr__(self):
return "SimpleLinearRegression()"

 

 2)在Jupyter Notebook中使用所写的算法

# 导入封装算法的类
import numpy as np
import matplotlib.pyplot as plt
from LR.S_L_R_2 import SimpleLinearRegression x = np.array([1., 2., 3., 4., 5.])
y = np.array([1., 3., 2., 3., 5.]) # 初始化
regl = Simple_linear_Regression1() # fit
regl.fit(x, y)

 3)其它

  • 参数学习算法与kNN算法内部实现的区别:参数学习算法不需要存储用户传进来的训练数据集
  • 训练数据集的意义就是训练模型的参数,一旦模型得到参数的值,训练数据集就没用了
  • 在预测时,只需要使用训练到的参数对待预测的数据进行计算即可
  • np.dot(array1, array2) == array1.dot(array2):计算两个向量(返回一个数值),或者两矩阵的乘积(返回一个矩阵/向量)

六、对线性回归算法的其它思考

 1)算法特点

  1. 线性回归算法:典型的参数学习算法;

      # kNN算法:非参数学习算法

  2. 线性回归算法:只能解决回归问题,虽然很多分类方法中,线性回归是基础(如逻辑回归);

      # kNN算法:即可解决分类问题,又可以解决回归问题;

  3. 线性回归算法对数据有假设性:线性

     # 数据和最终的结果具有线性关系,关系越强,预测到的结果越好

      # kNN算法对数据没有假设

  4. 一般稍微改变线性回归算法,就可以处理非线性的问题

 2)优缺点

  • 优点:对数据具有强解释性
  • 缺点:时间复杂度高:O(n3)(即使优化后O(2.4)

 3)线性回归算法具有可解释性

  • 实例(sklearn.datasets中波士顿的房价数据)

     import numpy as np
    from sklearn import datasets boston = datasets.load_boston()
    X = boston.data
    y = boston.target X = X[y < 50.0]
    y = y[y < 50.0] from sklearn.linear_model import LinearRegression lin_reg = LinearRegression()
    lin_reg.fit(X, y) lin_reg.coef_
    # 输出:array([-1.05574295e-01, 3.52748549e-02, -4.35179251e-02, 4.55405227e-01,
    -1.24268073e+01, 3.75411229e+00, -2.36116881e-02, -1.21088069e+00,
    2.50740082e-01, -1.37702943e-02, -8.38888137e-01, 7.93577159e-03,
    -3.50952134e-01]) # 对系数排序:默认从小到大,返回系数的index
    np.argsort(lin_reg.coef_)
    # 输出:array([ 4, 7, 10, 12, 0, 2, 6, 9, 11, 1, 8, 3, 5], dtype=int64) # 根据系数排序后的index,对特征从新排序
    boston.feature_names[np.argsort(lin_reg.coef_)] # 查看每个特征相对样本的意义
    print(boston.DESCR)
  • 系数的意义(依据实例说明)
  1. 系数有正有负,正负表示特征与最终预测的目标(也就是房价)是正相关还是负相关;
  2. 系数为正,特征与目标是正相关,则特征越大房价越高;
  3. 系数为负,特征与目标是负相关,则特征越大房价越低;
  4. 系数的绝对值的大小,决定了特征对目标的影响程度;
  • 根据系数和特征,分析预测结果(依据实例分析)
  1. RM(房间数量)特征:系数最大,说明房间越多的房屋,房价越高;
  2. CHAS(房屋临河)特征:系数排第二,说明临河的房屋,房价高,不临河的房屋房价低;
  3. NOX(房屋周围一氧化氮的浓度)特征:系数最小,说明房屋周围的一氧化碳的浓度越低,房价越高;
  4. DIS(房屋距离劳务雇佣中心的距离)特征:系数排倒数第二,说明房屋距离劳务雇佣中心的距离约小,房价越高;
  • 知道特征与目标之间的关系后,可以采集更多的特征,来更好的描述房屋的房价

七、其它

  • 很多学界领域的研究,很多时候都会首先尝试使用线性回归算法这种最基础最简单的方式
  • 回归问题中,具体预测的是一个数值,这个具体的数值是在一个连续的空间里的
  • 所谓的建模的过程,其实就是找到一个数学模型,最大程度的“拟合”数据,如:y = ax + b
  • 所谓最大程度“拟合”数据,本质就是找到一个函数(目标函数),度量出模型没有“拟合”住的那一部分样本,或者度量出能最大“拟合”的程度
  • 在线性回归算法中,建立的模型就是一个直线方程
  • 目标函数:损失函数、效用函数
  • 特征空间中,有些点在数学模型上(满足数学模型的关系),有些不模型上,不在数学模型上的那部分点,称为损失的数据
  • 效用函数:度量的是“拟合”的程度

 

 机器学习算法的思路

  1. 分析问题,确定问题的目标函数(损失函数或者效用函数)
  2. 最优化目标函数,获取机器学习的模型:优化损失函数,使其尽可能的小;优化效用函数,使其尽可能的大;
  • 所有的参数学习算法都是这样的套路:线性回归、多项式回归、逻辑回归、SVM、神经网络等,区别在于这些算法的模型、目标函数、优化方式不同;
  • 有一个学科:最优化原理,凸优化为最优化原理的分支,专门研究优化问题
  • 解决了最优化的问题后,就获得了一个机器学习的模型;

机器学习:线性回归法(Linear Regression)的更多相关文章

  1. 第五十篇 入门机器学习——线性回归(Linear Regression)

    No.1. 线性回归算法的特点 No.2. 分类问题与回归问题的区别 上图中,左侧为分类问题,右侧为回归问题.左侧图中,横轴和纵轴表示的都是样本的特征,用不同的颜色来作为输出标记,表示不同的种类:左侧 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. Andrew Ng机器学习 一: Linear Regression

    一:单变量线性回归(Linear regression with one variable) 背景:在某城市开办饭馆,我们有这样的数据集ex1data1.txt,第一列代表某个城市的人口,第二列代表在 ...

  9. Stanford机器学习---第一讲. Linear Regression with one variable

    原文:http://blog.csdn.net/abcjennifer/article/details/7691571 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...

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

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

随机推荐

  1. IntelliJ IDEA 中 右键新建时,选项没有Java class的解决方法和具体解释

    我是在别人问我的时候,才发现还可以有这个问题,主要是他新项目直接打开,什么都没配置,就打算新建文件,其实可以直接看编辑器右下角的event log,那个对话框点开的话,可以add as maven p ...

  2. 使用命令【TLCL】

    type command    显示命令的类别 which command      显示可执行程序的位置 help - 得到 shell 内建命令的帮助文档 --help - 显示用法信息 man ...

  3. Kafka详解四:Kafka的设计思想、理念

    问题导读 1.Kafka的设计基本思想是什么?2.Kafka消息转运过程中是如何确保消息的可靠性的? 本节主要从整体角度介绍Kafka的设计思想,其中的每个理念都可以深入研究,以后我可能会发专题文章做 ...

  4. adb 解说

    ADB是一个 客户端-服务器端 程序, 其中客户端是你用来操作的电脑, 服务器端是android设备. 先说安装方法, 电脑上需要安装客户端. 客户端包含在sdk里. 设备上不需要安装, 只需要在手机 ...

  5. matplotlib中在for中画出多张图

    import matplotlib.pyplot as plt import numpy as np fig, axes = plt.subplots(2, 2) def showim(): for ...

  6. 第一个Python程序hello.py提示出现File "<stdin>",line 1错误

    写第一个Python程序hello.py,内容仅有一句,print 'hello world', 运行 Python hello.py 出错,提示: File "<stdin>& ...

  7. Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论

    题目链接:http://codeforces.com/problemset/problem/893/E 题意: 共q组数据(q <= 10^5),每组数据给定x,y(x,y <= 10^6 ...

  8. php如何查看扩展是否开启

    php如何查看扩展是否开启 一.总结 一句话总结:php -m 1.查看php已安装扩展命令 ? php -m 2.phpinfo();这是最常用的方法,但那么多扩展一时还真不太好找.? 3.exte ...

  9. 智课雅思词汇---十七、前綴il-, in-, ir-, im-有什麼關係

    智课雅思词汇---十七.前綴il-, in-, ir-, im-有什麼關係 一.总结 一句话总结:这几个长得非常像,并且意思也非常像 1.前綴il-, in-, ir-, im-是什麼意思? 前缀:i ...

  10. python 矩阵转置transpose

    在读图片时,会用到这么的一段代码: image_vector_len = np.prod(image_size)#总元素大小,3*55*47 img = Image.open(path)       ...