QQ登录

只需要一步,快速开始

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

使用 Logistic 模型拟合人口数据

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

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-16 18:54 |只看该作者 |正序浏览
|招呼Ta 关注Ta
这段代码执行了如下操作:: j; J6 [2 k+ Z: H. b
; a  [' F$ t' R5 X: S, Q
1.导入模块:
( n$ m. N" @  W# {6 q' g  A; O: r
   import numpy as np& v- o" Z2 A$ v8 [- Z
   import pandas as pd
* }! a* L; K" O4 N   from scipy.optimize import curve_fit
* R0 c; v- h: N9 ?$ ^7 [9 N. l/ L8 P  B7 I8 [' l9 x( r) W* G
3 h- r$ J) O2 B4 A# C/ E  Y0 e9 [3 T
2.导入了 NumPy、Pandas 和 SciPy 中的 curve_fit 函数。
7 x" @/ N: C$ y& x
# k1 _' i5 I4 `1 [4 K# {6 P3 z1 a: e0 k3 b* i$ z4 A9 f
3.准备数据:  W# I/ ~0 [5 ^6 H- o6 s
& D  |/ x8 |2 P6 ^& Z3 J1 r5 p+ ]
   df = pd.DataFrame({  s* s% {2 U# D( D* i7 E/ }2 B
       'year': [1790, 1800, 1810, 1820, 1830, 1840, 1850, 1860, 1870],
, Q5 F2 T; g  S# R       'population': [3.9, 5.3, 7.2, 9.6, 12.9, 17.1, 23.2, 31.4, 38.6],
6 Z* Y# _1 J* A( [9 j! X   })
2 L; t/ p0 g! D) Z5 N% m  N   x0 = float(df['population'][0])
% O! T5 b6 \. R8 n/ e. U- S8 [6 Q   t0 = float(df['year'][0])
, w3 z- ]' c. u" F8 R! m1 M& ^% ^  d2 T9 c
, G, [, L! `4 C6 n8 R4 ]
4.创建了一个 Pandas DataFrame 来存储年份和人口数据。0 V% i3 X) U  D0 |
5.提取了初始年份和初始人口数。2 J" L$ |. Y' [% C4 h2 n, O$ R

$ H, ]  |8 v: ]7 O7 D5 G5 {% A# d. O* Q' `- a
6.定义 Logistic 模型函数:/ r1 Y' ~+ c, s, z6 Z: p5 U8 C1 j
3 Q4 ?# g8 \7 y" ~
   def x(t, r, xm):
/ ]( I& R! P& a; h' w1 K7 N       return xm / (1 + (xm/x0-1)*np.exp(-r*(t-t0)))
% r8 D* a8 U' H4 ^8 y6 v8 z8 ?5 r  u' A% T

3 E! b/ ?0 z- a/ a2 F- |% c7.定义了 Logistic 函数,该函数接受时间 t、增长率 r 和最大人口数 xm 作为参数,并返回人口数。5 Q4 a/ D& I, Q  L* H" Q1 j
. V& [* N& J/ j- G: {0 L

, F9 O# a+ ]2 S5 q) t2 K5 q8.拟合参数:
# i9 U5 O! P/ s, W5 K
5 d8 S8 P+ h: |, g   popt, pcov = curve_fit(x, df['year'], df['population'], bounds=((0, 1), (.1, np.inf)))
) C0 j3 s+ V4 T# k7 V3 |. W5 i   r, xm = popt[0], popt[1]# J  K5 N  Z( w/ d* C
% j0 F/ Q5 Q9 @
! K% E& E# A! U9 z" p
9.使用 curve_fit 函数拟合了 Logistic 函数的参数 r 和 xm,以最小化实际人口数据与 Logistic 模型的拟合误差。7 W; C( y0 u5 M2 X# E5 J3 d# b4 M: m
4 V8 d, G& S0 N+ V

5 {/ S- q, j" Z3 J( ~! v10.预测 1900 年人口:
9 i; x; w/ ~9 c1 }& H2 J$ R, G3 z1 u8 k
   print('population in 1900 =', x(1900, r, xm))9 _$ b& W/ N6 R) n

: F" o4 D, D4 Z! ]4 w4 ^$ C; |  J4 p0 `% z, \. V
11.使用拟合的参数预测了 1900 年的人口数。
" F; n# |" A: X# i% b. r: J# q! d, R6 o5 o- Y( x

( ?$ n* h3 d2 y: [' h$ F, `9 a12.绘制预测曲线:3 h! G4 ~4 U1 M7 @3 p. A# p, l

* J4 M* C# s' c( l: W   year = np.linspace(1790, 2000, 21): A% |3 k1 q3 G4 O7 `4 r
   population = [x(each, r, xm) for each in year]) p7 V! V7 |2 T5 b6 h
   plt.scatter(df['year'], df['population'], label='actual')6 M  N- _" J; `2 E) p
   plt.plot(year, population, label='predict', color='coral')
. s" n! U9 l2 C, ^, _   plt.legend()
7 j0 D4 c# a  g) u) a6 M4 j- Y
) G7 [) S6 w, {8 T% f& @, U: F, \9 z2 \/ x
13.创建了一个时间范围 year,并使用拟合的参数计算了对应的人口数。
. x$ b8 y6 E; M+ c  W5 h14.使用 Matplotlib 绘制了实际人口数据的散点图和 Logistic 模型的预测曲线,并添加了图例。
: U& N, G& x: f& _- A5 _( h( B: V2 R( T5 C" q& F4 Q
这段代码的核心是使用 Logistic 模型拟合了给定的人口数据,并利用拟合的参数进行了未来人口的预测。" M7 N% v+ `3 E% l9 \, y4 d
7 @3 H8 d0 F1 O) S

- b* S( d% S" p* R& n" Y

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-12 10:56 , Processed in 0.415510 second(s), 56 queries .

回顶部