机器学习:线性回归法(Linear Regression)
# 注:使用线性回归算法的前提是,假设数据存在线性关系,如果最后求得的准确度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 - yi)2,来表示一个样本点的距离,而不用绝对值,因为优化过程中使用绝对值计算不方便;
2)公式
- m:训练集中的m个样本
x(i) 和 y(i):训练集中的特征和其对应的标记值
x + - 和 y + -:训练集中特征和标记的均值
3)优化过程
- 优化求参数b的表达式
- 优化求参数a的表达式
- 一般用J(a, b)表示损失函数
- a、b是要求的参数,x、y是训练集中已知的数据
- 运算思路:将运算式整理成向量之间进行运算的形式(向量化)
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)算法特点
线性回归算法:典型的参数学习算法;
# kNN算法:非参数学习算法
线性回归算法:只能解决回归问题,虽然很多分类方法中,线性回归是基础(如逻辑回归);
# kNN算法:即可解决分类问题,又可以解决回归问题;
线性回归算法对数据有假设性:线性
# 数据和最终的结果具有线性关系,关系越强,预测到的结果越好
# kNN算法对数据没有假设
- 一般稍微改变线性回归算法,就可以处理非线性的问题
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) - 系数的意义(依据实例说明)
- 系数有正有负,正负表示特征与最终预测的目标(也就是房价)是正相关还是负相关;
- 系数为正,特征与目标是正相关,则特征越大房价越高;
- 系数为负,特征与目标是负相关,则特征越大房价越低;
- 系数的绝对值的大小,决定了特征对目标的影响程度;
- 根据系数和特征,分析预测结果(依据实例分析)
- RM(房间数量)特征:系数最大,说明房间越多的房屋,房价越高;
- CHAS(房屋临河)特征:系数排第二,说明临河的房屋,房价高,不临河的房屋房价低;
- NOX(房屋周围一氧化氮的浓度)特征:系数最小,说明房屋周围的一氧化碳的浓度越低,房价越高;
- DIS(房屋距离劳务雇佣中心的距离)特征:系数排倒数第二,说明房屋距离劳务雇佣中心的距离约小,房价越高;
- 知道特征与目标之间的关系后,可以采集更多的特征,来更好的描述房屋的房价
七、其它
- 很多学界领域的研究,很多时候都会首先尝试使用线性回归算法这种最基础最简单的方式
- 回归问题中,具体预测的是一个数值,这个具体的数值是在一个连续的空间里的
- 所谓的建模的过程,其实就是找到一个数学模型,最大程度的“拟合”数据,如:y = ax + b
- 所谓最大程度“拟合”数据,本质就是找到一个函数(目标函数),度量出模型没有“拟合”住的那一部分样本,或者度量出能最大“拟合”的程度
- 在线性回归算法中,建立的模型就是一个直线方程
- 目标函数:损失函数、效用函数
- 特征空间中,有些点在数学模型上(满足数学模型的关系),有些不模型上,不在数学模型上的那部分点,称为损失的数据
- 效用函数:度量的是“拟合”的程度
机器学习算法的思路
- 分析问题,确定问题的目标函数(损失函数或者效用函数)
- 最优化目标函数,获取机器学习的模型:优化损失函数,使其尽可能的小;优化效用函数,使其尽可能的大;
- 所有的参数学习算法都是这样的套路:线性回归、多项式回归、逻辑回归、SVM、神经网络等,区别在于这些算法的模型、目标函数、优化方式不同;
- 有一个学科:最优化原理,凸优化为最优化原理的分支,专门研究优化问题
- 解决了最优化的问题后,就获得了一个机器学习的模型;
机器学习:线性回归法(Linear Regression)的更多相关文章
- 第五十篇 入门机器学习——线性回归(Linear Regression)
No.1. 线性回归算法的特点 No.2. 分类问题与回归问题的区别 上图中,左侧为分类问题,右侧为回归问题.左侧图中,横轴和纵轴表示的都是样本的特征,用不同的颜色来作为输出标记,表示不同的种类:左侧 ...
- 机器学习经典算法具体解释及Python实现--线性回归(Linear Regression)算法
(一)认识回归 回归是统计学中最有力的工具之中的一个. 机器学习监督学习算法分为分类算法和回归算法两种,事实上就是依据类别标签分布类型为离散型.连续性而定义的. 顾名思义.分类算法用于离散型分布预測, ...
- 机器学习之多变量线性回归(Linear Regression with multiple variables)
1. Multiple features(多维特征) 在机器学习之单变量线性回归(Linear Regression with One Variable)我们提到过的线性回归中,我们只有一个单一特征量 ...
- 从零单排入门机器学习:线性回归(linear regression)实践篇
线性回归(linear regression)实践篇 之前一段时间在coursera看了Andrew ng的机器学习的课程,感觉还不错,算是入门了. 这次打算以该课程的作业为主线,对机器学习基本知识做 ...
- 从损失函数优化角度:讨论“线性回归(linear regression)”与”线性分类(linear classification)“的联系与区别
1. 主要观点 线性模型是线性回归和线性分类的基础 线性回归和线性分类模型的差异主要在于损失函数形式上,我们可以将其看做是线性模型在多维空间中“不同方向”和“不同位置”的两种表现形式 损失函数是一种优 ...
- Python 线性回归(Linear Regression) 基本理解
背景 学习 Linear Regression in Python – Real Python,对线性回归理论上的理解做个回顾,文章是前天读完,今天凭着记忆和理解写一遍,再回温更正. 线性回归(Lin ...
- 【深度学习】线性回归(Linear Regression)——原理、均方损失、小批量随机梯度下降
1. 线性回归 回归(regression)问题指一类为一个或多个自变量与因变量之间关系建模的方法,通常用来表示输入和输出之间的关系. 机器学习领域中多数问题都与预测相关,当我们想预测一个数值时,就会 ...
- Andrew Ng机器学习 一: Linear Regression
一:单变量线性回归(Linear regression with one variable) 背景:在某城市开办饭馆,我们有这样的数据集ex1data1.txt,第一列代表某个城市的人口,第二列代表在 ...
- Stanford机器学习---第一讲. Linear Regression with one variable
原文:http://blog.csdn.net/abcjennifer/article/details/7691571 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...
- 多重线性回归 (multiple linear regression) | 变量选择 | 最佳模型 | 基本假设的诊断方法
P133,这是第二次作业,考察多重线性回归.这个youtube频道真是精品,用R做统计.这里是R代码的总结. 连续变量和类别型变量总要分开讨论: 多重线性回归可以写成矩阵形式的一元一次回归:相当于把多 ...
随机推荐
- IntelliJ IDEA 中 右键新建时,选项没有Java class的解决方法和具体解释
我是在别人问我的时候,才发现还可以有这个问题,主要是他新项目直接打开,什么都没配置,就打算新建文件,其实可以直接看编辑器右下角的event log,那个对话框点开的话,可以add as maven p ...
- 使用命令【TLCL】
type command 显示命令的类别 which command 显示可执行程序的位置 help - 得到 shell 内建命令的帮助文档 --help - 显示用法信息 man ...
- Kafka详解四:Kafka的设计思想、理念
问题导读 1.Kafka的设计基本思想是什么?2.Kafka消息转运过程中是如何确保消息的可靠性的? 本节主要从整体角度介绍Kafka的设计思想,其中的每个理念都可以深入研究,以后我可能会发专题文章做 ...
- adb 解说
ADB是一个 客户端-服务器端 程序, 其中客户端是你用来操作的电脑, 服务器端是android设备. 先说安装方法, 电脑上需要安装客户端. 客户端包含在sdk里. 设备上不需要安装, 只需要在手机 ...
- matplotlib中在for中画出多张图
import matplotlib.pyplot as plt import numpy as np fig, axes = plt.subplots(2, 2) def showim(): for ...
- 第一个Python程序hello.py提示出现File "<stdin>",line 1错误
写第一个Python程序hello.py,内容仅有一句,print 'hello world', 运行 Python hello.py 出错,提示: File "<stdin>& ...
- Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论
题目链接:http://codeforces.com/problemset/problem/893/E 题意: 共q组数据(q <= 10^5),每组数据给定x,y(x,y <= 10^6 ...
- php如何查看扩展是否开启
php如何查看扩展是否开启 一.总结 一句话总结:php -m 1.查看php已安装扩展命令 ? php -m 2.phpinfo();这是最常用的方法,但那么多扩展一时还真不太好找.? 3.exte ...
- 智课雅思词汇---十七、前綴il-, in-, ir-, im-有什麼關係
智课雅思词汇---十七.前綴il-, in-, ir-, im-有什麼關係 一.总结 一句话总结:这几个长得非常像,并且意思也非常像 1.前綴il-, in-, ir-, im-是什麼意思? 前缀:i ...
- python 矩阵转置transpose
在读图片时,会用到这么的一段代码: image_vector_len = np.prod(image_size)#总元素大小,3*55*47 img = Image.open(path) ...