关于区间预测-PICP\PINAW\CWC\SCORE\等公式

import numpy as np

def calculate_metrics(y_true, y_pred, alpha):
    """
    计算区间预测的评价指标

    参数:
        y_true: 真实值,shape为(n_samples,)
        y_pred: 区间预测值,shape为(n_samples, 2)
        alpha: 置信水平,取值范围为(0, 1)

    返回:
        PICP: 区间预测置信度,float
        PINAW: 区间预测置信区间宽度,float
        SCORE: 区间预测得分,float
        SKILL_SCORE: 区间预测技能得分,float
        COVERAGE: 区间覆盖率,float
        WIDTH: 区间宽度,float
    """
    lower_bound = y_pred[:, 0]
    upper_bound = y_pred[:, 1]
    n_samples = len(y_true)

    # 计算PICP
    in_interval = np.logical_and(y_true >= lower_bound, y_true <= upper_bound)
    PICP = np.sum(in_interval) / n_samples

    # 计算PINAW
    PINAW = np.mean(upper_bound - lower_bound)

    # 计算SCORE
    score = np.zeros(n_samples)
    for i in range(n_samples):
        if y_true[i] < lower_bound[i]:
            score[i] = 2 * (lower_bound[i] - y_true[i]) / (upper_bound[i] - lower_bound[i])
        elif y_true[i] > upper_bound[i]:
            score[i] = 2 * (y_true[i] - upper_bound[i]) / (upper_bound[i] - lower_bound[i])
        else:
            score[i] = 0
    SCORE = np.mean(score)

    # 计算SKILL_SCORE
    skill_score = np.zeros(n_samples)
    for i in range(n_samples):
        if y_true[i] < lower_bound[i] or y_true[i] > upper_bound[i]:
            skill_score[i] = -1
        else:
            skill_score[i] = 2 * (upper_bound[i] - lower_bound[i]) / (upper_bound[i] - lower_bound[i] + (y_pred[i, 0] - y_true[i]) ** 2 + (y_true[i] - y_pred[i, 1]) ** 2)
    SKILL_SCORE = np.mean(skill_score)

    # 计算COVERAGE
    COVERAGE = np.sum(upper_bound - lower_bound) / n_samples

    # 计算WIDTH
    WIDTH = np.mean(upper_bound - lower_bound)

    return PICP, PINAW, SCORE, SKILL_SCORE, COVERAGE, WIDTH

以上代码来自“给我写一个采用PICP、PINAW、SCORE 、SKILL SCORE、区间覆盖率、区间宽度来评价区间预测的代码 - CSDN文库

CWC作为区间预测的评价指标,论文IEEE Xplore Full-Text PDF:指出是不合适的。

时间序列预测之区间预测方法(PIs:MVE&Delta&Bayesian&Bootstrap&LUBE) | 码农家园 (codenong.com)

这个链接有每个公式的解释。

以下是我修改后的代码

''' SCORE:衡量真实值(y_true)与预测区间(由上限upper_bound和下限lower_bound定义)之间的偏差程度。'''
''' http://dx.doi.org/10.1016/j.energy.2014.06.104'''
# alpha = 0.01;0.05;0.1 置信水平(1-alpha)%,为99%,95%,90%

def calculate_S(alpha, Li, Ui, true):
    m = len(true)
    S = 0

    for i in range(m):
        di = Ui[i] - Li[i]

        if true[i] < Li[i]:
            Si = -2 * alpha * di - 4 * (Li[i] - true[i])
        elif true[i] >= Li[i] and true[i] <= Ui[i]:
            Si = -2 * alpha * di
        else:
            Si = -2 * alpha * di - 4 * (true[i] - Ui[i])

        S += Si

    S /= m
    SCORE = np.abs(S) # 确保Socre的值是正数,值越小越好
    return SCORE

alpha = 1- confidence
SCORE = calculate_S(alpha, Lower_sequence, Upper_sequence,true)
print()
print('SCORE', SCORE)

''' MPICD:'''

def calculate_MPICD(true, Li, Ui):
    m = len(true)
    MPICD = 0

    for i in range(m):
        pi = true[i]
        avg = (Ui[i] + Li[i]) / 2
        diff = abs(avg - pi)
        MPICD += diff

    MPICD /= m

    return MPICD

MPICD = calculate_MPICD(true, Lower_sequence, Upper_sequence)
print("MPICD", MPICD)

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
由于PICP是一种统计方法,具体的实现可能会因为数据和模型的不同而有所差异。以下是一种可能的Python代码实现: ```python import numpy as np import pandas as pd from scipy.stats import norm def picp(y_true, y_pred, alpha): lower = np.percentile(y_pred, (1 - alpha) * 100) upper = np.percentile(y_pred, alpha * 100) return np.mean((y_true >= lower) & (y_true <= upper)) def pinew(y_true, y_pred, alpha): lower = np.percentile(y_pred, (1 - alpha) * 100) upper = np.percentile(y_pred, alpha * 100) coverage = (y_true >= lower) & (y_true <= upper) interval_width = np.abs(upper - lower) return np.mean(coverage * interval_width) def pit(y_true, y_pred): lower = np.percentile(y_pred, 2.5) upper = np.percentile(y_pred, 97.5) return np.mean((y_true >= lower) & (y_true <= upper)) def picp_loss(y_true, y_pred): alpha = 0.95 return 1 - picp(y_true, y_pred, alpha) def pinew_loss(y_true, y_pred): alpha = 0.95 return pinew(y_true, y_pred, alpha) def picp_pinew_loss(y_true, y_pred): alpha = 0.95 picp_loss = 1 - picp(y_true, y_pred, alpha) pinew_loss = pinew(y_true, y_pred, alpha) return picp_loss + pinew_loss def pinball_loss(y_true, y_pred): tau = np.arange(0.01, 1, 0.01) pinball_losses = np.zeros(len(tau)) for i, t in enumerate(tau): e = y_true - y_pred pinball_losses[i] = np.mean(np.maximum(t * e, (t - 1) * e)) return np.min(pinball_losses) def crps(y_true, y_pred): return np.mean((y_true - y_pred) ** 2) + 0.25 * np.mean((norm.cdf(y_true, y_pred, 1) - 0.5) ** 2) def wls(y_true, y_pred, ws): return np.sum(ws * (y_true - y_pred) ** 2) / np.sum(ws) def qloss(y_true, y_pred, quantile): e = y_true - y_pred return np.mean(np.maximum(quantile * e, (quantile - 1) * e)) ``` 其中,`picp`函数计算PICP,`pinew`函数计算PINew,`pit`函数计算PIT,`picp_loss`函数计算PICP Loss,`pinew_loss`函数计算PINew Loss,`picp_pinew_loss`函数同时计算PICP Loss和PINew Loss的加权和,`pinball_loss`函数计算Pinball Loss,`crps`函数计算CRPS,`wls`函数计算加权最小二乘损失,`qloss`函数计算分位数损失。这些函数可以根据具体需求进行选择和调用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值