Matplotlib / numpy के साथ रैखिक प्रतिगमन


87

मैं एक बिखरे हुए भूखंड पर एक रेखीय प्रतिगमन उत्पन्न करने की कोशिश कर रहा हूं जो मैंने उत्पन्न किया है, हालांकि मेरा डेटा सूची प्रारूप में है, और उन सभी उदाहरणों का उपयोग कर सकता हूं polyfitजिनके उपयोग की आवश्यकता है arangearangeहालांकि सूचियों को स्वीकार नहीं करता है। मैंने किसी सूची को किसी सरणी में बदलने के बारे में उच्च और निम्न खोज की है और कुछ भी स्पष्ट नहीं है। क्या मैं कुछ भूल रहा हूँ?

निम्नलिखित पर, मैं इनपुट के रूप में पूर्णांक की अपनी सूची का उपयोग कैसे कर सकता हूं polyfit?

यहाँ पॉलीफ़िट उदाहरण मैं निम्नलिखित है:

from pylab import * 

x = arange(data) 
y = arange(data) 

m,b = polyfit(x, y, 1) 

plot(x, y, 'yo', x, m*x+b, '--k') 
show() 

प्रयास करें regplotसे seaborn: stackoverflow.com/a/42263217/911945
एंटोन तारासेन्को

जवाबों:


183

arange सूचियाँ उत्पन्न करता है (अच्छी तरह से, सुन्न सरणियाँ); help(np.arange)विवरण के लिए टाइप करें। आपको इसे मौजूदा सूचियों पर कॉल करने की आवश्यकता नहीं है।

>>> x = [1,2,3,4]
>>> y = [3,5,7,9] 
>>> 
>>> m,b = np.polyfit(x, y, 1)
>>> m
2.0000000000000009
>>> b
0.99999999999999833

मुझे यह जोड़ना चाहिए कि मैं poly1d"m * x + b" और उच्च-क्रम समकक्षों को लिखने के बजाय यहां उपयोग करता हूं , इसलिए आपके कोड का मेरा संस्करण कुछ इस तरह दिखाई देगा:

import numpy as np
import matplotlib.pyplot as plt

x = [1,2,3,4]
y = [3,5,7,10] # 10, not 9, so the fit isn't perfect

coef = np.polyfit(x,y,1)
poly1d_fn = np.poly1d(coef) 
# poly1d_fn is now a function which takes in x and returns an estimate for y

plt.plot(x,y, 'yo', x, poly1d_fn(x), '--k')
plt.xlim(0, 5)
plt.ylim(0, 12)

यहाँ छवि विवरण दर्ज करें


38

यह कोड:

from scipy.stats import linregress

linregress(x,y) #x and y are arrays or lists.

निम्नलिखित के साथ एक सूची देता है:

ढलान:
प्रतिगमन रेखा
अवरोधन का फ्लोट ढलान: प्रतिगमन रेखा का फ्लोट
अवरोधन
r-value: फ्लोट
सहसंबंध गुणांक
p- मान:
एक परिकल्पना परीक्षण के लिए दो-तरफा पी-मान फ्लोट करें जिसकी सुस्त परिकल्पना यह है कि ढलान शून्य
stderr है: फ्लोट
अनुमान की मानक त्रुटि

स्रोत


4
import numpy as np
import matplotlib.pyplot as plt 
from scipy import stats

x = np.array([1.5,2,2.5,3,3.5,4,4.5,5,5.5,6])
y = np.array([10.35,12.3,13,14.0,16,17,18.2,20,20.7,22.5])
gradient, intercept, r_value, p_value, std_err = stats.linregress(x,y)
mn=np.min(x)
mx=np.max(x)
x1=np.linspace(mn,mx,500)
y1=gradient*x1+intercept
plt.plot(x,y,'ob')
plt.plot(x1,y1,'-r')
plt.show()

इसे इस्तेमाल करो ..


यह समस्या से निपटने के लिए एक नया तरीका नहीं जोड़ता है - यह इस लोकप्रिय उत्तर में पहले ही सुझाया जा चुका है ।
श्री टी

क्या आप उत्पन्न सूची को एक सरणी में बदलना चाहते हैं?
एलेना रहमान

मैं कुछ खास नहीं करना चाहता, यह मेरा सवाल नहीं है। मैं सिर्फ इतना कह रहा हूं कि पहले से स्थापित उत्तर को दोहराना वास्तव में नहीं है, इसलिए एसओ की तलाश है। कृपया लिंक पढ़ें, मैंने पोस्ट किया।
श्री टी

2
from pylab import * 

import numpy as np
x1 = arange(data) #for example this is a list
y1 = arange(data) #for example this is a list 
x=np.array(x) #this will convert a list in to an array
y=np.array(y)
m,b = polyfit(x, y, 1) 

plot(x, y, 'yo', x, m*x+b, '--k') 
show()

1
मैं देखता हूं, आपने कुछ टिप्पणियां लिखी हैं, लेकिन आपको स्पष्टीकरण के कुछ वाक्यों को जोड़ने पर विचार करना चाहिए, इससे आपके उत्तर का मूल्य बढ़ जाता है;;
MBT

1
कृपया ध्यान दें कि एक कोड स्निपेट अपने आप में एक उपयोगी उत्तर हो सकता है, लेकिन भविष्य के पाठकों के लिए कुछ टिप्पणी छोड़ना बेहतर होगा कि यह समस्या क्यों हल करता है। धन्यवाद!
एर्टि सीडोहल

1
@ ब्लू-फोनोक्स अच्छी तरह से मुझे लगता है कि लोग यहाँ प्रतिभाशाली हैं, लेकिन मुझे लगता है कि मैं अगली बार
समझाऊंगा

1

एक और त्वरित और गंदा जवाब यह है कि आप अपनी सूची को उपयोग करके एक सरणी में बदल सकते हैं:

import numpy as np
arr = np.asarray(listname)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.