第一次发文章,不太会操作,也没啥文化,我就直接放代码了
对了问题描述:
GitModel 公司对面试的实习生给出了这样一个问题 : 搜集 1950∼2020 年间美国人口数据,,猜测其满足的函数关系,,并综合数据预测美国 2030 年的人口数:
*根据找到的数据,假定1950∼2020年美国人口是一次函数的线性关系,应该只用最小二乘法就能解决。
*当然真实人口预测的话,还需要考虑很多方面,需要把人口分为男性和女性,还需要注意人口流入流出趋势、年龄分段等等。
#导入数据
import pandas
Renkou = pandas.read_excel('美国人口.xlsx', sheet_name='Sheet1')
Renkou
#处理数据,绘制图像
import matplotlib.pyplot as plt
import scipy.optimize as opt
import numpy as np
from sympy import *
year = Renkou['年份']
people_num = Renkou['人口']
plt.plot(year, people_num,'b')
plt.xlabel('year')
plt.ylabel('number')
plt.title('American population of 1950-2020')
plt.show()
# 方法一:【暴力无脑】直线拟合与绘制
def f(x, A, B ):
return A * x + B
A1, B1 = opt.curve_fit(f, year, people_num)[0]
y1 = A1 * year + B1
plt.plot(year, people_num,'b',year, y1, "r-.")
x=symbols('x')
y1=A1 * x + B1
print('y1=',y1)
print("预计2030年有 %d 人" % y1.evalf(subs = {x:2030}))
#绘图
plt.xlabel('year')
plt.ylabel('number')
plt.title('Population fitting line')
plt.show()
# 方法二:【同样暴力无脑】二次函数的最小二乘法 曲线拟合与绘制
x = np.array(year)
y = np.array(people_num)
def residual(p):
a,b,c = p
return y-(a*x**2+b*x+c)
#使用opt的最小二乘法拟合函数
a,b,c = opt.leastsq(residual,[1,1,0])[0]
#绘图对比
y2=(a*x**2+b*x+c)
plt.plot(year, people_num,'b',year, y2, "r-.")
x=symbols('x')
y2=a * x**2 + b*x+c
print('y2=',y2)
print("预计2030年有 %d 人" % y2.evalf(subs = {x:2030}))
plt.xlabel('year')
plt.ylabel('number')
plt.title('Population fitting curve')
plt.show()