深度学习数学基础一--最小二乘法

之前总是先上手一些比较高级的神经网络算法,CNN,RNN等。可是总觉得有些知识原理总是羁绊着我进一步理解。这才意识到基础的重要性。所以,就一点一点的从基础数学最小二乘法开始。这里用到的就是咱们小学或初中学到的知识。我们也都知道深度学习就是矩阵的各种计算。所以这里我们将那些知识和大学的线性代数进行简单结合。

我们先了解向量之间的投影

IMG_20170814_202945.jpg

比如这张图

已知:这是2维空间,A[3, 1],  B[1, 3], 求B到A最短距离的点(也就是B到A的投影P的向量)。

我们可以先用A来表示P:P = Ax  = [3, 1].T * x  (x 是 A的线性组合的系数,是个变量,就是我们要求的实数)

若使BP距离最短,则使||P - B||^2最小就行,即 使||A

x - B||^2最小。

化解:

||Ax - B||^2 = (Ax)^2 - 2AB*x + B^2

对之求导并使之等于0,求最小值x

得:

2A^2x - 2AB = 0

A^2x = AB

因为这是矩阵运算,左成A^2的逆

则写成x = (A2)(-1) * AB

则P = A * x = A * (A2)(-1) * AB

代码实现

注意区别点乘和叉乘

importnumpyasnpfrommatplotlibimportpyplotaspltA = np.array([[3], [1]])B = np.array([[1], [3]])P = A * np.linalg.inv(A.T.dot(A)) * (A.T.dot(B))# print(P)plt.plot(A[0], A[1],'k-o')plt.plot(B[0], B[1],'r-o')plt.plot(P[0], P[1],'r-o')plt.plot([B[0], P[0]], [B[1], P[1]],'y-o')plt.plot([0, A[0]], [0, A[1]],'k-')plt.ylim(0,3)plt.xlim(0,3.5)plt.text(A[0]+0.1, A[1],'A')plt.text(B[0], B[1]-0.1,'B')plt.text(P[0]+0.1, P[1]+0.1,'P')plt.show()

F44F3FD6-961B-41ED-A73B-BCAEF816EBE2.png

给定一堆点,求一条线来拟合这些点

这里我们用到两点的距离,比如上例子B向量到P向量的距离就是|B-P|

比如有n个点(X1, Y1), ..., (Xn, Yn)

我们选取特征函数 y = ax^2 + bx + c

(

特征函数的选取可以任意函数,根据经验选取特征函数,比如也可以是y = ax^2 + bx + csinx+ de^2 + f等

)

那我们就有以下矩阵表示:

1502725546795.jpg

代码实现:

importnumpyasnpfrommatplotlibimportpyplotaspltx = np.linspace(-1,1,100)y =2.3*x*x +3.5*x +0.04y_ = y + np.random.rand(len(x)) -0.5A = []times =2foriinrange(times+1):    A.append(x**(times-i))    A = np.array(A).TB = y_.reshape(y_.shape[0],1)w = np.linalg.inv(A.T.dot(A)).dot(A.T).dot(B)pred_y = A.dot(w)print(w)plt.scatter(x, y_)plt.plot(x, y,'k-')plt.plot(x, pred_y,'r-')plt.show()

结果系数输出:

[[2.28283947] [3.46918764] [0.05473155]]

5.png

黑线为理想曲线,红色为拟合曲线。

这样看,效果还是可以的。

作者:zenRRan

链接:https://www.jianshu.com/p/92de36fc6cb6

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容