通过复杂高维函数的近似替代进行计算量简化
general.py
#coding=utf-8
import sympy
from sympy import integrate
import numpy as np
import math
from matplotlib import pyplot as plt
#函数逼近的简单算法
#拟合优度的判定方法 对于数据集 dataset:{x:y} 看 R^2 相关系数
#旨在通过复杂高维函数的近似替代进行计算量简化
class appFunc:
def __init__(self,inputs,output,ranges):
self.output=output
self.input=inputs
self.range=ranges
def run(self):
#构造矩阵
x=sympy.Symbol('x')
X=[[0 for i in range(len(self.output))] for i in range(len(self.output))]
Y=[]
for i in range(len(self.output)):
for j in range(i+1):
value=float(integrate((self.output[i]*self.output[j]),(x,self.range[0],self.range[1])))
#value=1
X[i][j]=value
for i in range(len(self.output)):
for j in range(i+1):
X[j][i]=X[i][j]
for i in range(len(self.output)):
value=float(integrate((self.input*self.output[i]),(x,self.range[0],self.range[1])))
Y.append(value)
#求解矩阵
X= np.mat(X).T
Y = np.mat(Y).T
print 'X:\n',X
print 'Y:\n',Y
#A=np.mat('1 2;3 1')
#print A
#print np.linalg.inv(A)
res = np.linalg.solve(X, Y)
#tmpA = np.linalg.inv(X)
#res= np.dot(tmpA , Y)
print res
#得到表达式
self.func=0
for i in range(len(self.output)):
self.func+=res[i]*self.output[i]
print self.func
def __cal(self,func,testdata):
x=sympy.Symbol('x')
return float(func.subs(x,testdata))
def plot(self,nums):
#Ax,FuncY,appFuncY
X=[self.range[0]+1.0*i*(self.range[1]-self.range[0])/nums for i in range(nums)]
X[len(X)-1]=self.range[1]
FuncY=[self.__cal(self.input,x) for x in X]
appFuncY=[self.__cal(self.func,x) for x in X]
plt.plot(X,FuncY,label='true')
plt.plot(X,appFuncY,label='app')
plt.legend(loc='upper left')
#plt.ylim(0,1.1)
plt.savefig('appFunc.jpg')
plt.show()
test.py
#coding=utf-8
import sympy
import numpy as np
from general import appFunc
a = np.random.rand ( 10 , 10 )
b = np.random.rand ( 10 )
#from sympy import integrate
x=sympy.Symbol('x')
f1=x**3+sympy.sin(x)
f2=x**2
f3=x
f=f1*f2
def cal(func,testdata):
x=sympy.Symbol('x')
return func.subs(x,testdata)
iput=f1
out=[f2,f3]
ranges=[0,1]
app=appFunc(iput,out,ranges)
app.run()
app.plot(100)
结果如图,使用二次函数拟合了一个由三次函数和三角函数叠加的函数,大大减少了计算量。