scipy

2012-09-26 16 views
6

द्वारा बनाई गई इंटरपोलेशन फ़ंक्शन का सूत्र प्राप्त करें मैंने पाइथन में कुछ काम किया है, लेकिन मैं scipy पर नया हूं। मैं interpolate लाइब्रेरी से एक फ़ंक्शन के साथ आने के तरीकों का उपयोग करने की कोशिश कर रहा हूं जो डेटा के एक सेट का अनुमान लगाएगा।scipy

मैं देखा है कुछ उदाहरण आरंभ करने के लिए, और Python(x,y) में काम कर नीचे नमूना कोड मिल सकता है:

import numpy as np 
from scipy.interpolate import interp1d, Rbf 
import pylab as P 

# show the plot (empty for now) 
P.clf() 
P.show() 

# generate random input data 
original_data = np.linspace(0, 1, 10) 

# random noise to be added to the data 
noise = (np.random.random(10)*2 - 1) * 1e-1 

# calculate f(x)=sin(2*PI*x)+noise 
f_original_data = np.sin(2 * np.pi * original_data) + noise 

# create interpolator 
rbf_interp = Rbf(original_data, f_original_data, function='gaussian') 

# Create new sample data (for input), calculate f(x) 
#using different interpolation methods 
new_sample_data = np.linspace(0, 1, 50) 
rbf_new_sample_data = rbf_interp(new_sample_data) 

# draw all results to compare 
P.plot(original_data, f_original_data, 'o', ms=6, label='f_original_data') 
P.plot(new_sample_data, rbf_new_sample_data, label='Rbf interp') 
P.legend() 

साजिश के रूप में प्रदर्शित किया जाता है इस प्रकार है:

interpolation-plot

अब , क्या Rbf (यानी rbf_interp के रूप में बनाई गई विधि) द्वारा निर्मित इंटरपोलेटेड फ़ंक्शन का प्रतिनिधित्व करने वाली बहुपद अभिव्यक्ति प्राप्त करने का कोई तरीका है?

या, यदि यह Rbf के साथ संभव नहीं है, तो अलग-अलग इंटरपोलेशन विधि, किसी अन्य लाइब्रेरी या यहां तक ​​कि एक अलग टूल का उपयोग करने वाले किसी भी सुझाव का भी स्वागत है।

+0

'scipy.interpolate.Rbf' के लिए दस्तावेज़ों को देखते हुए और' scipy.interpolate' मॉड्यूल के लिए मैं जो भी चाहता हूं उससे संबंधित कुछ भी नहीं देख सकता। एकमात्र तरीका जिसे मैं सोच सकता हूं वह स्रोत-कोड पढ़ता है और समझता है कि पैरामीटर के आधार पर फ़ंक्शन कैसे बनाया जाता है और फिर अपना स्वयं का फ़ंक्शन लिखता है जो एक पठनीय प्रतिनिधित्व को वापस करने में सक्षम होता है। लेकिन यह कार्यान्वयन के विवरण पर निर्भर करेगा। भले ही मैं नहीं देख सकता कि आप इसे कैसे दूर कर सकते हैं। – Bakuriu

+0

दो चरणों पर विचार करें: डेटा -> एक वक्र (आरबीएफ या जो भी हो), फिर वक्र -> टुकड़े की बहुपद: एक स्पलीन। स्पलीन पैरामीटर को सहेजना आसान है, (npiece + 1) * 4 - अगर आप यही करना चाहते हैं तो आगे पूछें। – denis

उत्तर

4

आरबीएफ आपके द्वारा पूछे जाने वाले कार्यों का उपयोग करता है, यह निश्चित रूप से एक वैश्विक मॉडल है, इसलिए हां एक कार्य परिणाम है, लेकिन निश्चित रूप से यह सच है कि आप शायद इसे पसंद नहीं करेंगे क्योंकि यह कई गॉसियनों पर एक योग है। आप मिल गया:

rbf.nodes # the factors for each of the RBF (probably gaussians) 
rbf.xi  # the centers. 
rbf.epsilon # the width of the gaussian, but remember that the Norm plays a role too 

तो इन बातों के साथ दूरी (rbf.xi तो गाऊसी में rbf.nodes और rbf.epsilon में कारकों के साथ दूरी प्लगिन (या जो भी समारोह आप उपयोग करना यह पूछा) के साथ गणना कर सकते हैं।(आप __call__ और _call_norm का अजगर कोड की जांच कर सकते हैं)

तो तुम कुछ अजीब आधा कोड/सूत्र, RBFs समारोह दस्तावेज में लिखा है देने के लिए sum(rbf.nodes[i] * gaussian(rbf.epsilon, sqrt((rbf.xi - center)**2)) for i, center in enumerate(rbf.nodes)) की तरह कुछ मिलता है, लेकिन आप भी अजगर कोड देख सकते हैं।

1

आरबीएफ संभावित रूप से Radial Basis Function के लिए खड़ा है। अगर scipy.interpolate.Rbf वह फ़ंक्शन था जिसे आप ढूंढ रहे हैं तो मुझे आश्चर्य नहीं होगा।

हालांकि, मुझे संदेह है कि आप अपने परिणाम का प्रतिनिधित्व करने के लिए एक बहुपद अभिव्यक्ति पा सकेंगे।

आप विभिन्न प्रक्षेप तरीकों की कोशिश करना चाहते हैं, तो जाँच इसी Scipy documentation, कि RBF के लिए लिंक देता है, splines ...

+0

हाय @ पियर्रे, शायद मैं अपने प्रश्न में स्पष्ट नहीं था। मैं पहले से ही 'scipy.interpolate.Rbf' का उपयोग कर रहा हूँ। मैं क्या जानना चाहता हूं कि अगर मैं किसी ऐसे फॉर्मूला को निकाल सकता हूं जो निर्मित इंटरपोलेशन फ़ंक्शन का प्रतिनिधित्व करता है (उदाहरण के लिए 'exp (x) + x^3-x^2', आदि) –

2

जवाब नहीं है, वहाँ कोई "अच्छा" जिस तरह से नीचे सूत्र लिखना है, या कम से कम एक छोटे से तरीके से नहीं। कुछ प्रकार के इंटरपोलेशंस, जैसे आरबीएफ और लोएस, सीधे डेटा पर फिट करने के लिए पैरामीट्रिक गणितीय फ़ंक्शन की खोज नहीं करते हैं और इसके बजाय वे अन्य बिंदुओं के फ़ंक्शन के रूप में अलग-अलग प्रत्येक डेटा डेटा के मान की गणना करते हैं।

ये इंटरपोलेशन हमेशा आपके डेटा (जैसे आपके मामले में) के लिए एक अच्छा फिट देने की गारंटी दी जाती है, और इसका कारण यह है कि उनका वर्णन करने के लिए आपको बहुत बड़ी संख्या में पैरामीटर (मूल रूप से आपके सभी डेटा पॉइंट) की आवश्यकता होती है। । इस बारे में सोचें: आप सीधी रेखाओं के साथ लगातार डेटा बिंदुओं को जोड़कर रैखिक रूप से अंतरण कर सकते हैं। आप इस तरह से किसी भी डेटा को फिट कर सकते हैं और फिर गणितीय रूप में फ़ंक्शन का वर्णन कर सकते हैं, लेकिन इसमें बड़ी संख्या में पैरामीटर (कम से कम अंक की संख्या) लगेंगे। असल में आप अभी क्या कर रहे हैं वह उसमें से एक बहुत ही आसान संस्करण है।

यदि आप सूत्र को छोटा करना चाहते हैं, तो इसका मतलब है कि आप गणितीय फ़ंक्शन वाले डेटा का वर्णन करना चाहते हैं जिसमें कई पैरामीटर नहीं हैं (विशेष रूप से पैरामीटर की संख्या डेटा बिंदुओं की संख्या से बहुत कम होनी चाहिए)। ऐसे उदाहरण लॉजिस्टिक फ़ंक्शंस, बहुपद कार्यों और यहां तक ​​कि साइन फ़ंक्शन (जिसे आप डेटा जेनरेट करते थे) हैं। जाहिर है, यदि आप जानते हैं कि कौन सा फ़ंक्शन डेटा उत्पन्न करता है जो वह फ़ंक्शन होगा जिसे आप फिट करना चाहते हैं।

+1

हैलो @ बिटवाइ, निश्चित रूप से उपरोक्त कोड मैं फ़ंक्शन जानता हूं ('एफ (एक्स) = पाप (2 * पीआई * एक्स) + शोर'); वास्तव में मेरे पास एक सीएसवी में डेटा का एक सेट है और यह नहीं पता कि फ़ंक्शन क्या है (मैं केवल अपने आकार के आधार पर अनुमान लगा सकता हूं, यह सब कुछ है) –

+0

@Eduardo हाँ, यही वह है जो मैंने माना। मुद्दा यह है कि यदि आपके पास कुछ विचार है कि किस प्रकार का मॉडल डेटा को फिट कर सकता है, या तो पूर्व ज्ञान से या केवल डेटा को देखकर, जो आपको बता सकता है कि आपको किस प्रकार के फ़ंक्शन प्रकार का उपयोग करना चाहिए। अन्यथा यह कुछ भी हो सकता है और केवल एक चीज जो आप कर सकते हैं वह पैरामीट्रिक कार्यों के विभिन्न परिवारों को आजमाएं। – Bitwise

+0

मैंने थोड़ा सा जवाब संपादित किया और रैखिक इंटरपोलेशन का एक छोटा सा उदाहरण जोड़ा। – Bitwise

0

मुझे नहीं लगता कि SciPy का आरबीएफ आपको वास्तविक कार्य देगा। लेकिन एक चीज जो आप कर सकते हैं वह उस नमूना का नमूना है जिसे SciPy के आरबीएफ ने आपको दिया (यानी 100 अंक)। फिर उन बिंदुओं के साथ Lagrange व्याख्या का उपयोग करें। यह आपके लिए एक बहुपद कार्य उत्पन्न करेगा। यहां एक उदाहरण दिया गया है कि यह कैसा दिखाई देगा। यदि आप लग्रेंज इंटरपोलेशन का उपयोग नहीं करना चाहते हैं, तो आप बहुपद कार्य उत्पन्न करने के लिए "न्यूटन की लाभांश अंतर विधि" का भी उपयोग कर सकते हैं। enter image description here