QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2126|回复: 0
打印 上一主题 下一主题

使用 Logistic 模型拟合人口数据

[复制链接]
字体大小: 正常 放大

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-16 18:54 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码执行了如下操作:
* V, T0 G2 m% Q1 Z' y9 ^1 _! E1 F& [2 A! D2 l
1.导入模块:; o* B  E4 {. M& P+ q

0 b$ }6 \' b- L2 p$ @   import numpy as np# ?" H0 V% B5 I. u9 }& m
   import pandas as pd. p" c: [3 x% l+ H
   from scipy.optimize import curve_fit& a4 i: I' B% @2 w# t
& ^1 R) L% d! P

5 @* x: ^* G3 z2.导入了 NumPy、Pandas 和 SciPy 中的 curve_fit 函数。2 Y: T: s) j) C+ R' W6 _9 i

0 b: v5 o$ Y$ `2 ?& k) ~6 l' i3 N/ t
3.准备数据:: p6 w! f( c" r) B2 [" x$ F

* [! G) }6 H3 G   df = pd.DataFrame({
  ~% f# H( O* Z5 w       'year': [1790, 1800, 1810, 1820, 1830, 1840, 1850, 1860, 1870],0 h* B: p: z! G2 K
       'population': [3.9, 5.3, 7.2, 9.6, 12.9, 17.1, 23.2, 31.4, 38.6],! p! y& K+ G' j" x
   })  u5 u9 n1 L( M: s) e5 f7 d0 I
   x0 = float(df['population'][0]); B, Q6 k/ p' @7 L* L& y
   t0 = float(df['year'][0])+ [6 K% W8 Q! A
' }4 t7 E" J) t) O* \0 a' m5 @

- r8 l2 P" ^: ~1 c; L# K  O' O/ d4.创建了一个 Pandas DataFrame 来存储年份和人口数据。
' ^+ S: Y0 f* U) m1 p- ~5.提取了初始年份和初始人口数。
1 ^' {/ ~8 ]4 @% H4 A; W; L
. J4 l: j. v& n; q$ l' T  V6 q! t  i4 @
6.定义 Logistic 模型函数:& h5 q! H. i3 ~2 `

% ]2 K5 L- m1 {. m4 d7 V% S   def x(t, r, xm):5 P. u# B$ `; Q3 f9 U1 j! p
       return xm / (1 + (xm/x0-1)*np.exp(-r*(t-t0)))
8 q1 q: m, `& C/ r; g1 M) E1 j+ t- o
1 R- B2 B* R" O# D$ R% A; x" R. F- B
7.定义了 Logistic 函数,该函数接受时间 t、增长率 r 和最大人口数 xm 作为参数,并返回人口数。* M0 `/ w( \$ k& s) t# q4 ?0 C3 J

# y4 h% L1 E2 c% N1 G% c* Q
3 C( \. k1 m% w- }: v" u/ O8 F8.拟合参数:5 z& g4 O) x1 _- V

7 R  B9 D7 \" d0 S. t- Q  t6 e8 W   popt, pcov = curve_fit(x, df['year'], df['population'], bounds=((0, 1), (.1, np.inf)))
+ f, g4 h- q8 g' o, F. ]   r, xm = popt[0], popt[1]
3 t* C5 k* j7 E8 W( _+ M# f( c  v  x

& ]' }+ J2 }$ r3 [6 l4 H9.使用 curve_fit 函数拟合了 Logistic 函数的参数 r 和 xm,以最小化实际人口数据与 Logistic 模型的拟合误差。
4 f$ J( Y! O7 p: Q
: v  p9 T( P3 N7 v$ z# j0 ]; w& e8 O7 g  b
10.预测 1900 年人口:  z% T- d; f) U
; d1 |, F# |- E6 L8 r
   print('population in 1900 =', x(1900, r, xm))7 Y8 O/ _* r/ P4 \" e1 J( s: x, `
- X8 k+ t/ a( r: N2 d$ a
6 ^8 X$ D" ], x0 P
11.使用拟合的参数预测了 1900 年的人口数。- a1 ~% [! ^3 d: a( K5 b& O
1 ^* E# N% _; \5 V

+ \' ?" T! ~7 i' @12.绘制预测曲线:  Q3 x- R" o! E
( p/ f6 [' t3 B9 O& o" R+ b" n! h
   year = np.linspace(1790, 2000, 21)
- h5 S- n' r5 @% d  F, ]5 V$ h# r   population = [x(each, r, xm) for each in year]
. p8 v( o/ ^" q3 E* q8 F* a   plt.scatter(df['year'], df['population'], label='actual')7 a) F% A. [% L2 b
   plt.plot(year, population, label='predict', color='coral')
) z# }5 @, F/ ~5 ~. \# h% t& ~$ Z* l   plt.legend()
7 G" I9 I  v$ X' j6 J
' Z/ k  V, L+ J" S, ~+ y9 s
8 J0 b- k( @( L8 v2 W% z) z13.创建了一个时间范围 year,并使用拟合的参数计算了对应的人口数。
1 y( S! @; y& d  Y14.使用 Matplotlib 绘制了实际人口数据的散点图和 Logistic 模型的预测曲线,并添加了图例。$ n1 g6 r, X- Z# [, g& s

. \- r5 A3 v6 ?0 U6 d这段代码的核心是使用 Logistic 模型拟合了给定的人口数据,并利用拟合的参数进行了未来人口的预测。/ C9 F$ v3 Z+ Q1 n" ^  m  S
7 q' I) a! U( ]$ z' F
, ~, ^) H! x& n8 F

13.logistic_model.py

1.13 KB, 下载次数: 0, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]  [购买]

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-10 13:11 , Processed in 0.334988 second(s), 55 queries .

回顶部