python的回归学习
前言 回归和插值是金融中常用的两种数学方法,本章将介绍关于回归的一些常用方法和代码。
一、回归是什么 回归是一种高效的求解函数近似值的工具,不仅对一维函数适用,同样也适用于高维函数。
最小化回归问题表达如下:
文章图片
在回归的计算中,常用的范式为np.polyfit()、np.polyval()、np.linalg.lstsq()。
二、回归计算的具体实现 首先进行一些准备工作
import numpy as np
import matplotlib.pyplot as plt
from pylab import plt,mpl
plt.style.use('seaborn')
mpl.rcParams['font.family']='serif'
def f(x):
return np.sin(x)+0.5*x
def create_plot(x,y,styles,labels,axlabels):
plt.figure(figsize=(12,10))
for i in range(len(x)):
plt.plot(x[i],y[i],styles[i],label=labels[i])
plt.xlabel(axlabels[0])
plt.ylabel(axlabels[1])
plt.legend(loc=0)
x=np.linspace(-2*np.pi,2*np.pi,50)
create_plot([x],[f(x)],['r'],['f(x)'],['x','f(x)'])
得到一个自定义的函数,如下所示:
文章图片
1.单项式的回归
res=np.polyfit(x,f(x),deg=1,full=True)
print(res)
print('-'*108)
print(res[0])
得到参数
(array([ 4.28841952e-01, -5.29906205e-17]), array([21.03238686]), 2, array([1., 1.]), 1.1102230246251565e-14)
------------------------------------------------------------------------------------------------------------
[ 4.28841952e-01 -5.29906205e-17]
使用回归参数求值:
ry=np.polyval(res[0],x)
ry
array([-2.69449345, -2.58451412, -2.4745348 , -2.36455548, -2.25457615,
-2.14459683, -2.0346175 , -1.92463818, -1.81465885, -1.70467953,
-1.5947002 , -1.48472088, -1.37474156, -1.26476223, -1.15478291,
-1.04480358, -0.93482426, -0.82484493, -0.71486561, -0.60488628,
-0.49490696, -0.38492764, -0.27494831, -0.16496899, -0.05498966,
0.05498966,0.16496899,0.27494831,0.38492764,0.49490696,
0.60488628,0.71486561,0.82484493,0.93482426,1.04480358,
1.15478291,1.26476223,1.37474156,1.48472088,1.5947002 ,
1.70467953,1.81465885,1.92463818,2.0346175 ,2.14459683,
2.25457615,2.36455548,2.4745348 ,2.58451412,2.69449345])
create_plot([x,x],[f(x),ry],['b','r.'],['f(x)','regression'],['x','f(x)'])
文章图片
不太理想,使用五次单项式进行回归
res=np.polyfit(x,f(x),deg=5,full=True)
ry=np.polyval(res[0],x)
create_plot([x,x],[f(x),ry],['b','r.'],['f(x)','regression'],['x','f(x)'])
【回归|金融数值方法之回归计算-python实践】
文章图片
使用七次单项式进行回归:
res=np.polyfit(x,f(x),deg=7,full=True)
ry=np.polyval(res[0],x)
np.allclose(f(x),x)
False
false说明回归数值与原来的数值不是一样的。
计算mse
# mse计算
np.mean((f(x)-ry)**2)
0.00177691347595176
create_plot([x,x],[f(x),ry],['b','r.'],['f(x)','regression'],['x','f(x)'])
文章图片
2.单独基函数 单独的基函数
np.linalg.lstsq
numpy.linalg.lstsq(a, b, rcond=‘warn’)
将least-squares解返回线性矩阵方程。
lstsq的输出包括四部分:回归系数、残差平方和、自变量X的秩、X的奇异值。一般只需要回归系数就可以了。
matrix=np.zeros((3+1,len(x)))
matrix[3,:]=x**3
matrix[2,:]=x**2
matrix[1,:]=x**1
matrix[0,:]=x**0
reg=np.linalg.lstsq(matrix.T,f(x),rcond=None)
reg[0].round(4)
ry=np.dot(reg[0].round(4),matrix)
ry
array([-2.19670554, -2.20978519, -2.2100222 , -2.19796307, -2.17415429,
-2.13914236, -2.09347378, -2.03769503, -1.97235262, -1.89799303,
-1.81516277, -1.72440833, -1.6262762 , -1.52131289, -1.41006488,
-1.29307866, -1.17090075, -1.04407762, -0.91315578, -0.77868173,
-0.64120195, -0.50126293, -0.35941119, -0.21619321, -0.07215549,
0.07215549,0.21619321,0.35941119,0.50126293,0.64120195,
0.77868173,0.91315578,1.04407762,1.17090075,1.29307866,
1.41006488,1.52131289,1.6262762 ,1.72440833,1.81516277,
1.89799303,1.97235262,2.03769503,2.09347378,2.13914236,
2.17415429,2.19796307,2.2100222 ,2.20978519,2.19670554])
create_plot([x,x],[f(x),ry],['b','r.'],['f(x)','regression'],['x','f(x)'])
文章图片
不太理想,将基函数中引入sinx函数
matrix[3,:]=np.sin(x)
reg=np.linalg.lstsq(matrix.T,f(x),rcond=None)
ry=np.dot(reg[0].round(4),matrix)
np.allclose(f(x),ry)
np.mean((f(x)-ry)**2)
create_plot([x,x],[f(x),ry],['b','r.'],['f(x)','regression'],['x','f(x)'])
文章图片
3.有噪声的数据
# 有噪声的数据
xn=np.linspace(-2*np.pi,2*np.pi,50)
xn=xn+0.15*np.random.standard_normal(len(xn))
yn=f(xn)+0.15*np.random.standard_normal(len(xn))
reg=np.polyfit(xn,yn,7)
ry=np.polyval(reg,xn)
ry
array([-3.0627005 , -2.60200449, -2.38959333, -2.14942554, -2.01409671,
-1.50484513, -1.226107, -1.17844569, -1.16512748, -1.23329004,
-1.26882923, -1.38858866, -1.47419669, -1.59087693, -1.83814445,
-1.81224556, -1.8320825 , -1.84258301, -1.60920776, -1.61014972,
-1.38753972, -1.01243076, -0.97922089, -0.47757572, -0.26812475,
0.47485607,0.37666023,0.83580311,1.39354247,1.4589287 ,
1.47395115,1.73692656,1.82542423,1.86622981,1.91271619,
1.82514849,1.62685373,1.71879336,1.54893674,1.29743082,
1.21692138,1.21670403,1.21887745,1.34122101,1.48378654,
1.68455375,2.39712865,2.67237991,3.06596453,3.46057519])
create_plot([xn,xn],[yn,ry],['b','r.'],['f(xn)','regression'],['xn','f(xn)'])
文章图片
4.未排序的数据
# 未排序的数据
xu=np.random.rand(50)*4*np.pi-2*np.pi
yu=f(xu)
reg=np.polyfit(xu,yu,5)
ry=np.polyval(reg,xu)
create_plot([xu,xu],[f(xu),ry],['b.','ro'],['f(xu)','regression'],['xu','f(xu)'])
文章图片
5.多维的数据
# 多维
def fm(p):
x,y=p
return np.sin(x)+0.25*x+np.sqrt(y)+0.05*y**2
x=np.linspace(0,10,20)
y=np.linspace(0,10,20)
X,Y=np.meshgrid(x,y)
z=fm((X,Y))
x=X.flatten()
y=Y.flatten()
from mpl_toolkits.mplot3d import Axes3D
fig=plt.figure(figsize=(12,10))
ax=fig.gca(projection='3d')
surf=ax.plot_surface(X,Y,z,rstride=2,cstride=2,cmap='coolwarm',linewidth=0.5,
antialiased=True)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f(x,y)')
文章图片
matrix=np.zeros((len(x),6+1))
matrix[:,6]=np.sqrt(y)
matrix[:,5]=np.sin(x)
matrix[:,4]=y**2
matrix[:,3]=x**2
matrix[:,2]=y
matrix[:,1]=x
matrix[:,0]=1
reg=np.linalg.lstsq(matrix,fm((x,y)),rcond=None)
rz=np.dot(matrix,reg[0].round(4)).reshape(20,20)
from mpl_toolkits.mplot3d import Axes3D
fig=plt.figure(figsize=(12,10))
ax=fig.gca(projection='3d')
surf1=ax.plot_surface(X,Y,z,rstride=2,cstride=2,cmap='coolwarm',linewidth=0.5,
antialiased=True)
surf2=ax.plot_wireframe(X,Y,rz,rstride=2,cstride=2,label='regression')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f(x,y)')
ax.legend()
fig.colorbar(surf,shrink=0.5,aspect=5)
文章图片
总结 金融数值方法中的回归计算。
推荐阅读
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- Python专栏|数据分析的常规流程
- Python|Win10下 Python开发环境搭建(PyCharm + Anaconda) && 环境变量配置 && 常用工具安装配置
- Python绘制小红花
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例
- python|8. 文件系统——文件的删除、移动、复制过程以及链接文件
- 爬虫|若想拿下爬虫大单,怎能不会逆向爬虫,价值过万的逆向爬虫教程限时分享
- 分布式|《Python3网络爬虫开发实战(第二版)》内容介绍
- java|微软认真聆听了开源 .NET 开发社区的炮轰( 通过CLI 支持 Hot Reload 功能)