python-编码实现指数平滑法移动平均法

1.实现移动平均

a)一次移动平均,取多个n值,计算标准差;
b)二次移动平均,计算参数a,b,进行预测;

代码

# -*- coding=utf-8 -*-
# name: nan chen
# date: 2021/4/8 14:28

import csv
import matplotlib.pyplot as plt

# 读取数据文件
with open(r"D:\Downloads\train.csv", encoding="utf-8") as f:
    reader = csv.reader(f)
    header_row = next(reader)
    counts = []
    ids = []
    for row in reader:
        ids.append(int(row[0]))
        counts.append(int(row[2]))
plt.plot(ids, counts, color="blue", linewidth=1, linestyle=':', marker=',')

length = len(counts)
singemovings = []
pos = 0
min = 1000000
# 一次移动平均
for n in range(2, 201):
    singemoving = []
    mse_sum = 0
    for i in range(n - 1, length):
        sum = 0
        for j in range(0, n):
            sum = sum + (counts[i - j])
        singemoving.append(int(sum / n))
    singemovings.append(singemoving)
    # 求解MSE
    for x, y in zip(range(len(counts) - 1, n - 1, -1), range(len(singemoving) - 2, -1, -1)):
        mse_sum = mse_sum + ((counts[x] - singemoving[y]) ** 2)
    mse = mse_sum / (len(counts) - n)
    sq_mse = mse** 0.5
    if mse < min:
        min = mse
        pos = n
    print("n=%s 标准差=%s mse=%s" % (n, sq_mse, mse))
    # 打印结果
    print("n=%s 一次移动平均法的预测值为:%s" % (n, singemoving[len(singemoving) - 1]))
# plt.plot(ids[n - 1:], singemoving, color="red", linewidth=1, linestyle=':', marker=',', label='一次移动平均法')

# 二次移动平均
# 选取mse最小的值计算二次移动平均
n = pos
singemoving = singemovings[n - 2]
twicemoving = []
for i in range(n - 1, len(singemoving)):
    sum = 0
    for j in range(0, n):
        sum = sum + singemoving[i - j]
    twicemoving.append(int(sum / n))

# 二次移动平均预测值
a = singemoving[len(singemoving) - 1] * 2 - twicemoving[len(twicemoving) - 1]
b = (2 / (n - 1)) * (singemoving[len(singemoving) - 1] - twicemoving[len(twicemoving) - 1])
x = a + b
print("n=%s 二次移动平均法的预测值为:%s" % (n, x))

2.实现指数平滑

a)一次指数平滑,取多个a值;
b)二次指数平滑(可选);

代码:

# -*- coding=utf-8 -*-
# name: nan chen
# date: 2021/4/9 10:56

import csv
import matplotlib.pyplot as plt

# 读取数据文件
with open(r"D:\Downloads\train.csv", encoding="utf-8") as f:
    reader = csv.reader(f)
    header_row = next(reader)
    counts = []
    ids = []
    for row in reader:
        ids.append(int(row[0]))
        counts.append(int(row[2]))

# 一次指数平滑法
s = []
list_a = [2 / (len(counts) + 1), 0.1, 0.2, 0.3, 0.4, 0.5, 0.8, 0.9]
# colors = ["brown", "green", "red", "gray", "yellow"]
# 取初始值为x0
for a in list_a:
    s1 = [counts[0]]
    for i in range(0, len(counts)):
        tmp = a * counts[i] + (1 - a) * s1[i]
        s1.append(tmp)
    s.append(s1)
for i in range(0, len(list_a)):
    s_i = s[i]
    print("a=%s 一次指数平滑法的预测值为:%s" % (list_a[i], s_i[len(s_i) - 1]))
    # plt.plot(ids, s_i[1:], label='a = %s' % a, color=colors[i], linewidth=1, linestyle=':', marker=',')

# plt.show()

# 二次指数平滑法
twice_s = []
j = 0
for a in list_a:
    s2 = [counts[0]]
    single_s = s[j]
    for i in range(1, len(counts)):
        tmp = a * single_s[i] + (1 - a) * s2[i - 1]
        s2.append(tmp)
    twice_s.append(s2)
    j = j + 1

for i in range(0, len(list_a)):
    single = s[i]
    twice = twice_s[i]
    at = 2 * single[len(single) - 1] - twice[len(twice) - 1]
    bt = (list_a[i] / 1 - list_a[i]) / (single[len(single) - 1] - twice[len(twice) - 1])
    x = at + bt
    print("a=%s 二次指数平滑法的预测值为%s" % (list_a[i], x))

3.数据集的检查

代码:

# -*- coding=utf-8 -*-
# name: nan chen
# date: 2021/4/10 9:52
import pandas as pd
import matplotlib.pyplot as plt

# 检查数据集是否存在空缺
data = pd.read_csv(r"D:\Downloads\train.csv")
total = data.isnull().sum().sort_values(ascending=False)
print(total)

# 绘制散点图观察是否存在偏离值
var = 'ID'
data1 = pd.concat([data['Count'], data[var]], axis=1)
data1.plot.scatter(x=var, y='Count', ylim=(0, 4000), s=1)
plt.show()

# 统计某一列中各个元素值出现的次数
c = data['Count'].value_counts()
print(c)

# 列出数据的偏斜度
ske = data['Count'].skew()
print("Count列的偏斜度%s " % ske)

# 计算count和id的相关系数
cor = data['Count'].corr(data['ID'])
print("Count列与ID列的相关系数为%s " % cor)

结果

移动平均

在这里插入图片描述
在这里插入图片描述

指数平滑

在这里插入图片描述

### Transformer模型预测结果平滑的方法和技术实现 在时间序列分析中,Transformer模型能够通过其强大的并行计算能力和全局依赖捕获能力提供高质量的预测结果。然而,在实际应用中,由于噪声或其他因素的影响,预测结果可能不够平稳。为了改善这一情况,可以采用多种平滑技术来优化预测输出。 #### 常见的预测结果平滑方法 1. **移动平均法 (Moving Average)** 移动平均是一种简单而有效的平滑技术,通过对连续多个时间步的结果取均值来减少波动。这种方法适用于短期预测场景下的微小调整。 ```python import numpy as np def moving_average(predictions, window_size=3): weights = np.ones(window_size) / window_size smoothed_predictions = np.convolve(predictions.flatten(), weights, mode='valid') return smoothed_predictions.reshape(-1, 1) ``` 2. **指数加权移动平均 (Exponential Weighted Moving Average, EWMA)** 这种方法赋予最近的数据更高的权重,从而更好地适应动态变化的趋势。它可以通过简单的递推公式实现。 ```python def ewma(predictions, alpha=0.9): smoothed_predictions = [] prev_value = predictions[0] for value in predictions: current_smoothed = alpha * prev_value + (1 - alpha) * value smoothed_predictions.append(current_smoothed) prev_value = current_smoothed return np.array(smoothed_predictions).reshape(-1, 1) ``` 3. **Savitzky-Golay滤波器** Savitzky-Golay滤波器是一种基于多项式的局部回归算法,能够在保留信号特征的同时有效去除高频噪声。此方法特别适合于复杂的时间序列数据。 ```python from scipy.signal import savgol_filter def savitzky_golay_smoothing(predictions, window_length=5, polyorder=2): smoothed_predictions = savgol_filter(predictions.flatten(), window_length, polyorder) return smoothed_predictions.reshape(-1, 1) ``` 4. **正则化技术** 在训练过程中引入正则项(如L2正则化),有助于防止过拟合现象的发生,间接提升预测结果的稳定性[^4]。 #### 结合注意力机制改进平滑效果 除了上述传统平滑方法外,还可以利用Transformer自身的注意力机制进一步增强预测结果的一致性和连贯性。例如,通过设计特定的位置编码函数或者自定义损失函数,使模型更加关注长期趋势而非瞬时扰动。 ```python import torch.nn as nn class SmoothLoss(nn.Module): def __init__(self, smooth_factor=0.1): super(SmoothLoss, self).__init__() self.smooth_factor = smooth_factor def forward(self, y_pred, y_true): diff = torch.abs(y_pred - y_true) smooth_loss = torch.mean(diff[:, :-1] - diff[:, 1:]) # 鼓励相邻差值接近 mse_loss = nn.MSELoss()(y_pred, y_true) total_loss = mse_loss + self.smooth_factor * smooth_loss return total_loss ``` 以上代码展示了如何创建一个带有平滑约束的损失函数,该函数不仅衡量了预测值与真实值之间的差距,还考虑到了预测序列内部的变化速率一致性。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值