用 Python 预测今后的北京高考人数

发布于 2022-03-30 20:44:33 字数 1690 浏览 929 评论 0

# coding: utf-8

# 作者:Wizard <github.com/wizardforcel>
# 预测今后的北京高考人数
# 假设 x 年的出生人数和 (x + 18) 年的高考人数是线性关系

import numpy as np
from matplotlib import pyplot as plt

def unary_linear_fit(x, y):

    assert(x.ndim == 1 and y.ndim == 1 and len(x) == len(y))

    cov_x_y = np.mean((x - x.mean()) * (y - y.mean()))

    k = cov_x_y / x.var()

    b = y.mean() - k * x.mean()

    return k, b


def r_square(y, y_hat):

    assert(y_hat.ndim == 1 and y.ndim == 1 and len(y_hat) == len(y))

    return 1 - np.sum((y - y_hat) ** 2) / np.sum((y - y.mean()) ** 2)

# 1988 ~ 2015 年的出生人数(万人)数据
x = np.asarray([15.3, 19, 14, 9.2, 8.3, 7.9, 8.5, 8.5, 7.8, 7.6, 6.7, 6.3, 7.2, \
6, 6, 4.5, 6.6, 7.7, 7.7, 9.9, 10.6, 10.9, 10.2, 12.5, 14.5, 13.6, 17.2, 12.3])

# 考试人数从 2006 年开始统计
y_train = np.asarray([12.6, 12.5, 11.8, 10.1, 8.1, 7.6, 7.3, 7.27, 7.05, 6.8, 6.12, 6])

x_train = x[:len(y_train)]
x_pred = x[len(y_train):]

k, b = unary_linear_fit(x_train, y_train)

y_train_hat = k * x_train + b

rsq = r_square(y_train, y_train_hat)
print rsq
# 0.870773027191
# 拟合度相当高

y_pred = k * x_pred + b


years = np.arange(1988, 2015 + 1) + 18
yr_train = years[:len(y_train)]
yr_pred = years[len(y_train):]

plt.plot(yr_train, y_train, 'b', label='history value')
plt.plot(yr_pred, y_pred, 'r', label='prediction value')

plt.title('Beijing people for CEE')
plt.xlabel('year')
plt.ylabel('population / 10e4')
plt.legend(loc='best')
plt.show()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84935 人气
更多

推荐作者

淹不死的鱼

文章 0 评论 0

zhangMack

文章 0 评论 0

爱的故事

文章 0 评论 0

linces

文章 0 评论 0

早乙女

文章 0 评论 0

鸵鸟症

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击“接受”或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。