零基础实现高斯回归算法预测天气系统

前言:上篇文章提及在某种情况下(原函数模型是黑箱模型),我们就可以选择构造一个函数,该函数与原函数相似,实现根据输入(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 参数控制输入空间的平滑度。(这个求协方差的公式不是唯一的,我所使用的是最常用的一种)。

大致流程到此结束,希望能给您带来有效的帮助。花落花开花无悔,缘来缘去缘如水,诸君,再会!

  • 51
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值