Python: дифференциация по точечному выражению?

У меня есть точечно определенная функция. Это происходит из-за ситуации с депозитом, когда вы каждый месяц вносите 1000 долларов США с процентной ставкой 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?


person hhh    schedule 15.07.2018    source источник


Ответы (2)


Параметрические решения

Параметрические решения содержат функцию градиента 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. И какие существуют решения для надежного вычисления дифференциалов с точками.

person hhh    schedule 15.07.2018

Вы можете интерполировать свои дискретные точки данных и дифференцировать полученный интерполянт.

person ev-br    schedule 15.07.2018
comment
Я больше ищу сквозное решение без явного указания интерполянта, я нашел это, но еще не уверен, сделали ли они какое-то демо. - person hhh; 15.07.2018