QQ登录

只需要一步,快速开始

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

使用 Logistic 模型拟合人口数据

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

1186

主题

4

听众

2923

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-16 18:54 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
这段代码执行了如下操作:
5 m4 @( W2 x4 i; x/ E" i8 r5 _4 ?" `4 j; h* y) }  p
1.导入模块:% J% M, e' S; s7 j' p
, I) i- w  I. l! p
   import numpy as np
- V( p4 e4 k1 _% f+ F! i   import pandas as pd) x$ H5 J& {, u6 r( V
   from scipy.optimize import curve_fit
0 o( ?7 L) Y  e3 w: {6 I' o; S+ ]# q: L

* C* E* c3 }( O2 G7 u2.导入了 NumPy、Pandas 和 SciPy 中的 curve_fit 函数。
/ a/ r2 V: ~6 Y: v
6 T' g  @. ^5 E( z# M. E6 b: v) a
7 y1 i5 M: D) P3.准备数据:" y! Z6 ^+ x$ `
5 _! w5 I$ N  ]+ F6 S1 }! g& Q; N
   df = pd.DataFrame({2 D* N: p% h, w' X: H1 N+ }* @
       'year': [1790, 1800, 1810, 1820, 1830, 1840, 1850, 1860, 1870],
2 g9 r9 [4 ~7 {! w9 H7 ^) Y! ?. Z       'population': [3.9, 5.3, 7.2, 9.6, 12.9, 17.1, 23.2, 31.4, 38.6],
5 n/ t: b) L5 S9 E   })
# d. D" N. ^* w- H, B  e   x0 = float(df['population'][0])( R7 F; I) ~( O% ~
   t0 = float(df['year'][0])# t8 A/ K" T/ V  }; v8 j
8 L3 `3 {1 r- R! j2 I: T
- M  Z8 K& {' P2 r  T
4.创建了一个 Pandas DataFrame 来存储年份和人口数据。
9 v( {% d0 F# y# y- w$ k8 O+ H5.提取了初始年份和初始人口数。7 u$ b9 n- ]5 V% P; x5 s

9 w8 d( n, g$ r8 m- b8 k
* t& K$ H: V3 q- L6.定义 Logistic 模型函数:
: d) \4 ~1 w. M) s1 {- j5 Z0 q9 Y& |0 O( Q! B) p
   def x(t, r, xm):
7 [9 d0 e$ h7 e/ B+ D       return xm / (1 + (xm/x0-1)*np.exp(-r*(t-t0)))
8 T( B# N0 R% Z% X5 G* k9 ^( H, m- o7 ]5 ~+ e; m% D

4 J# J+ {4 g) ?7.定义了 Logistic 函数,该函数接受时间 t、增长率 r 和最大人口数 xm 作为参数,并返回人口数。
8 ~8 s# B6 w) T) ?- `5 B; ^7 G8 _8 }4 Z" `, L
: s/ p" j% ?$ @" b. z, L7 T
8.拟合参数:8 U, c) L. U$ x3 n) E
0 P2 ^' K6 A- P
   popt, pcov = curve_fit(x, df['year'], df['population'], bounds=((0, 1), (.1, np.inf)))4 _* @/ T7 d: `6 ^' e! K% L/ }7 Z
   r, xm = popt[0], popt[1]
8 Q# `8 B/ z, |1 S) v0 {- d- v, x! w5 V; U. n
! f. K. r8 g7 L, W4 D- a
9.使用 curve_fit 函数拟合了 Logistic 函数的参数 r 和 xm,以最小化实际人口数据与 Logistic 模型的拟合误差。
2 M+ {: M8 a9 ]9 v, G5 Z. H. J- [' W- i

+ T9 ~* s1 B* Y3 x" c10.预测 1900 年人口:
! ^+ U. n/ |- E: s) n
4 M% D( T# P% s" J1 J   print('population in 1900 =', x(1900, r, xm))+ S2 a$ n) O  b' e5 N8 p3 R% {
& z' n" {. w. O, V
3 @* Y# ?# a$ ^. R/ |
11.使用拟合的参数预测了 1900 年的人口数。
- z6 [4 J5 K! ]9 [$ s2 G) R9 {* R+ a

, v+ I6 }  C# Q6 {3 n+ T12.绘制预测曲线:
4 e% N1 f! E, ?! [, n# q" F$ R! A) L2 r; n4 ~3 E$ g$ i. D* p1 a1 X
   year = np.linspace(1790, 2000, 21)# k# {. u' F# p" N
   population = [x(each, r, xm) for each in year]9 L& S4 H' }% H* |4 c) M4 c
   plt.scatter(df['year'], df['population'], label='actual')  J# C' H$ o7 Z5 }1 P) L' f* i
   plt.plot(year, population, label='predict', color='coral')
# H3 N3 E( o7 e( c% K   plt.legend()( D" c7 |+ g* `; [7 N6 Q, Y
8 f; U+ t  V$ \% a" Z; ?
* p7 D; a; N5 M: Y% k
13.创建了一个时间范围 year,并使用拟合的参数计算了对应的人口数。2 S8 i# J: H; X* q9 K
14.使用 Matplotlib 绘制了实际人口数据的散点图和 Logistic 模型的预测曲线,并添加了图例。
( G) ^6 A9 c2 Y; X" o) y. ~; S" }
$ P/ @. U3 C: G% s1 d, X/ o: \- O这段代码的核心是使用 Logistic 模型拟合了给定的人口数据,并利用拟合的参数进行了未来人口的预测。
; T2 |1 d, j9 N% N1 W" Q; a3 N  v& y( N8 f/ p9 D# N$ N

! K0 S# e; e9 \; S8 b+ z2 T

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-21 18:12 , Processed in 0.428986 second(s), 55 queries .

回顶部