数值分析案例:Newton插值预测2019城市(Asian)温度、Crout求解城市等温性的因素系数

文章目录

  • 数值分析案例:Newton插值预测2019城市(Asian)温度、Crout求解城市等温性的因素系数
    • 一、实验目的及数据来源
      • 1.研究问题的概述:
      • 2.数据来源:
    • 二、实验内容
      • 第一部分:“采用Newton插值预测2019城市(Asian)温度”
      • 第二部分:“Crout求解分析城市的等温性影响因素系数”
    • 三、实验结果与分析

一、实验目的及数据来源

1.研究问题的概述:

本文主要研究了插值方法在“城市温度变化预测”这一问题上的实际应用,以及使用构建线性方程组求解因素系数,进一步探索城市等温性的相关性因素。(采用的差值方法请参考之前的博客:Python:花了好久才写完的拉格朗日差值法和牛顿差商法的实现)

2.数据来源:

  1. World Average Temperature(https://www.kaggle.com/efradgamer/world-average-temperature)

  2. global environmental factors(https://www.kaggle.com/sadeka007/global-environmental-factors)

二、实验内容

第一部分:“采用Newton插值预测2019城市(Asian)温度”

Step 1:

随机选择出一定数量的所属区域为亚洲的城市温度数据,并保证这些城市的地理位置信息在经度、维度上有一定的划分,达到全局采样的效果。*选取的城市如下:北京、重庆、台北、东京、札幌、首尔、Dikson、海参崴、清迈、合艾、孟买、岘港、河内、埃尔祖鲁姆。

代码如下:

# -*- coding:utf-8 -*-
import numpy as np
import pandas as pd
import csv
import matplotlib.pyplot as plt
%matplotlib inlinepath = 'DATA.csv'
data = pd.read_csv(path, index_col=0)
data.head(15)

Step 2:

数据可视化,能够直观感受城市温度的对比,绘制城市温度折线图如下:

代码如下:

# 将csv文件格式转换为np.array格式,数据格式为float类型
Data = np.array(data.iloc[:,0:12], dtype=float) # 将数据转为float型
print(Data)# 取出每个城市的12个月的温度统计数据
Beijing = Data[0,:]
Chongqing = Data[1,:]
Taipei = Data[2,:]
Tokyo = Data[3,:]
Sapporo = Data[4,:]
Seoul = Data[5,:]
Dikson = Data[6,:]
Vladivostok = Data[7,:]
ChiangMai = Data[8,:]
HatYai = Data[9,:]
DaNang = Data[10,:]
Hanoi = Data[11,:]
Mumbai = Data[12,:]
Erzurum = Data[13,:]# 以折线图的方式可视化城市的年度温度变化数据
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]plt.figure(figsize=(13, 13))
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.plot(x, Beijing,  ms=2, label="北京")
plt.plot(x, Chongqing,ms=2, label="重庆")
plt.plot(x, Taipei,  ms=2, label="台北")
plt.plot(x, Tokyo, ms=2, label="东京")plt.plot(x, Sapporo, ms=2, label="札幌")
plt.plot(x, Seoul, ms=2, label="首尔")
plt.plot(x, Dikson, ms=2, label="Dikson")plt.plot(x, Vladivostok, ms=2, label="海参崴")
plt.plot(x, ChiangMai,  ms=2, label="清迈")
plt.plot(x, HatYai,  ms=2, label="合艾")
plt.plot(x, DaNang, ms=2, label="岘港")plt.plot(x, Hanoi,  ms=2, label="河内")
plt.plot(x, Mumbai,  ms=2, label="孟买")
plt.plot(x, Erzurum, ms=2, label="埃尔祖鲁姆")
plt.xticks(rotation=45)
plt.xlabel("Month")
plt.ylabel("Temperature/degree")
plt.title("2019 temperature change in Asian cities")
plt.legend(loc="upper left")# 在折线图上显示具体数值, ha参数控制水平对齐方式, va控制垂直对齐方式
for y in [Beijing, Chongqing, Taipei, Tokyo,Sapporo,Seoul,Dikson,Vladivostok,ChiangMai,HatYai,DaNang,Hanoi,Mumbai,Erzurum]:for x1, yy in zip(x, y):plt.text(x1, yy + 1, str(yy), ha='center', va='bottom', fontsize=12, rotation=0)
plt.savefig("a.jpg")
plt.show()

Step 3:

数据划分,将城市温度的数据划分为训练集和测试集。为了保证数据的分层采样, 训练数据集:选取1、3、5、7、9、11月的温度; 测试数据集:选取2、4、6、8、10、12月的温度。

代码如下:

# train_data
Beijing_train = Data[0,[0,2,4,6,8,10]]
Chongqing_train = Data[1,[0,2,4,6,8,10]]
Taipei_train = Data[2,[0,2,4,6,8,10]]
Tokyo_train = Data[3,[0,2,4,6,8,10]]
Sapporo_train = Data[4,[0,2,4,6,8,10]]
Seoul_train = Data[5,[0,2,4,6,8,10]]
Dikson_train = Data[6,[0,2,4,6,8,10]]
Vladivostok_train = Data[7,[0,2,4,6,8,10]]
ChiangMai_train = Data[8,[0,2,4,6,8,10]]
HatYai_train = Data[9,[0,2,4,6,8,10]]
DaNang_train = Data[10,[0,2,4,6,8,10]]
Hanoi_train = Data[11,[0,2,4,6,8,10]]
Mumbai_train = Data[12,[0,2,4,6,8,10]]
Erzurum_train = Data[13,[0,2,4,6,8,10]]
# Test_data
Beijing_test = Data[0,[1,3,5,7,9,11]]
Chongqing_test = Data[1,[1,3,5,7,9,11]]
Taipei_test = Data[2,[1,3,5,7,9,11]]
Tokyo_test = Data[3,[1,3,5,7,9,11]]
Sapporo_test = Data[4,[1,3,5,7,9,11]]
Seoul_test = Data[5,[1,3,5,7,9,11]]
Dikson_test = Data[6,[1,3,5,7,9,11]]
Vladivostok_test = Data[7,[1,3,5,7,9,11]]
ChiangMai_test = Data[8,[1,3,5,7,9,11]]
HatYai_test = Data[9,[1,3,5,7,9,11]]
DaNang_test = Data[10,[1,3,5,7,9,11]]
Hanoi_test= Data[11,[1,3,5,7,9,11]]
Mumbai_test = Data[12,[1,3,5,7,9,11]]
Erzurum_test = Data[13,[1,3,5,7,9,11]] # 列表下标是从0开始的,下标0,2,4,6,8,10分别对应1、3、5、7、9、11月,而下标1,3,5,7,9,11分别对应2、4、6、8、10、12月

Step 4:

差值方法的选择,考虑到Lagrange 插值的龙格现象,而Hermite插值需要导数的参与,分段插值的拟合性较弱。综合考量,选择Newton差商法进行差值预测。

以北京市为例,预测2、4、6、8、10、12月的温度如下:

代码如下:

#Newton差商法
import numpy as npdef Qda_Table():for i in range(n+1):for j in range(n):if initial[i][j] is not None or i >= j + 2:continueelse:initial[i][j] = (initial[i - 1][j] - initial[i - 1][j - 1]) / (initial[0][j] - initial[0][j - i + 1])#  print("%d,%d的当前值为:" % (i, j) + str(initial[i][j]))def calculate_factors(no, vari):  # 计算每次的相乘的自变量因子多项式factor = 1if no == 1:return factorelse:for i in range(no-1):factor = factor * (vari-x[i])return factordef final_calculate(k):result = 0for time in range(n):result = result + initial[time+1][time] * calculate_factors(time+1, v[k])return resultx = [1, 3, 5, 7, 9, 11]# 输入的月份
y = Beijing_train.copy()
n = len(x)
sum = 0
v = [2, 4, 6, 8, 10, 12]# 需要预测的月份
y_predict = [] # 用来存放预测月份的温度值initial = []  # 初始化表格Table
for p in range(n+1):initial.append([])for q in range(n):initial[p].append(None)  # 生成n*n的二维列表,同时列表元素初始化为0
for k in range(n):initial[0][k] = x[k]initial[1][k] = y[k]
# print("初始化后的表格如下:")
# print(initial)  # 将x和y的值填入表格,完成Table的初始化。Qda_Table()  # 计算每个位置的差商填表
QDA_table = np.array(initial).T  # 转置后输出结果
# print("最终的差商表格如下:")
# print(QDA_table)for i in range(n):y_predict.append(np.around(final_calculate(i),decimals=4))
print("预测月份的温度信息如下:")
print(y_predict)

第二部分:“Crout求解分析城市的等温性影响因素系数”

Step 1:

选择第一部分城市所在国家(Korea, South、Japan、Turkey、India、Vietnam、Thailand、China、Russia)的环境因素数据,但由于环境因素数据包含众多的数据项,以及为了构建后面的线性方程组求解因素系数并分析其相关性,这里经查阅资料和筛选后,选取以下8项环境因素作为城市等温性因素分析的探索指标:*

elevation(海拔)

cropland_cover(农田覆盖率)

tree_canopy_cover(植被覆盖率)

rain_mean_annual(平均年降水量)

rain_seasonailty(季节性降水量)

temp_annual_range(年温度浮动范围)

cloudiness(云层量)

temp_mean_annual(年平均温度)

详细数据如下:

代码如下:

# 数据可视化
path = 'ENVI.csv'
source = pd.read_csv(path, index_col=0)
source.head(15)

Step 2:

构建线性方程组,假设可能性因素与等温性存在线性关系。根据计算得到的系数,初步分析其与等温性的相关性情况:假如|系数|近似为0,则相关性较低;|系数|大于等于0.5,将其判定为较高的相关性。方程求解采用Crout分解法。

自变量:elevation、cropland_cover、tree_canopy_cover、rain_mean_annual、rain_seasonailty、temp_annual_range、cloudiness、temp_mean_annual

因变量:isothermality

结果如下:

代码如下:

# Crout分解法求解
import numpy as np
import copydef UAndL_Figure(k):# 按行计算U矩阵中Lj的值for j in range(mu):if j <= k:continueelse:uj = A[k][j]/A[k][k]U[k][j] = uj# 根据U_Figure计算得到的li系数改变A矩阵for j in range(mu):j = j+kfor i in range(nu):if j < nu-1:A[i][j+1] = A[i][j+1] - U[k][j+1] * A[i][k]else:continuemu, nu = 8, 8 # 方程和自变量个数为8
source = np.array(source.iloc[:,0:9], dtype=float) # 将数据转为float型
A, L, U = [], [], []  # 初始化ALU矩阵
for p in range(nu):A.append([]), L.append([]), U.append([])for q in range(mu):x_in = source[p][q]A[p].append(x_in)if p == q:L[p].append(None), U[p].append(1)else:L[p].append(None), U[p].append(0)
A, L, U = np.array(A), np.array(L), np.array(U)b_Const = source[:,[8]]  # 因变量y矩阵for i in range(nu):UAndL_Figure(i)
L = copy.deepcopy(A)y = np.dot(np.linalg.inv(L), b_Const)
x = np.dot(np.linalg.inv(U), y)
x = np.around(x,decimals=3)
# print("x的计算结果如下:")
# print(x)t=[i for item in x for i in item]#将二维的X数据一维化
print("可能性因素的系数的结果如下:")
print(t)

Step 3:

经过Step 2的线性相关系数求解,我们得到与等温性相关程度较高的因素:Cropland_cover(农田覆盖率)、tree_canopy_cover(植被覆盖率)、temp_annual_range(年温度浮动范围)。可视化所有城市在这些指标项上的数据情况:


以cropland_over因素为例,代码如下:

# 将csv文件格式转换为np.array格式,数据格式为float类型
source = np.array(source.iloc[:,0:9], dtype=float) # 将数据转为float型
print(source)# 设置matplotlib正常显示中文和负号
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False     # 生成画布
plt.figure(figsize=(20, 8), dpi=70)
# 横坐标城市名字
country_name = ['Korea, South','Japan','Turkey','India','Vietnam','Thailand','China','Russia']
# 纵坐标海拔
y = source[:,1]
x=range(len(country_name))plt.bar(x,y,color=['b','r','g','y','c','m','y','k','c','g','g'])
plt.xticks(x, country_name)
plt.xlabel("Country")
plt.ylabel("Cropland_cover")
plt.title("2019 Cropland_cover of the countries in Asian")# 在折线图上显示具体数值, ha参数控制水平对齐方式, va控制垂直对齐方式
for x1, yy in zip(x, y):plt.text(x1, yy + 1, str(yy), ha='center', va='bottom', fontsize=12, rotation=0)plt.show()

Step 4:

通过热力图分析潜在的因素,因为所选的国家个数以及选择的环境数据项局限性,并不能够很好的直接建立城市(Asian)等温性与其他环境因素之间的关系,所以*根据皮尔森相关系数(Pearson correlation coefficient),用来反映两个变量线性相关程度的统计量。

该热力图的解释如下:

横轴指标分别为:Elevation、 rain_mean_annual、 rain_seasonailty、cloudiness、temp_mean_annual、Isothermality;纵轴数据分别为:Korea, South、Japan、Turkey、India、Vietnam、Thailand、China、Russia各个国家。

该热力图用于探索不同国家在相同的环境因素指标上是否具有相关性。可以发现Elevation和rain _mean_annual在不同国家的数据统计上具有潜在的相关性。

该热力图不包括Cropland_cover(农田覆盖率)、tree_canopy_cover(植被覆盖率)、temp_ annual_range(年温度浮动范围)因素分析。

代码如下:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
f, ax = plt.subplots(figsize = (6,6))#显示热力图
sns.heatmap(source[:,[0,3,4,6,7,8]], annot=True,fmt='.2f',cbar=True)
ax.set_title('City  Statistics ')
ax.set_xlabel('Index Of Environmental Attributes')
ax.set_ylabel('City name')

三、实验结果与分析

“采用Newton插值预测2019城市(Asian)温度”,该部分采用了Newton插值法进行对2019城市(Asian)温度的插值预测,经检验,插值的结果是比较好的,与实际统计的误差较小。实际的意义:当监测月份的温度数据缺失时,可采用Newton插值法进行数据的补全以供使用。

“Crout求解分析城市的等温性影响因素系数”,该部分为探索性实验,其结论可以作为研究和探索方向,但未经大量验证是不能够断章取义的。与等温性相关的可能性因素计算结果为:Cropland_cover(农田覆盖率)、tree_canopy_cover(植被覆盖率)、temp_annual_range(年温度浮动范围),也是符合地理常识的认知。

最后结合热力图分析,以皮尔森相关系数作为理论依据,分析潜在因素有:Elevation(海拔)和rain_mean_annual(年平均降水量),也是实验可以继续的因素方向。以及可以考虑非线性关系的构建,利用神经网络的易拟合性进行进一步的强化分析*。

数值分析案例:Newton插值预测2019城市(Asian)温度、Crout求解城市等温性的因素系数相关推荐

  1. 统计案例分析之预测社会消费品零售总额

    有不足之处,还请大家私信交流. 版权声明:本文为自创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.(该文与课程报告相关,转载请务必附上出处),非常感谢. 本文链接:h ...

  2. 集成学习(下)实战案例一——幸福感预测

    背景介绍 幸福感是一个古老而深刻的话题,是人类世代追求的方向.与幸福感相关的因素成千上万.因人而异,大如国计民生,小如路边烤红薯,都会对幸福感产生影响.这些错综复杂的因素中,我们能找到其中的共性,一窥 ...

  3. K-近邻算法之案例2:预测facebook签到位置

    K-近邻算法之案例2:预测facebook签到位置 1 数据集介绍   [https://www.kaggle.com 天池,人工智能比赛网址] 数据介绍:将根据用户的位置,准确性和时间戳预测用户正在 ...

  4. react优秀项目案例_关于进行2019年北京市高等学校“实培计划”项目——毕业设计(创业类)项目总结与优秀项目案例征集的通知...

    BIT 关于进行2019年北京市高等学校"实培计划"项目--毕业设计(创业类)项目总结与优秀项目案例征集的通知 各相关学院: 为贯彻落实<北京高等学校高水平人才交叉培养计划& ...

  5. 牛顿(Newton)插值及其MATLAB程序

    拉格朗日插值的优点是格式整齐和规范,有误差估计方式,它的缺点是没有承袭性,当需要增加节点时,必须重新计算插值的基函数li(x).本文给出具有承袭性的牛顿插值法及其MATLAB程序.与牛顿插值有关的差商 ...

  6. 疫情之下春运人口回流“硬核”预测:往返这些超级网络节点城市有更大感染风险

    大数据文摘授权转载自nCoV疫情地图 作者:张海平 修宇璇 经历了各种"硬核"隔离之后,相信大家都明白了"人口的流动性是疫情防控的关键"这个道理. 春节前的人口 ...

  7. 插值与拟合 (一) : 拉格朗日多项式插值 、Newton插值 、分段线性插值、Hermite插值 、样条插值、 B 样条函数插值、二维插值

    插值:求过已知有限个数据点的近似函数. 拟合:已知有限个数据点,求近似函数,不要求过已知数据点,只要求在某种意义下它在这些点上的总偏差最小. 插值和拟合都是要根据一组数据构造一个函数作为近似,由于近似 ...

  8. Python 多项式预测2019年天猫销售额

    双十一刚过,天猫的销售额创新高占领了各大新闻媒体头条.但是,知乎上的一个问题对本次双十一的销售额提出了一个非常有意思的问题:<如何看待双十一销售额完美分布在三次回归曲线上且拟合高达 99.94% ...

  9. 预测超级计算机排名2020,足球超级计算机预测2019/2020英超联赛排名

    原标题:足球超级计算机预测2019/2020英超联赛排名 英超联赛很快就将拉开帷幕,人们都在急切地等待着.球迷们已经开始猜测他们俱乐部的最终排名怎么样了.但是光凭人们自己要想 预测英超联赛的最终结果是 ...

最新文章

  1. mysql分库主键_分库主键设计-Mysql
  2. netty系列之:netty初探
  3. jQuery.sap.declare(cus.crm.notes.ext.Component);
  4. 系统固件升级_固件和操作系统之间的差异
  5. USB/UART 串口转LoRa无线传输调试工具 评估套件
  6. 速收藏,《机器学习实战》Python3环境算法实现代码
  7. scut AccountServer 使用mysql
  8. mysql常用基础操作语法(八)~~多表查询合并结果和内连接查询【命令行模式】...
  9. 【NodeJS 学习笔记02】入门资源很重要
  10. python输入三次密码程序_请教各位大神,为啥以下代码输入修改密码后连输错三次还是能输入...
  11. 给模型添加ORM,与持久化记录
  12. ASP.NET页面间的传值方法(2)
  13. mysql5_MySQL5.5下载-MySQL数据库5.5下载 v5.5.60.1官方版(32位/64位)--pc6下载站
  14. SpringBoot邮件发送
  15. 离散信号内插和抽取Matlab,抽取与内插的频谱分析
  16. mysql注入单引号被转义_插入MySQL时转义PHP中的单引号[重复]
  17. vscode 下载慢解决方法
  18. IOS课程期末项目报告
  19. java爬虫教程 百度云_java视频教程java爬虫实战项目httpclient hbase springmvc solr
  20. -------实现一个类似迅雷的系统“福雷(FULEI)”

热门文章

  1. 压缩 Excel 文件中的图片
  2. ArcGIS Engine开发的类ArcCatalog数据管理工具
  3. win10清理_win10安全清理小建议
  4. 微软软件测试报告,windows计算器软件测试报告.doc
  5. 浅谈PHP几款框架的优缺点,PHP主流框架有什么优缺点
  6. python小玩意——纸牌21点游戏
  7. 移花接木 ATI显卡独立色差输出接电视方法
  8. 第八周 项目5-计数的模式匹配
  9. 实验四 数码管显示设计与仿真
  10. 五险一金计算器小程序源码