1. 程式人生 > 實用技巧 >第十五天學習進度--【原創】數列找規律演算法(預測演算法)

第十五天學習進度--【原創】數列找規律演算法(預測演算法)

因為一直想寫一種可以只輸入一堆數,然後就能找出數列之間的通項公式,但是之前百度了很久都沒有找到類似的演算法。就拿現在大部分的情況來說,預測的演算法像網上的大部分地方都選擇了像神經網路這一類的演算法,而我認為神經網路演算法的模擬性比預測性強,神經網路在一些歸類的問題上的解決要比預測性強得多,這是平時在實驗上的感覺。

為了找到一種通用型別的演算法,前幾天特意在學習了曲線函式擬合的演算法運用,通過一個簡單的修改,來實現輸入一堆數列然後得出數列對應的函式的功能,之後就能通過這個曲線函式做對應的預測了。在我看來,曲線預測的效果比最小二乘法的預測強,最小二乘法一般來說是單純的直線預測,而函式擬合則是儘可能還原原來數列的擬合函式。

今天在之前的基礎上,新增對應的函式來實現只輸入一個數列,就能得到數列對應的規律的方法。

我們知道了,數列的規律一般都是由公式來組成的,而一般來說,數和數之間的規律都是比較簡單的,為了找到一個通項公式,需要對其中所有的函式做一個還原,而前幾天學習到的函式擬合算法就派上了用場:曲線函式擬合

不過既然是擬合的話,如果預測數列中包含冪函式的規律的話,將會隨著x的增大,誤差越來越大,不過總體上只要控制好最高冪次,使其在最後的某個區域內符合冪函式的增長趨勢,就能保證在一定範圍內的準確性

例如預測斐波那契數列

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

的下一項

在之前的曲線函式擬合的那篇文章基礎上,新增上以下的內容

#數列規律尋找(數列中包含的None表示該位置沒有數值標誌,數列規律受數列順序影響)
def auto_find_logical(y):
    x=[]
    x_None=[]
    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,alist
=auto_ax_bfit(x,y_temp) for one in x_None: x.insert(one,None) return fit_coef,alist,x

由於斐波那契數列的增長是冪次增長的,需要控制最高冪次,所以將自動型的最高冪次控制在11(可以測試得出,最高冪次波動將會影響對應預測值的範圍,但整體預測都是相對接近的),使其符合斐波那契數列在我們給定的這些數列中的最後那一部分的增長

輸入訓練資料

fit_coef,alist,x=auto_find_logical(y=[1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765])
print(func_general(fit_coef,[x[-1]+1]))

然後我們看看預測的下兩項是什麼,通過計算可以發現,斐波那契數列的下兩項真實值是10946和17711

我們看看實驗結果是什麼:

我們發現預測出來的最終結果是10946和17710,雖然有一定誤差,但是預測出來的結果,可以說很接近了