前言:上篇文章提及在某种情况下(原函数模型是黑箱模型),我们就可以选择构造一个函数,该函数与原函数相似,实现根据输入(input x)得到下一个输出(input y),这个函数也叫拟合函数,那么该如何构造这个函数呢,这时候就可以选择含参数和不含参数的构造方法了,对于某种不确定性极强,异常值(异常值是指与其他数据明显不同的数据)经常出现的事件,那么这时候用含参数的算法去拟合函数,显然会不太准确,例如经常使用的含参模型:线性回归方程:
异常值会对线性回归方程的结果产生负面影响。此外,线性回归方程也受到多重共线性的影响,这意味着它可能无法准确地拟合数据。
那么我们会不然而然的想到使用不含参数模型的方法,主要有svm,高斯回归思想,神经网络。
这里我们主要讨论高斯回归思想来拟合函数,然后预测天气。
那么,下面便是使用代码如何实现高斯回归算法预测天气系统:
我使用的语言是python,使用的工具是vscode,零基础的同学首先要下载vscode,以及python,具体的下载链接不展示出来,python可以选择下载最近版本的,下载安装完之后,在vscode的拓展选择python和python debuger安装。
2:创建好目录:
这是我的项目目录:
/my_project_directory
├── app.py # Flask 应用的主脚本
├── templates/
│ ├── index.html # 主页面模板
│ └── weather.html # 显示天气数据的模板
└── requirements.txt # 可选,列出依赖(可有可无)
3:Python环境中没有安装 requests 库和其它要用到的库,就需要安装 requests 和 beautifulsoup4 ,pandans,flask 模块(mudule)(后者用于网页解析)),
安装方法是:如果你是Windows用户按住开始键加R,输入cmd打开命令行界面,用pip命令安装,用普通的pip安装还会出现时间超时错误,例如:
pip install requests beautifulsoup4需要改成pip install --upgrade pip -i Simple Index(镜像安装源)
因为访问国际站点比较慢,会出现超时安装不成功,所以使用国内的镜像源进行安装。通过- pip 命令行添加参数,指定使用国内镜像(aliyun.com)安装。
4:当上面的问题解决完之后,还有新的问题就是我从天气网站上面获取完了数据,然后给数据投入了高斯回归模型,最后的结果如何实现根据自己选择城市,出现相应的气温和不确定性(做成网页的形式)?
我找到了一个相关的例子:基于机器学习的天气数据分析与预测系统_机器学习预测天气预报-CSDN博客
我想要实现这种以网页的形式展示出来,然后还可以自行选择城市,要查询什么时间的天气。
这个问题的解决方式便是使用一个模块Flask将python和web网页形式进行转换。
转化的时候也会出现问题,我遇到了flask脚本运行不成功(将python转化成网页所使用到的),老是出现跟python里面的源文件重名冲突。这个问题的解决方法是重新下载安装flask。
下面是具体的代码实现,实际用到时需要进行修改,类似于我举的一个例子,当然如果大家有更好的代码实现,可以在评论区分享出来。
index.html # 主页面模板 :
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Weather Prediction</title>
</head>
<body>
<h1>输入城市和日期获取天气</h1>
<form action="/weather" method="post">
<input type="text" name="city" placeholder="城市名" required>
<input type="date" name="date" required>
<button type="submit">获取天气</button>
</form>
<h1>预测未来的温度</h1>
<form action="/predict" method="post">
<input type="text" name="city" placeholder="城市名" required>
<input type="date" name="future_date" required>
<button type="submit">预测</button>
</form>
</body>
</html>
效果如下:
weather.html # 显示天气数据的模板 :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Weather Result</title>
</head>
<body>
<h1>Weather in {{ weather.city }} on {{ weather.date }}</h1>
<p>温度: {{ weather.temperature }} °C</p>
<p>Humidity: {{ weather.humidity }} %</p>
<p>天气状况: {{ weather.weather }}</p>
<a href="/">Back</a>
</body>
</html>
app.py # Flask 应用的主脚本 :
import requests
from flask import Flask, render_template, request
import pandas as pd
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C
app = Flask(__name__)
def fetch_weather_data(city, date):
api_key = '08432e8642872efd2f3bb2a0651947eb' # 替换为 API 密钥
url = f'http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric'
response = requests.get(url)
if response.status_code == 200:
data = response.json()
return {
'temperature': data['main']['temp'],
'humidity': data['main']['humidity'],
'weather': data['weather'][0]['description'],
'city': data['name'],
'date': date
}
else:
print(f"Error: {response.status_code}, {response.text}") # 输出详细的错误信息
return None
@app.route('/')
def index():
return render_template('index.html')
@app.route('/weather', methods=['POST'])
def weather():
city = request.form['city']
date = request.form['date']
weather_data = fetch_weather_data(city, date)
if weather_data:
return render_template('weather.html', weather=weather_data)
else:
return "City not found", 404
@app.route('/predict', methods=['POST'])
def predict():
# 假设我们获取了多个日期的天气数据用于训练
historical_data = [] # 用于存储历史天气数据
# 这里需要实现从CSV或数据库获取数据,以填充 historical_data
# 示例:通过 fetch_weather_data 获取过去几天的天气数据
# historical_data.append(fetch_weather_data(city, date))
# 模拟获取历史数据(这里仅是示例,实际应用时可能需要读取文件或数据库)
date_list = ['2024-07-01', '2024-07-02', '2024-07-03', '2024-07-04', '2024-07-05']
for date in date_list:
data = fetch_weather_data('your_city', date) # 替换 'your_city' 为实际城市
if data:
historical_data.append(data)
# 提取特征
df = pd.DataFrame(historical_data)
df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day
X = df[['year', 'month', 'day']]
y = df['temperature']
# 构建高斯回归模型
kernel = C(1.0, (1e-3, 1e3)) * RBF(length_scale=1.0)
gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10)
gp.fit(X, y)
# 假设我们需要预测某个特定日期的温度
future_date = pd.to_datetime(request.form['future_date']) # 从请求中获取要预测的日期
new_data = [[future_date.year, future_date.month, future_date.day]]
# 进行预测
y_pred, sigma = gp.predict(new_data, return_std=True)
return f"Predicted temperature: {y_pred[0]} ± {sigma[0]} °C"
if __name__ == '__main__':
app.run(debug=True)
其中主要的算法是求协方差的公式:kernel = C(1.0, (1e-3, 1e3)) * RBF(length_scale=1.0)
C(1.0, (1e-3, 1e3)) 通常表示一个常数项和一个与输入相关的项,可能是一个常数(均值项)加上一个在给定范围内的噪声项。
RBF(length_scale=1.0) 是指径向基函数(Radial Basis Function,也称为高斯核),它用于衡量输入数据点之间的相似性,length_scale 参数控制输入空间的平滑度。(这个求协方差的公式不是唯一的,我所使用的是最常用的一种)。
大致流程到此结束,希望能给您带来有效的帮助。花落花开花无悔,缘来缘去缘如水,诸君,再会!