আমি কীভাবে নম্পি ব্যবহার করে ডেরিভেটিভ গণনা করব?


96

আমি কোনও ফাংশনের ডেরাইভেটিভকে কীভাবে গণনা করব?

y = x 2 +1

ব্যবহার করছেন numpy?

ধরা যাক, আমি এক্স = 5 তে ডেরিভেটিভের মান চাই ...


4
আপনাকে সিম্পি ব্যবহার করতে হবে: sympy.org/en/index.html নম্পি পাইথনের একটি সংখ্যার গণনা লাইব্রেরি
প্রেরো

বিকল্পভাবে, আপনি কি ডেরাইভেটিভের সংখ্যাসূচক মানটি নির্ধারণের জন্য একটি পদ্ধতি চান? এর জন্য আপনি একটি সীমাবদ্ধ পার্থক্য পদ্ধতি ব্যবহার করতে পারেন তবে মনে রাখবেন তারা ভয়াবহভাবে শোরগোল করে।
হেনরি গোমারসাল

উত্তর:


148

আপনার চারটি বিকল্প আছে

  1. সীমাবদ্ধ পার্থক্য
  2. স্বয়ংক্রিয় ডেরিভেটিভস
  3. প্রতীকী পার্থক্য
  4. হাতে গণনা ডেরাইভেটিভস।

সীমাবদ্ধ পার্থক্যগুলির জন্য কোনও বাহ্যিক সরঞ্জামের প্রয়োজন নেই তবে সংখ্যাসূচক ত্রুটির প্রবণতা রয়েছে এবং যদি আপনি একটি বহুবিধ পরিস্থিতিতে থাকেন তবে কিছুক্ষণ সময় নিতে পারে।

আপনার সমস্যাটি যথেষ্ট সহজ হলে প্রতীকী পার্থক্যটি আদর্শ। প্রতীকী পদ্ধতিগুলি আজকাল বেশ শক্তিশালী হচ্ছে। সিমপাই এটির জন্য একটি দুর্দান্ত প্রকল্প যা NumPy এর সাথে ভালভাবে সংহত করে। অটোর্যাপ বা ল্যাম্বডিফাই ফাংশনগুলি দেখুন বা অনুরূপ প্রশ্নের সম্পর্কে জেনসেনের ব্লগপোস্টটি দেখুন

স্বয়ংক্রিয় ডেরাইভেটিভগুলি খুব শীতল, সংখ্যাগত ত্রুটির ঝুঁকিতে নেই, তবে কিছু অতিরিক্ত গ্রন্থাগার প্রয়োজন (এর জন্য গুগল, কয়েকটি ভাল বিকল্প রয়েছে)। এটি সবচেয়ে মজবুত তবে পছন্দটি সেট আপ করা সবচেয়ে পরিশীলিত / কঠিন। যদি আপনি নিজেকে numpyসিনট্যাক্সের মধ্যে সীমাবদ্ধ করে রাখেন তবে থিওানো ভাল পছন্দ হতে পারে।

এখানে সিমপি ব্যবহার করে একটি উদাহরণ দেওয়া হল

In [1]: from sympy import *
In [2]: import numpy as np
In [3]: x = Symbol('x')
In [4]: y = x**2 + 1
In [5]: yprime = y.diff(x)
In [6]: yprime
Out[6]: 2⋅x

In [7]: f = lambdify(x, yprime, 'numpy')
In [8]: f(np.ones(5))
Out[8]: [ 2.  2.  2.  2.  2.]

দুঃখিত, যদি এটি নির্বোধ বলে মনে হয়, তবে 3. সিম্বলিক পার্থক্য এবং 4. হাতের পার্থক্যের মধ্যে পার্থক্য কী ??
DrStrangeLove

11
যখন আমি "প্রতীকী পার্থক্য" বলেছিলাম তখন আমি বুঝিয়েছিলাম যে এই প্রক্রিয়াটি কোনও কম্পিউটার দ্বারা পরিচালিত হয়েছিল। নীতিগতভাবে 3 এবং 4 কেবলমাত্র কে কাজটি করে তা কম্পিউটার বা প্রোগ্রামার দ্বারা পৃথক হয়। ধারাবাহিকতা, স্কেলাবিলিটি এবং আলস্যতার কারণে 3 টি 4 এর চেয়ে বেশি পছন্দ করে। 4 টি যদি সমাধান খুঁজে পেতে ব্যর্থ হয় তবে 4 প্রয়োজনীয়।
এমরোকলিন

4
লাইন In-এ আমরা এফ তৈরি করেছি, এটি একটি ফাংশন যা y আর্ট এক্স এর ডেরিভেটিভকে গণনা করে। 8-এ আমরা এই ডেরাইভেটিভ ফাংশনটি সকলের ভেক্টরের জন্য প্রয়োগ করি এবং সমস্ত দ্বিগুণ ভেক্টরটি পাই। এটি কারণ, লাইনে line হিসাবে বলা হয়েছে, yprime = 2 * x।
এমরকলিন

কেবল সম্পূর্ণতার স্বার্থে, আপনি একীকরণের মাধ্যমে পৃথককরণও করতে পারেন (কচির অবিচ্ছেদ্য সূত্র দেখুন), এটি বাস্তবায়িত হয়েছে যেমন mpmath(তারা ঠিক কী করেছিল তা নিশ্চিত নয়)।
ডারওহ

এটিকে নিজে প্রয়োগ না করেই নিম্পিতে সীমাবদ্ধ পার্থক্য করার কী সহজ উপায় আছে? উদাহরণস্বরূপ, আমি পূর্বনির্ধারিত পয়েন্টগুলিতে কোনও ফাংশনের গ্রেডিয়েন্টটি খুঁজতে চাই।
অ্যালেক্স

43

আমি সবচেয়ে সোজা-এগিয়ে যাবার উপায়টি ভাবতে পারি তা হ'ল নাম্পির গ্রেডিয়েন্ট ফাংশনটি ব্যবহার করা :

x = numpy.linspace(0,10,1000)
dx = x[1]-x[0]
y = x**2 + 1
dydx = numpy.gradient(y, dx)

এইভাবে, ডায়ডেক্স কেন্দ্রীয় পার্থক্যগুলি ব্যবহার করে গণনা করা হবে এবং numpy.diff এর বিপরীতে y এর সমান দৈর্ঘ্য হবে, যা সামনের পার্থক্য ব্যবহার করে এবং ফিরে আসবে (এন -1) আকারের ভেক্টর।


4
ডিএক্স যদি ধ্রুব না হয় তবে কী হবে?
weberc2

4
@ ওয়েবারসি 2, সেক্ষেত্রে আপনার একটি ভেক্টরকে অন্য একজনকে বিভক্ত করা উচিত, তবে প্রান্তগুলি পিছনে এবং পিছনে ডেরাইভেটিভগুলির সাথে ম্যানুয়ালি আলাদাভাবে আচরণ করা উচিত।
স্পার্ক্লার

4
অথবা আপনি y ধ্রুবক dx দিয়ে বিভক্ত করতে পারেন, তারপরে গ্রেডিয়েন্ট গণনা করুন।
আইসআর্ডার

@ স্পার্কলার আপনার পরামর্শের জন্য ধন্যবাদ। যদি আমি 2 ছোট প্রশ্ন জিজ্ঞাসা করতে পারে, (ঝ) কেন আমরা পাস না dxকরার numpy.gradientপরিবর্তে x? (২) আমরা নিম্নরূপ পুলিশের শেষ লাইন করতে পারেন: dydx = numpy.gradient(y, numpy.gradient(x))?
ব্যবহারকারী 929304

4
V1.13 হিসাবে, অভিন্ন ইউনিফেসটি দ্বিতীয় আর্গুমেন্ট হিসাবে অ্যারে ব্যবহার করে নির্দিষ্ট করা যেতে পারে। এই পৃষ্ঠার উদাহরণ বিভাগ দেখুন ।
নাথানিয়েল জোনস

28

NumPy ডেরিভেটিভস গণনা করতে সাধারণ কার্যকারিতা সরবরাহ করে না। এটি বহুপদীগুলির সাধারণ বিশেষ ক্ষেত্রে পরিচালনা করতে পারে:

>>> p = numpy.poly1d([1, 0, 1])
>>> print p
   2
1 x + 1
>>> q = p.deriv()
>>> print q
2 x
>>> q(5)
10

আপনি যদি ডেরাইভেটিভ সংখ্যাসূচকভাবে গণনা করতে চান, তবে আপনি অ্যাপ্লিকেশনগুলির সিংহভাগের জন্য কেন্দ্রীয় পার্থক্য ভাগফল ব্যবহার করে দূরে যেতে পারেন। একক বিন্দুতে ডেরাইভেটিভের জন্য সূত্রটি এমন কিছু হবে

x = 5.0
eps = numpy.sqrt(numpy.finfo(float).eps) * (1.0 + x)
print (p(x + eps) - p(x - eps)) / (2.0 * eps * x)

আপনার যদি ফাংশন মানগুলির xসাথে সম্পর্কিত অ্যারের সাথে অ্যাবসিসিয়ের একটি অ্যারে থাকে তবে আপনি yডেরিভেটিভগুলির সাথে প্রায় অনুমানগুলি গণনা করতে পারেন

numpy.diff(y) / numpy.diff(x)

4
'আরও সাধারণ ক্ষেত্রে সংখ্যার ডেরাইভেটিভগুলি গণনা করা সহজ' - আমি আলাদা হতে অনুরোধ করছি, সাধারণ ক্ষেত্রে সংখ্যাগত ডেরিভেটিভগুলি গণনা করা বেশ কঠিন। আপনি কেবল সুন্দরভাবে আচরণিত কার্যগুলি বেছে নিয়েছেন।
উচ্চ পারফরম্যান্স মার্ক

>>> মুদ্রণ পি এর পরে 2 এর অর্থ কী? (২ য় লাইনে)
ড্রিস্ট্রঞ্জলভ

@ ডিআরস্ট্রঞ্জলভ: এটাই প্রকাশক onent এটি গাণিতিক স্বরলিপি অনুকরণ করা বোঝায়।
সোভেন মারনাচ

পছন্দ করুন অথবা কি?? কেন এটি ঘনিষ্ঠ বলে মনে হয় 2 ?? আমরা কেবল
সহগকেই

4
@ ডিআরস্ট্রঞ্জলভ: আউটপুটটি পড়ার কথা 1 * x**2 + 1। তারা 2এটিকে উপরের লাইনে রেখে দিয়েছে কারণ এটি একটি সূচক। দূর থেকে দেখুন।
সোভেন মারনাচ

15

আপনি যে ব্যবহার করতে চান তা ধরে নিয়ে numpy, আপনি কঠোর সংজ্ঞা ব্যবহার করে যে কোনও সময়ে কোনও ফাংশনের ডেরাইভেটিভকে সংখ্যাসূচকভাবে গণনা করতে পারেন :

def d_fun(x):
    h = 1e-5 #in theory h is an infinitesimal
    return (fun(x+h)-fun(x))/h

আপনি আরও ভাল ফলাফলের জন্য প্রতিসম ডেরিভেটিভ ব্যবহার করতে পারেন :

def d_fun(x):
    h = 1e-5
    return (fun(x+h)-fun(x-h))/(2*h)

আপনার উদাহরণ ব্যবহার করে, পুরো কোডটি দেখতে এমন কিছু হওয়া উচিত:

def fun(x):
    return x**2 + 1

def d_fun(x):
    h = 1e-5
    return (fun(x+h)-fun(x-h))/(2*h)

এখন, আপনি সংখ্যাসূচকভাবে ডাইরিভেটিভটি এখানে খুঁজে পেতে পারেন x=5:

In [1]: d_fun(5)
Out[1]: 9.999999999621423

8

আমি অন্য পদ্ধতিটি স্তূপের উপরে ফেলে দেব ...

scipy.interpolateএর অনেকগুলি ইন্টারপোলটিং স্প্লাইগুলি ডেরিভেটিভ সরবরাহ করতে সক্ষম। সুতরাং, একটি লিনিয়ার স্প্লাইন ( k=1) ব্যবহার করে স্প্লাইনের ডেরিভেটিভ ( derivative()পদ্ধতিটি ব্যবহার করে ) একটি সামনের পার্থক্যের সমতুল্য হওয়া উচিত। আমি পুরোপুরি নিশ্চিত নই, তবে আমি বিশ্বাস করি যে কিউবিক স্প্লাইন ডেরাইভেটিভ ব্যবহার করা একটি কেন্দ্রিক পার্থক্য ডেরাইভেটিভের সাথে সমান হবে কারণ এটি কিউবিক স্প্লাইনটি নির্মাণের আগে এবং পরে মানগুলি ব্যবহার করে।

from scipy.interpolate import InterpolatedUnivariateSpline

# Get a function that evaluates the linear spline at any x
f = InterpolatedUnivariateSpline(x, y, k=1)

# Get a function that evaluates the derivative of the linear spline at any x
dfdx = f.derivative()

# Evaluate the derivative dydx at each x location...
dydx = dfdx(x)

এটি চেষ্টা করে দেখুন, আমি এই ফাংশন থেকে ত্রুটিগুলি পেতে থাকি এক্সিসারর: অক্ষ -1 মাত্রা 0 এর অ্যারের বাইরে নেই এবং আমি সম্প্রদায়টিতে এর কোনও উত্তর দেখতে পাচ্ছি না, কোন সাহায্য?
আয়ান মিত্র

আপনার সমস্যাটিকে নতুন প্রশ্ন হিসাবে পোস্ট করুন এবং এটিতে এখানে লিঙ্ক করুন। আপনার ত্রুটি দেখা দেয় এমন একটি উদাহরণ সরবরাহ করা সম্ভবত প্রয়োজন হবে। ইন্টারপ ফাংশনগুলির সাথে আমার যে ত্রুটিগুলি হয় সেগুলি সাধারণত হয় কারণ তথ্যটি ভালভাবে প্রবেশ করে না - যেমন পুনরাবৃত্তি মান, মাত্রার ভুল সংখ্যা, অ্যারের মধ্যে একটি দুর্ঘটনাক্রমে খালি থাকে, এক্সের বিপরীতে ডেটা বাছাই করা হয় না বা যখন সাজানো হয় না বৈধ ফাংশন, ইত্যাদি। এটি সম্ভব স্কিপি নকলকে ভুলভাবে কল করছে, তবে খুব সম্ভবত unlikely X. shape এবং y. shape চেক করুন। দেখুন np.interp () কাজ করে কিনা - এটি না থাকলে আরও সহায়ক ত্রুটি সরবরাহ করতে পারে।
flutefreak7

6

গ্রেডিয়েন্ট গণনা করতে, মেশিন লার্নিং সম্প্রদায় অটোগ্রেড ব্যবহার করে:

" নমপি কোডের ডেরিভেটিভগুলি দক্ষতার সাথে গণনা করে। "

স্থাপন করা:

pip install autograd

এখানে একটি উদাহরণ:

import autograd.numpy as np
from autograd import grad

def fct(x):
    y = x**2+1
    return y

grad_fct = grad(fct)
print(grad_fct(1.0))

এটি জটিল ফাংশনগুলির উদাহরণস্বরূপ, মাল্টিভারিয়েট ফাংশনগুলির গ্রেডিয়েন্টগুলিও গণনা করতে পারে।


হাই এই ফাংশনটি পদক্ষেপের দৈর্ঘ্য সরবরাহ করে সংখ্যাসূচকভাবে ডেটা দুটি কলামের মধ্যে পার্থক্য করতে ব্যবহার করা যেতে পারে? ধন্যবাদ
আয়ান মিত্র

3

নির্ভুলতার স্তরের উপর নির্ভর করে আপনি স্বতন্ত্রতার সহজ প্রমাণ ব্যবহার করে এটি নিজেরাই কাজ করতে পারেন:

>>> (((5 + 0.1) ** 2 + 1) - ((5) ** 2 + 1)) / 0.1
10.09999999999998
>>> (((5 + 0.01) ** 2 + 1) - ((5) ** 2 + 1)) / 0.01
10.009999999999764
>>> (((5 + 0.0000000001) ** 2 + 1) - ((5) ** 2 + 1)) / 0.0000000001
10.00000082740371

আমরা আসলে গ্রেডিয়েন্টের সীমা নিতে পারি না, তবে এর মজাদার। যদিও আপনার নজর রাখা দরকার because

>>> (((5+0.0000000000000001)**2+1)-((5)**2+1))/0.0000000000000001
0.0

2

আপনি ব্যবহার করতে পারেন scipy, যা বেশ সোজা এগিয়ে রয়েছে:

scipy.misc.derivative(func, x0, dx=1.0, n=1, args=(), order=3)

একটি বিন্দুতে একটি ফাংশন এর নবম ডেরাইভেটিভ খুঁজুন।

আপনার ক্ষেত্রে:

from scipy.misc import derivative

def f(x):
    return x**2 + 1

derivative(f, 5, dx=1e-6)
# 10.00000000139778
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.