机器学习_线性回归_回归系数
1、用线性回归找到最佳拟合直线
应该怎么从一大堆数据里求出回归方程呢?假定输入数据存放在矩阵X中,结果存放在向量y中:
而回归系数存放在向量w中:
那么对于给定的数据x1,即矩阵X的第一列数据,预测结果u1将会通过如下公式给出:
现在的问题是,手里有数据矩阵X和对应的标签向量y,怎么才能找到w呢?一个常用的方法就是找出使误差最小的w。这里的误差是指预测u值和真实y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我们采用平方误差。
平方误差和可以写做:
用矩阵表示还可以写做:
为啥能这么变化,记住一个前提:若x为向量,则默认x为列向量,x^T为行向量。将上述提到的数据矩阵X和标签向量y带进去,就知道为何这么变化了。
在继续推导之前,我们要先明确一个目的:找到w,使平方误差和最小。因为我们认为平方误差和越小,说明线性回归拟合效果越好。
现在,我们用矩阵表示的平方误差和对w进行求导:
如果对于矩阵求不熟悉的,可以移步这里:点击查看
令上述公式等于0,得到:
w上方的小标记表示,这是当前可以估计出的w的最优解。从现有数据上估计出的w可能并不是数据中的真实w值,所以这里使用了一个"帽"符号来表示它仅是w的一个最佳估计。
值得注意的是,上述公式中包含逆矩阵,也就是说,这个方程只在逆矩阵存在的时候使用,也即是这个矩阵是一个方阵,并且其行列式不为0。
述的最佳w求解是统计学中的常见问题,除了矩阵方法外还有很多其他方法可以解决。通过调用NumPy库里的矩阵方法,我们可以仅使用几行代码就完成所需功能。该方法也称作OLS, 意思是“普通小二乘法”(ordinary least squares)。
import matplotlib.pyplot as plt
import numpy as np"""
应该怎么从一大堆数据里求出回归方程呢?假定输入数据存放在矩阵X中,结果存放在向量y中:|x11 x12 x13| |y1| |w1|
X = |x21 x22 s23| Y = |y2| 而回归系数存放在向量w中: W = |w2||x31 x32 x33| |y3| |w3|
那么对于给定的数据x1,即矩阵X的第一列数据,预测结果u1:T|x11| |w1|
u1 = |x21| * |w2||x31| |w3|现在的问题是,手里有数据矩阵X和对应的标签向量y,怎么才能找到w呢?
一个常用的方法就是找出使误差最小的w。这里的误差是指预测u值和真实y值之间的差值,
使用该误差的简单累加将使得正差值和负差值相互抵消,所以我们采用平方误差。T
平方误差和: ( y - X*w )*( y - X*w )T
对上式进行求导: 2X ( y - X*w )T -1 T
令上式等于0,解出: w = ( X * X )* X * y
""""""
函数说明:加载数据
Parameters:fileName - 文件名
Returns:xArray - x数据集yArray - y数据集
Author:ZhengYuXiao
Modify:2019-02-23
"""def loadDataSet(fileName):numFeat = len(open(fileName).readline().split('\t')) - 1 # 列数-1xArray = []yArray = []fr = open(fileName)print("numFeat=", numFeat)for line in fr.readlines():lineArr = []curLine = line.strip().split('\t')# strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列.# 该方法只能删除开头或是结尾的字符,不能删除中间部分的字符for i in range(numFeat):lineArr.append(float(curLine[i])) # 前两列 字符转数值 保存xArray.append(lineArr) # 前两列yArray.append(float(curLine[-1])) # 最后一列print("xArray=\n", np.array(xArray))print("yArray=\n", np.array(yArray))return xArray, yArray"""
函数说明:绘制数据点
Parameters:xArray - x数据集yArray - y数据集
Returns:null
Author:ZhengYuXiao
Modify:2019-02-23
"""def plotDataSet(xArray, yArray):numberOfData = len(xArray) # 数据条数/坐标点个数xcord = [] # x列表ycord = [] # y列表for i in range(numberOfData):xcord.append(xArray[i][1])ycord.append(yArray[i])fig = plt.figure() # 画板ax = fig.add_subplot(111) # 画纸ax.scatter(xcord, ycord, s=20, c='blue', alpha=.5)plt.title('DataSet')plt.xlabel('X')plt.ylabel('Y')plt.show()"""
函数说明:计算回归系数w
Parameters:xArray - x数据集yArray - y数据集
Returns: T -1 Tw - 回归系数 w = ( X * X ) * X * Y
Author:ZhengYuXiao
Modify:2019-02-24
"""def standRegres(xArray, yArray):xMat = np.mat(xArray) # 生成矩阵XyMat = np.mat(yArray).T # 生成矩阵Y TxTx = xMat.T * xMat # 计算 ( X * X )# numpy.linalg模块包含线性代数的函数。# .det 计算矩阵的行列式# 矩阵A可逆的条件之一:行列式|A|≠0(也可表述为A不是奇异矩阵,即行列式为0的矩阵)if np.linalg.det(xTx) == 0.0:print("矩阵为奇异矩阵,不能求逆矩阵")returnw = xTx.I * (xMat.T * yMat) # 根据公式求出回归系数return w"""
函数说明:数据点和回归曲线
Parameters:xArray - x数据集yArray - y数据集w - 回归系数
Returns:none
Author:ZhengYuXiao
Modify:2019-02-24
"""def plotRegression(xArray, yArray, w):xMat = np.mat(xArray) # X矩阵yMat = np.mat(yArray) # Y矩阵xCopy = xMat.copy() # 深拷贝"""浅拷贝和深拷贝的区别是:浅拷贝只是将原对象在内存中引用地址拷贝过来了。让新的对象指向这个地址。而深拷贝是将这个对象的所有内容遍历拷贝过来了,相当于跟原来没关系了,所以如果你这时候修改原来对象的值跟他没关系了,不会随之更改。"""xCopy.sort(0) # 排序yHat = xCopy * w # 计算相应的y值fig = plt.figure()ax = fig.add_subplot(111)ax.plot(xCopy[:, 1], yHat, c='red') # 绘制回归曲线ax.scatter(xMat[:, 1].flatten().A[0], yMat.flatten().A[0], s=20, c='blue', alpha=.5)plt.title('DataSet')plt.xlabel('X')plt.ylabel('Y')plt.show()"""
函数说明:判断拟合曲线的拟合效果
Parameters:xArray - x数据集yArray - y数据集w - 回归系数
Returns:correlation - 相关性
Author:zyx
Modify:2019-03-24
"""def Correlation(xArray, yArray, w):xMat = np.mat(xArray)yMat = np.mat(yArray)yHat = xMat * wcorrelation = np.corrcoef(yHat.T, yMat)print("拟合度:", correlation)return correlationif __name__ == '__main__':xArray, yArray = loadDataSet("ex0.txt")plotDataSet(xArray, yArray)w = standRegres(xArray, yArray)plotRegression(xArray, yArray, w)Correlation(xArray, yArray, w)
机器学习_线性回归_回归系数相关推荐
- 机器学习之线性回归_通过线性回归开始机器学习之旅
机器学习之线性回归 线性回归 (Linear Regression) Linear regression is a part of Statistics that defines the relati ...
- 机器学习多元线性回归_过度简化的机器学习(1):多元回归
机器学习多元线性回归 The term machine learning may sound provocative. Machines do not learn like humans do. Ho ...
- python机器学习:线性回归_房价和房屋尺寸关系的线性拟合
# 线性回归(Linear Regression)是利用数理统计中回归分析, # 来确定两种或两种以上变量间相互依赖的定量关系的一种统计分 # 析方法 # 使用算法:线性回归 # 实现步骤: # 1. ...
- python 预测算法_通过机器学习的线性回归算法预测股票走势(用Python实现)
本文转自博客园,作者为hsm_computer 原文链接:https://www.cnblogs.com/JavaArchitect/p/11717998.html在笔者的新书里,将通过股票案例讲述P ...
- 使用机器学习预测天气_使用机器学习的二手车价格预测
使用机器学习预测天气 You can reach all Python scripts relative to this on my GitHub page. If you are intereste ...
- 机器学习系列(1)_逻辑回归初步
转载自: 机器学习系列(1)_逻辑回归初步 - 寒小阳 - 博客频道 - CSDN.NET http://blog.csdn.net/han_xiaoyang/article/details/4912 ...
- 机器学习算法 拟合曲线_制定学习曲线以检测机器学习算法中的错误
机器学习算法 拟合曲线 机器学习 (Machine Learning) The learning curve is very useful to determine how to improve th ...
- 唐宇迪机器学习课程数据集_最受欢迎的数据科学和机器学习课程-2020年8月
唐宇迪机器学习课程数据集 There are a lot of great online resources and websites on data science and machine lear ...
- 机器学习导论�_机器学习导论
机器学习导论� Say you are practising basketball on your own and you are trying to shoot the ball into the ...
最新文章
- 如何快速搭建智能人脸识别系统
- 大数据分布式集群搭建(8)
- 不相交集ADT(联机算法 + 脱机算法)
- java线程池任务失败_ThreadPoolExecutor线程池任务执行失败的时候会怎样
- ffmpeg结构体SpecifierOpt说明文档
- 巨杉数据库入选Gartner数据库报告,中国首家入选厂商
- MySql-Mysql技术内幕~SQL编程学习笔记(N)
- Atitit 图像处理知识点 知识体系 知识图谱v2
- 文本文件与二进制的区别
- 【数据分析入门】R语言下载与R包新旧设备转移
- (2020)最新 java 多线程面试题(其一)
- 隐藏部分内容,点击按钮显示全部内容
- 恒生电子 java笔试_恒生电子笔试题
- 21-22(2)第2次线上赛
- 哈曼收购混合现实领域领先公司Apostera
- 设置 Linux 别名命令 alias 永久生效的方法
- 动态路由协议 之 RIP协议 实图解析
- 手机显示无法接通服务器是怎么回事,手机无法接通是什么原因及如何解决【图文】...
- 用Eclipse开发Jsp
- 7月30日—31日英特尔开源物联网大会直播,欢迎收看