1

我有一个逐点定义的函数。它源于一种存款情况,您每月存入 1k 美元,利息为 5%,您使用 Numpy 绘制。有多种方法可以计算边际利息,例如有限差分、自动导数、符号差分和手动(此处涵盖了某些方面,但采用封闭形式):

0. 0-10    months: 10USD
1. 10-20   months: 50USD
2. 20-30   months: 100USD
3. 30-40kk months: 130USD
4. 40-50kk months: 200USD
5. 50-60kk months: 260USD

在 Python 中,代码没有边际差异:

import numpy as np
import matplotlib.pyplot as plt

def situationNmonth(n): 
    #Returns situation after Nth month. 
    return np.sum([1000*np.exp(0.05*n/12) for n in range(n)])

def myHistory(test):
    return [situationNmonth(n) for n in range(60)]

def interests(n):
    #Returns interest given a month n.
    return situationNmonth(n)-n*1000

def plotInterests(test): 
    plt.plot([x for x in range(60)], [interests(n) for n in range(60)])
    plt.title("5% interests over 60 months with 1k USD per month.")
    plt.show()

在此处输入图像描述

在这里区分plotInterests函数(逐点定义函数)以查看每个月的利息的最简单方法是什么?Python 中的有限差分、自动导数和符号差分的状态如何,它们可以在这里用 Python 3 稳健地计算吗?

4

2 回答 2

1

参数化解决方案

参数解决方案包含 Numpy 的梯度函数:

返回 N 维数组的梯度。

使用内部点中的二阶精确中心差异和边界处的一阶或二阶精确单侧(前向或后向)差异计算梯度。因此,返回的梯度具有与输入数组相同的形状。(文档

我们明确关注与内部点的差异。例如,您可以使用 numpy 的梯度函数直接计算它:

>>> data=[x for x in range(60)], [interests(n) for n in range(60)]

>>> np.gradient(data[1])
array([   0.        ,    2.08767965,    6.27175575,   10.47330187,
         14.69239096,   18.92909627,   23.18349133,   27.45565003,
         31.74564653,   36.0535553 ,   40.37945114,   44.72340914,
         49.08550474,   53.46581365,   57.86441192,   62.28137592,
         66.71678233,   71.17070816,   75.64323073,   80.13442769,
         84.64437701,   89.17315698,   93.72084624,   98.28752374,
        102.87326876,  107.47816091,  112.10228014,  116.74570672,
        121.40852129,  126.09080477,  130.79263848,  135.51410403,
        140.25528339,  145.01625888,  149.79711316,  154.59792922,
        159.41879041,  164.25978043,  169.12098332,  174.00248348,
        178.90436566,  183.82671495,  188.76961683,  193.73315709,
        198.71742192,  203.72249785,  208.74847176,  213.79543092,
        218.86346295,  223.95265584,  229.06309793,  234.19487796,
        239.34808501,  244.52280855,  249.71913842,  254.93716484,
        260.17697839,  265.43867004,  270.72233115,  273.36966551])

在这里您可以看到每月的额外利息。你可以np.gradient(data[1], 2)在这里给你二阶导数。

在此处输入图像描述

更多非参数解决方案和端到端方法

更多的非参数解决方案包含贝叶斯方法:原始数据点是具有不确定性的先验点,结果是后验值。

  1. https://github.com/HIPS/autograd

  2. ftp://ftp.tuebingen.mpg.de/pub/kyb/antonio/pub/ebio/chrisd/GPtutorial.pdf

  3. http://scikit-learn.org/stable/auto_examples/gaussian_process/plot_gpr_noisy_targets.html

  4. 机器学习的高斯过程

我将这部分保持打开状态,也许有一些专家用 Python 解释它们。以及存在哪种解决方案可以稳健地计算与点的差异。

于 2018-07-15T21:19:38.317 回答
0

您可以对离散数据点进行插值,并对生成的插值进行微分。

于 2018-07-15T20:50:34.000 回答