• 第十六天学习进度--数列找规律算法(预测算法)之更一般形式(2)


    昨天提供的多项式函数模拟已经能够模拟绝大部分的曲线函数了,但是对于幂函数还有指数函数还是无能为力,我在网上找了很多的规律题,小学的规律题通过昨天的数列找规律算法基本都能模拟出正确答案,但是对于公务员的规律题,多项式的曲线函数模拟基本上很少能够模拟成功的。

    今天欲通过添加指数和幂函数的方式,来让规律寻找算法编程一个更加普遍的形式。

    scipy.optimize为我们提供了一个curve_fit的适应函数

    我们构造一种普遍形式

    ae^bx+cx^d+ex^fx+g的公式,来表示绝大部分的曲线,具有周期性的函数还不能表示

    然后编写出以下更一般的曲线拟合函数代码:

    import numpy as np
    from scipy.optimize import curve_fit
    import scipy.stats as stats
    
    def func_exxaxx(x,a,b,c,d,e,f,g):
        x=np.array(x)
        y = a*np.exp(b*x)+c*x**d+e*x**(f*x)+g
        return y
    
    
    def func_exxa(x,a,b,c,d,g):
        x=np.array(x)
        y = a*np.exp(b*x)+c*x**d+g
        return y
    
    
    def func_exxx(x,a,b,e,f,g):
        x=np.array(x)
        y = a*np.exp(b*x)+e*x**(f*x)+g
        return y
    
    
    def func_xaxx(x,c,d,e,f,g):
        x=np.array(x)
        y = c*x**d+e*x**(f*x)+g
        return y
    
    def func_ex(x,a,b,g):
        x=np.array(x)
        y = a*np.exp(b*x)+g
        return y
    
    def func_xa(x,c,d,g):
        x=np.array(x)
        y = c*x**d+g
        return y
    
    def func_xx(x,e,f,g):
        x=np.array(x)
        y =e*x**(f*x)+g
        return y
    
    allfunc=[func_exxaxx,func_exxa,func_exxx,func_xaxx,func_ex,func_xa,func_xx]
    
    def polyfit(x, y,limitfunc=lambda x:x**3):
        fit_coef_list, pcov_list=[],[]
        maxnh=0
        id=0
        suit=0
        suiti=0
        for i,one in enumerate(allfunc):
            try:
                fit_coef, pcov = curve_fit(one, x, y,maxfev=1500000)
                fit_coef_list.append(fit_coef)
                pcov_list.append(pcov)
                result=one([x],*fit_coef)[0]
                finalone=one([len(x)+1],*fit_coef)[0]
                downs=0.5 if abs(finalone-result[-1])>limitfunc(max(result)-min(result)) else 0
                a,b=stats.pearsonr(result, y)
                score=a*(1-b)-downs
                print(one,score)
                id+=1
                if(score>maxnh):
                    maxnh=score
                    suit=id-1
                    suiti=i
            except Exception:
                pass
        print(allfunc[suiti])
        #参数
        return fit_coef_list[suit],allfunc[suiti]
    
    def find_logical(y,limitfunc=lambda x:x**3):
        x_None=[]
        x=[]
        y_temp=[]
        for i,info in enumerate(y):
            if(info!=None):
                x.append(i+1)
                y_temp.append(info)
            else:
                x_None.append(i)
        fit_coef,func = polyfit(x, y_temp,limitfunc)
        for one in x_None:
            x.insert(one,None)
        return fit_coef,x,func

    接着用两个实例来测试曲线拟合和数列寻找的效果,

    还是前天曲线拟合的那些训练集:

    y=2x^3+x^2+1

    接下来分别取x=[1,2,3,4,5]

    对应的y就为y=[4,21,64,145,276]

    然后我们来预测x=6时y对应的值

    #函数对应
    y=[4,21,64,145,276]
    x=list(range(1,len(y)+1,1))
    fit_coef,func = polyfit(x, y)
    print(func([6],*fit_coef))

    结果如下

     可以看到得到的结果是469.24 而正确的结果469

    接着我们随便想一个有规律的数列,数列中包含有5个数

    [11,111,1111,11111,111111]

    接着将这个数列代入对应的数列规律寻找算法中,看看第6个数是什么

    #数列规律(数学归纳法找第六位是什么)
    fit_coef,x,func=find_logical([11,111,1111,11111,111111])
    print(func([6],*fit_coef))

    测试结果

     可以看到测试结果是1111111.002,而我们知道数列的下一个数是1111111,基本一致

    接着提供斐波那契数列的前N项

    [1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765]

    我们来预测下一项是什么,经过计算 下一项应该是10946

    #数列规律寻找下一项
    fit_coef,x,func=find_logical([1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765])
    print(func([len(x)+1],*fit_coef))

    测试结果:

     一致

  • 相关阅读:
    编译错误
    __attribute__
    strcmp-sse2-unaligned.S: No such file or directory.
    boost多线程编译出错
    QByteArray与QString的互相转换
    ffplay播放黑广播的声音
    ./configure详解
    linux发行版安装vmci.sys版本错误
    linux命令
    open函数的打开标志所在文件
  • 原文地址:https://www.cnblogs.com/halone/p/13374355.html
Copyright © 2020-2023  润新知