机器学习之线性回归

分类 回归区别

假设线性回归是个黑盒子,那按照程序员的思维来说,这个黑盒子就是个函数,然后呢,我们只要往这个函数传一些参数作为输入,就能得到一个结果作为输出。那回归是什么意思呢?其实说白了,就是这个黑盒子输出的结果是个连续的值。如果输出不是个连续值而是个离散值那就叫分类。那什么叫做连续值呢?非常简单,举个栗子:比如我告诉你我这里有间房子,这间房子有40平,在地铁口,然后你来猜一猜我的房子总共值多少钱?这就是连续值,因为房子可能值80万,也可能值80.2万,也可能值80.111万。再比如,我告诉你我有间房子,120平,在地铁口,总共值180万,然后你来猜猜我这间房子会有几个卧室?那这就是离散值了。因为卧室的个数只可能是1, 2, 3,4,充其量到5个封顶了,而且卧室个数也不可能是什么1.1, 2.9个。所以呢,对于ML萌新来说,你只要知道我要完成的任务是预测一个连续值的话,那这个任务就是回归。是离散值的话就是分类。(PS:目前只讨论监督学习)

分类: 在比如 前面介绍的 手写板 识别 手写 0—9 识别出来的 是一个一个的数字 就是 分类 10 个分类。

回归:求解一个线性方程 y = a x + b x 取值 无穷小 无穷大的范围。 是连续的值 所以叫回归。

如果 y = ax ^2 + b 就是曲线方程 。 所以 我们先来学习 求解 线性方程 。

线性回归

线性方程:

y = a * x + b

我们都知道 当 a , b 确定的情况下 这个方程 就确定了 。 a , b 不确定 就有很多条这样的直线。这是初中所学的知识。

已知有很多数据 x 和 和标签 y

比如 我们收集了 很多房源的信息:

横坐标代表房子的面积X, 纵坐标代表房价 Y

在这里插入图片描述

线性回归就是要找一条直线,并且让这条直线尽可能地拟合图中的数据点。
那如果让1000个老铁来找这条直线就可能找出1000种直线来,比如这样

在这里插入图片描述

在这里插入图片描述

就是因为 a b 不确定 所以 有很多 条直线 那么怎么求解 最佳直线呢?

损失函数

那既然是找直线,那肯定是要有一个评判的标准,来评判哪条直线才是最好的。OK,道理我们都懂,那咋评判呢?其实简单的 ,只要算一下实际房价和我找出的直线根据房子大小预测出来的房价之间的差距就行了。说白了就是算两点的距离。当我们把所有实际房价和预测出来的房价的差距(距离)算出来然后做个加和,我们就能量化出现在我们预测的房价和实际房价之间的误差。例如下图中我画了很多条小数线,每一条小数线就是实际房价和预测房价的差距(距离)

在这里插入图片描述

然后把每条小竖线的长度加起来就等于我们现在通过这条直线预测出的房价与实际房价之间的差距。那每条小竖线的长度的加和怎么算?其实就是欧式距离加和,公式如下。(其中y(i)表示的是实际房价,y^(i)表示的是预测房价 就是用这个方程求解出来的 房价)

在这里插入图片描述

这个值 越小 越好。

线性回归无非就是通过这个损失函数做为评判标准来找出一条直线。

多维变形

往往 影响 这个房价的 因素不止一个 有很多 比如 这样 。

在这里插入图片描述

上面的 线性方程 就可以表示成这样

y = a* x + b* z + c* w + d * u + e

a, b ,c ,d e 就是确定 直线的参数 x z w u 就是 变量 太多的变量看着麻烦 简化一下

y = a x1 + b*x2 + c x3 + d*x4 + e

这个式子 还可以用矩阵的方式表示

在这里插入图片描述

在加上 平移项: 下面 数据多出来一项 无所谓 没有 e 就是 0 后面会乘以这个系数的。
在这里插入图片描述

如果有很多这样的数据 就变成 :
在这里插入图片描述

最后抽象成一般表达式:

y = X * Q

根据损失函数 :

在这里插入图片描述

将值代入:

在这里插入图片描述

在这里插入图片描述

发现就算展开后θ还是不知道怎么算。。。但是如果我们算θ对J(θ)的导数的话就知道怎么算了,因为J(θ)我们是想找一个θ(这时的θ是个向量)来最小化J(θ),所以求导后我们有酱紫的式子
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

根据数据 我们就能求解出 Q 这些个 参数 a, b,c ,d ,e , 式中 X ,Y 都是已知的数据值 也就是图中 的 数据

到此 我们就能求解出 Q

工程下载地址

from numpy import *
import matplotlib.pyplot as plt

def loaddataSet(filename):
    numfeat = len(open(filename).readline().split('\t'))-1
    dataMat = [];labelsVec = []
    file = open(filename)
    for line in file.readlines():
        lineArr = []
        curLine = line.strip().split('\t')
        for i in range(numfeat):
            lineArr.append(float(curLine[i]))
        dataMat.append(lineArr)
        labelsVec.append(float(curLine[-1]))
    return dataMat,labelsVec

def standRegression(xArr,yArr):
    xMat = mat(xArr);yMat = mat(yArr)

    print("xMat==", xMat.shape, "yMat",yMat.shape)

    xTx = xMat.T * xMat
    if linalg.det(xTx)==0.0:
        print('this matrix is singular,cannot do inverse\n')
        return
    print("xTx==",xTx.shape )
    sigma = xTx.I * (xMat.T * yMat.T)
    return  xMat,yMat,sigma

def PlotLine(xMat,yMat,sigma):
    ax = plt.subplot(111)
    ax.scatter(xMat[:,1].flatten().A[0],yMat.T[:,0].flatten().A[0])
    xCopy = xMat.copy()
    xCopy.sort(0)
    yHat = xCopy*sigma
    ax.plot(xCopy[:,1],yHat)
    plt.show()


def  TestStand():
     
    x,y=loaddataSet("./ex0.txt")


    xMat,yMat,sigma = standRegression(x,y)

    print("sigma=111=",sigma.shape)

    PlotLine(xMat,yMat,sigma)

TestStand()

参考文献

https://blog.csdn.net/alw_123/article/details/82193535

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值