小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

【python數(shù)據(jù)挖掘課程】十四.Scipy調(diào)用curve

 阿甘ch1wn8cyc3 2019-03-19

        前面系列文章講過(guò)各種知識(shí),包括繪制曲線(xiàn)、散點(diǎn)圖、冪分布等,而如何在在散點(diǎn)圖一堆點(diǎn)中擬合一條直線(xiàn),也變得非常重要。這篇文章主要講述調(diào)用Scipy擴(kuò)展包的curve_fit函數(shù)實(shí)現(xiàn)曲線(xiàn)擬合,同時(shí)計(jì)算出擬合的函數(shù)、參數(shù)等。希望文章對(duì)你有所幫助,如果文章中存在錯(cuò)誤或不足之處,還請(qǐng)海涵~

        前文推薦:
       【Python數(shù)據(jù)挖掘課程】一.安裝Python及爬蟲(chóng)入門(mén)介紹
       【Python數(shù)據(jù)挖掘課程】二.Kmeans聚類(lèi)數(shù)據(jù)分析及Anaconda介紹
       【Python數(shù)據(jù)挖掘課程】三.Kmeans聚類(lèi)代碼實(shí)現(xiàn)、作業(yè)及優(yōu)化
       【Python數(shù)據(jù)挖掘課程】四.決策樹(shù)DTC數(shù)據(jù)分析及鳶尾數(shù)據(jù)集分析
       【Python數(shù)據(jù)挖掘課程】五.線(xiàn)性回歸知識(shí)及預(yù)測(cè)糖尿病實(shí)例
       【Python數(shù)據(jù)挖掘課程】六.Numpy、Pandas和Matplotlib包基礎(chǔ)知識(shí)
       【Python數(shù)據(jù)挖掘課程】七.PCA降維操作及subplot子圖繪制
       【Python數(shù)據(jù)挖掘課程】八.關(guān)聯(lián)規(guī)則挖掘及Apriori實(shí)現(xiàn)購(gòu)物推薦
       【Python數(shù)據(jù)挖掘課程】九.回歸模型LinearRegression簡(jiǎn)單分析氧化物數(shù)據(jù)
       【python數(shù)據(jù)挖掘課程】十.Pandas、Matplotlib、PCA繪圖實(shí)用代碼補(bǔ)充
       【python數(shù)據(jù)挖掘課程】十一.Pandas、Matplotlib結(jié)合SQL語(yǔ)句可視化分析
       【python數(shù)據(jù)挖掘課程】十二.Pandas、Matplotlib結(jié)合SQL語(yǔ)句對(duì)比圖分析
       【python數(shù)據(jù)挖掘課程】十三.WordCloud詞云配置過(guò)程及詞頻分析


一. Scipy介紹

        SciPy (pronounced "Sigh Pie") 是一個(gè)開(kāi)源的數(shù)學(xué)、科學(xué)和工程計(jì)算包。它是一款方便、易于使用、專(zhuān)為科學(xué)和工程設(shè)計(jì)的Python工具包,包括統(tǒng)計(jì)、優(yōu)化、整合、線(xiàn)性代數(shù)模塊、傅里葉變換、信號(hào)和圖像處理、常微分方程求解器等等。
        官方地址:https://www./


        Scipy常用的模塊及功能如下圖所示:
        強(qiáng)烈推薦劉神的文章:Scipy高端科學(xué)計(jì)算 - 劉一痕


        Scipy優(yōu)化和擬合采用的是optimize模塊,該模塊提供了函數(shù)最小值(標(biāo)量或多維)、曲線(xiàn)擬合和尋找等式的根的有用算法。



        官方介紹:scipy.optimize.curve_fit
        下面將從實(shí)例進(jìn)行詳細(xì)介紹,包括:
        1.調(diào)用 numpy.polyfit() 函數(shù)實(shí)現(xiàn)一次二次多項(xiàng)式擬合;
        2.Pandas導(dǎo)入數(shù)據(jù)后,調(diào)用Scipy實(shí)現(xiàn)次方擬合;
        3.實(shí)現(xiàn)np.exp()形式e的次方擬合;
        4.實(shí)現(xiàn)三個(gè)參數(shù)的形式擬合;
        5.最后通過(guò)冪率圖形分析介紹自己的一些想法和問(wèn)題。

二. 曲線(xiàn)擬合


1.多項(xiàng)式擬合

        首先通過(guò)numpy.arange定義x、y坐標(biāo),然后調(diào)用polyfit()函數(shù)進(jìn)行3次多項(xiàng)式擬合,最后調(diào)用Matplotlib函數(shù)進(jìn)行散點(diǎn)圖繪制(x,y)坐標(biāo),并繪制預(yù)測(cè)的曲線(xiàn)。
        完整代碼:

  1. #encoding=utf-8
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. #定義x、y散點(diǎn)坐標(biāo)
  5. x = np.arange(1, 16, 1)
  6. num = [4.00, 5.20, 5.900, 6.80, 7.34,
  7. 8.57, 9.86, 10.12, 12.56, 14.32,
  8. 15.42, 16.50, 18.92, 19.58, 20.00]
  9. y = np.array(num)
  10. #用3次多項(xiàng)式擬合
  11. f1 = np.polyfit(x, y, 3)
  12. p1 = np.poly1d(f1)
  13. print(p1)
  14. #也可使用yvals=np.polyval(f1, x)
  15. yvals = p1(x) #擬合y值
  16. #繪圖
  17. plot1 = plt.plot(x, y, 's',label='original values')
  18. plot2 = plt.plot(x, yvals, 'r',label='polyfit values')
  19. plt.xlabel('x')
  20. plt.ylabel('y')
  21. plt.legend(loc=4) #指定legend的位置右下角
  22. plt.title('polyfitting')
  23. plt.show()
  24. plt.savefig('test.png')
        輸出結(jié)果如下圖所示,包括藍(lán)色的正方形散點(diǎn)和紅色的擬合曲線(xiàn)。
        多項(xiàng)式函數(shù)為: y=-0.004669 x3 + 0.1392 x2 + 0.04214 x + 4.313

        補(bǔ)充:給出函數(shù),可以用 Origin 進(jìn)行繪圖的,也比較方便。


2.e的b/x次方擬合

        下面采用Scipy的curve_fit()對(duì)上面的數(shù)據(jù)進(jìn)行e的b/x次方擬合。數(shù)據(jù)集如下:

  1. x = np.arange(1, 16, 1)
  2. num = [4.00, 5.20, 5.900, 6.80, 7.34,
  3. 8.57, 9.86, 10.12, 12.56, 14.32,
  4. 15.42, 16.50, 18.92, 19.58, 20.00]
  5. y = np.array(num)
        其中,x坐標(biāo)從1到15,y對(duì)應(yīng)Num數(shù)組,比如第一個(gè)點(diǎn)(1, 4.00)、最后一個(gè)點(diǎn)(15, 20.00)。
        然后調(diào)用curve_fit()函數(shù),核心步驟:
        (1) 定義需要擬合的函數(shù)類(lèi)型,如:
            def func(x, a, b):
                return a*np.exp(b/x)
        (2) 調(diào)用 popt, pcov = curve_fit(func, x, y) 函數(shù)進(jìn)行擬合,并將擬合系數(shù)存儲(chǔ)在popt中,a=popt[0]、b=popt[1]進(jìn)行調(diào)用;
        (3) 調(diào)用func(x, a, b)函數(shù),其中x表示橫軸表,a、b表示對(duì)應(yīng)的參數(shù)。
        完整代碼如下:

  1. #encoding=utf-8
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from scipy.optimize import curve_fit
  5. #自定義函數(shù) e指數(shù)形式
  6. def func(x, a, b):
  7. return a*np.exp(b/x)
  8. #定義x、y散點(diǎn)坐標(biāo)
  9. x = np.arange(1, 16, 1)
  10. num = [4.00, 5.20, 5.900, 6.80, 7.34,
  11. 8.57, 9.86, 10.12, 12.56, 14.32,
  12. 15.42, 16.50, 18.92, 19.58, 20.00]
  13. y = np.array(num)
  14. #非線(xiàn)性最小二乘法擬合
  15. popt, pcov = curve_fit(func, x, y)
  16. #獲取popt里面是擬合系數(shù)
  17. a = popt[0]
  18. b = popt[1]
  19. yvals = func(x,a,b) #擬合y值
  20. print u'系數(shù)a:', a
  21. print u'系數(shù)b:', b
  22. #繪圖
  23. plot1 = plt.plot(x, y, 's',label='original values')
  24. plot2 = plt.plot(x, yvals, 'r',label='polyfit values')
  25. plt.xlabel('x')
  26. plt.ylabel('y')
  27. plt.legend(loc=4) #指定legend的位置右下角
  28. plt.title('curve_fit')
  29. plt.show()
  30. plt.savefig('test2.png')
        繪制的圖形如下所示,擬合效果沒(méi)有多項(xiàng)式的好。

3.aX的b次方擬合

        第三種方法是通過(guò)Pandas導(dǎo)入數(shù)據(jù),因?yàn)橥ǔ?shù)據(jù)都會(huì)存儲(chǔ)在csv、excel或數(shù)據(jù)庫(kù)中,所以這里結(jié)合讀寫(xiě)數(shù)據(jù)繪制a*x的b次方形式。
        假設(shè)本地存在一個(gè)data.csv文件,數(shù)據(jù)集如下圖所示:


       然后調(diào)用Pandas擴(kuò)展包讀取數(shù)據(jù),并獲取x、y值顯示,這段代碼如下:
  1. #導(dǎo)入數(shù)據(jù)及x、y散點(diǎn)坐標(biāo)
  2. data = pd.read_csv("data.csv")
  3. print data
  4. print(data.shape)
  5. print(data.head(5)) #顯示前5行數(shù)據(jù)
  6. x = data['x'] #獲取x列
  7. y = data['y'] #獲取y列
  8. print x
  9. print y
        比如 print y 輸出結(jié)果:
  1. 0 4.00
  2. 1 5.20
  3. 2 5.90
  4. 3 6.80
  5. 4 7.34
  6. 5 8.57
  7. 6 9.86
  8. 7 10.12
  9. 8 12.56
  10. 9 14.32
  11. 10 15.42
  12. 11 16.50
  13. 12 18.92
  14. 13 19.58
  15. 14 20.00
  16. Name: y, dtype: float64
        最后完整的擬合代碼如下所示:
  1. #encoding=utf-8
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from scipy.optimize import curve_fit
  5. import pandas as pd
  6. #自定義函數(shù) e指數(shù)形式
  7. def func(x, a, b):
  8. return a*pow(x,b)
  9. #導(dǎo)入數(shù)據(jù)及x、y散點(diǎn)坐標(biāo)
  10. data = pd.read_csv("data.csv")
  11. print data
  12. print(data.shape)
  13. print(data.head(5)) #顯示前5行數(shù)據(jù)
  14. x = data['x']
  15. y = data['y']
  16. print x
  17. print y
  18. #非線(xiàn)性最小二乘法擬合
  19. popt, pcov = curve_fit(func, x, y)
  20. #獲取popt里面是擬合系數(shù)
  21. a = popt[0]
  22. b = popt[1]
  23. yvals = func(x,a,b) #擬合y值
  24. print u'系數(shù)a:', a
  25. print u'系數(shù)b:', b
  26. #繪圖
  27. plot1 = plt.plot(x, y, 's',label='original values')
  28. plot2 = plt.plot(x, yvals, 'r',label='polyfit values')
  29. plt.xlabel('x')
  30. plt.ylabel('y')
  31. plt.legend(loc=4) #指定legend的位置右下角
  32. plt.title('curve_fit')
  33. plt.savefig('test3.png')
  34. plt.show()
        輸出結(jié)果如下圖所示:


4.三個(gè)參數(shù)擬合

        最后介紹官方給出的實(shí)例,講述傳遞三個(gè)參數(shù),通常為 a*e(b/x)+c形式。

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from scipy.optimize import curve_fit
  4. def func(x, a, b, c):
  5. return a * np.exp(-b * x) + c
  6. # define the data to be fit with some noise
  7. xdata = np.linspace(0, 4, 50)
  8. y = func(xdata, 2.5, 1.3, 0.5)
  9. y_noise = 0.2 * np.random.normal(size=xdata.size)
  10. ydata = y + y_noise
  11. plt.plot(xdata, ydata, 'b-', label='data')
  12. # Fit for the parameters a, b, c of the function `func`
  13. popt, pcov = curve_fit(func, xdata, ydata)
  14. plt.plot(xdata, func(xdata, *popt), 'r-', label='fit')
  15. # Constrain the optimization to the region of ``0 < a < 3``, ``0 < b < 2``
  16. # and ``0 < c < 1``:
  17. popt, pcov = curve_fit(func, xdata, ydata, bounds=(0, [3., 2., 1.]))
  18. plt.plot(xdata, func(xdata, *popt), 'g--', label='fit-with-bounds')
  19. plt.xlabel('x')
  20. plt.ylabel('y')
  21. plt.legend()
  22. plt.show()
        輸出結(jié)果如下圖所示:

三. 冪律分布擬合及疑問(wèn)

        下面是我冪率分布的實(shí)驗(yàn),因?yàn)樯婕暗奖C?,所以只提出幾個(gè)問(wèn)題。
        圖1是多項(xiàng)式的擬合結(jié)果,基本符合圖形趨勢(shì)。
        圖2是冪指數(shù)擬合結(jié)果,冪指數(shù)為-1.18也符合人類(lèi)的基本活動(dòng)規(guī)律。

 
        問(wèn)題:
        1.為什么冪律分布擬合的圖形不太好,而指數(shù)卻很好;
        2.計(jì)算冪指數(shù)及擬合是否只對(duì)中間那部分效果好的進(jìn)行擬合;
        3.e的b/x次方、多項(xiàng)方程、x的b次方哪個(gè)效果好?





        最后希望這篇文章對(duì)你有所幫助,尤其是我的學(xué)生和接觸數(shù)據(jù)挖掘、機(jī)器學(xué)習(xí)的博友。這篇文字主要是介紹擬合,記錄一些代碼片段,作為在線(xiàn)筆記,也希望對(duì)你有所幫助。同時(shí),后面論文寫(xiě)完會(huì)opensource系列文章。
        一醉一輕舞,一夢(mèng)一輪回。一曲一人生,一世一心愿。
       (By:Eastmount 2017-05-07 下午3點(diǎn)半  http://blog.csdn.net/eastmount/ )



    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多