分类 回归区别
假设线性回归是个黑盒子,那按照程序员的思维来说,这个黑盒子就是个函数,然后呢,我们只要往这个函数传一些参数作为输入,就能得到一个结果作为输出。那回归是什么意思呢?其实说白了,就是这个黑盒子输出的结果是个连续的值。如果输出不是个连续值而是个离散值那就叫分类。那什么叫做连续值呢?非常简单,举个栗子:比如我告诉你我这里有间房子,这间房子有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