2008-09-04 22 views
42

Google मेरा मित्र नहीं है - यह कॉलेज में मेरी आँकड़े कक्षा के बाद से काफी समय रहा है ... मुझे ग्राफ पर एक ट्रेंडलाइन के लिए प्रारंभ और अंत बिंदुओं की गणना करने की आवश्यकता है - क्या ऐसा करने का कोई आसान तरीका है? (सी # में काम कर रहा है, लेकिन जो कुछ भी भाषा आप के लिए काम करता है)मैं ग्राफ के लिए एक ट्रेंडलाइन की गणना कैसे करूं?

उत्तर

14

यह देखते हुए कि ट्रेंडलाइन सीधे है की संख्या, किसी भी दो अंक के चयन और गणना के द्वारा ढलान लगता है:

(ए) ढलान = (वाई 1-वाई 2)/(x1-x2)

फिर आपको लाइन के लिए ऑफसेट ढूंढना होगा। लाइन समीकरण द्वारा निर्दिष्ट किया जाता है:

(बी) y = ऑफसेट + ढलान * x

तो तुम हल करने के लिए ऑफसेट के लिए की जरूरत है। लाइन पर किसी भी बिंदु चुनें, और के लिए हल ऑफसेट:

(सी) ऑफसेट = y/(ढलान * x)

अब आप ढलान प्लग और रेखा समीकरण (बी) में ऑफसेट कर सकते हैं और समीकरण है जो आपकी रेखा को परिभाषित करता है। यदि आपकी रेखा में शोर है तो आपको औसत औसत एल्गोरिदम पर निर्णय लेना होगा, या किसी प्रकार की वक्र फिटिंग का उपयोग करना होगा।

यदि आपकी लाइन सीधे नहीं है तो आपको Curve fitting, या Least Squares Fitting - गैर तुच्छ, लेकिन सक्षम करने की आवश्यकता होगी। यदि आप जानते हैं कि आप किस तरह के फिट करना चाहते हैं तो आपको कम से कम वर्गों के फिटनेस वेबपृष्ठ (घातीय, बहुपद, आदि) के नीचे विभिन्न प्रकार के वक्र फिटिंग दिखाई देंगे।

इसके अलावा, यदि यह एक-ऑफ है, तो एक्सेल का उपयोग करें।

-Adam

+28

को हटाने के लिए बी * एन/एन पसंद करता हूं, मैं काफी हद तक निश्चित हूं कि इससे एक फिट ट्रेंड-लाइन नहीं मिलेगी; (ए) में गणना की गई ढलान आपके द्वारा चुने गए "दो बिंदु" के आधार पर काफी भिन्न होगी। यह एक फिट प्रवृत्ति लाइन नहीं है। –

+2

[मुझे यह पसंद है जिसे मैंने पाया है] (http://math.stackexchange.com/questions/204020/what-is-the-equation-used-to-calculate-a-linear-trendline/204021#204021) – TecHunter

+1

@Jay इस प्रकार वाक्य, "यदि आपकी रेखा में शोर है तो आपको औसत औसत एल्गोरिदम पर निर्णय लेना होगा या किसी प्रकार की वक्र फिटिंग का उपयोग करना होगा।" –

25

ठीक है, यहाँ मेरी सबसे अच्छी छद्म गणना देखें:

अपनी लाइन के लिए समीकरण है:

वाई = एक + bx

कहाँ:

ख = (योग (एक्स * वाई) - योग (एक्स) राशि (y)/n)/(राशि (x^2) - योग (x)^2/n)

एक = राशि (वाई)/एन - बी (योग (एक्स)/एन)

,210

कहाँ राशि (xy) सभी एक्स * y आदि विशेष रूप से स्पष्ट नहीं मैं स्वीकार की राशि है, लेकिन यह जोड़ा सिग्मा

साथ अब सबसे अच्छा मैं एक सिग्मा प्रतीक :)

बिना क्या कर सकते हैं ... और

ख = (Σ (xy) - (Σ एक्स Σ वाई)/n)/(Σ (एक्स^2) - (Σ x)^2/n)

एक = (Σ वाई)/n - बी ((Σ एक्स)/एन)

जहां Σ (xy) सभी एक्स का योग y आदि है * और n अंक

+0

यह अगर मैं क्या n यह पता लगाने सकता है भारी सहायता कर होगा का प्रतिनिधित्व करता है। – Praesagus

+0

मैथ क्लास वापस आ रहा है - एन धुरी पर बिंदुओं की संख्या सही है? – Praesagus

+0

हां, एन आपके पास अंक की संख्या है। – blank

1

आप Excel की पहुंच है, तो सहायता के भीतर कार्य संदर्भ के "सांख्यिकीय कार्य" खंड में देखो। सीधी रेखा के लिए सबसे अच्छा फिट करने के लिए, आपको स्लोप्पी और इंटरसेप्ट की आवश्यकता है और समीकरण ठीक हैं।

ओह, लटकाओ, उन्हें यहां ऑनलाइन परिभाषित किया गया है: http://office.microsoft.com/en-us/excel/HP052092641033.aspx एसएलओपीई के लिए, और इंटरसेप्ट के लिए एक लिंक है। बेशक, यह मानता है कि एमएस पृष्ठ को स्थानांतरित नहीं करता है, इस मामले में "स्लोप इंटरसेप्ट इक्विटी एक्सेल साइट: microsoft.com" जैसे कुछ के लिए गूगलिंग आज़माएं - लिंक अभी तीसरे स्थान पर है।

31

आपकी मदद के लिए सभी के लिए धन्यवाद - मैं कुछ दिनों के लिए इस मुद्दे से बाहर था और बस इसे वापस आया - यह एक साथ कोड करने में सक्षम था - सबसे सुंदर कोड नहीं, लेकिन यह मेरे उद्देश्यों के लिए काम करता है - मैंने सोचा 'घ शेयर किसी और को इस मुद्दे का सामना करना पड़ता है, तो:

public class Statistics 
{ 
    public Trendline CalculateLinearRegression(int[] values) 
    { 
     var yAxisValues = new List<int>(); 
     var xAxisValues = new List<int>(); 

     for (int i = 0; i < values.Length; i++) 
     { 
      yAxisValues.Add(values[i]); 
      xAxisValues.Add(i + 1); 
     } 

     return new Trendline(yAxisValues, xAxisValues); 
    } 
} 

public class Trendline 
{ 
    private readonly IList<int> xAxisValues; 
    private readonly IList<int> yAxisValues; 
    private int count; 
    private int xAxisValuesSum; 
    private int xxSum; 
    private int xySum; 
    private int yAxisValuesSum; 

    public Trendline(IList<int> yAxisValues, IList<int> xAxisValues) 
    { 
     this.yAxisValues = yAxisValues; 
     this.xAxisValues = xAxisValues; 

     this.Initialize(); 
    } 

    public int Slope { get; private set; } 
    public int Intercept { get; private set; } 
    public int Start { get; private set; } 
    public int End { get; private set; } 

    private void Initialize() 
    { 
     this.count = this.yAxisValues.Count; 
     this.yAxisValuesSum = this.yAxisValues.Sum(); 
     this.xAxisValuesSum = this.xAxisValues.Sum(); 
     this.xxSum = 0; 
     this.xySum = 0; 

     for (int i = 0; i < this.count; i++) 
     { 
      this.xySum += (this.xAxisValues[i]*this.yAxisValues[i]); 
      this.xxSum += (this.xAxisValues[i]*this.xAxisValues[i]); 
     } 

     this.Slope = this.CalculateSlope(); 
     this.Intercept = this.CalculateIntercept(); 
     this.Start = this.CalculateStart(); 
     this.End = this.CalculateEnd(); 
    } 

    private int CalculateSlope() 
    { 
     try 
     { 
      return ((this.count*this.xySum) - (this.xAxisValuesSum*this.yAxisValuesSum))/((this.count*this.xxSum) - (this.xAxisValuesSum*this.xAxisValuesSum)); 
     } 
     catch (DivideByZeroException) 
     { 
      return 0; 
     } 
    } 

    private int CalculateIntercept() 
    { 
     return (this.yAxisValuesSum - (this.Slope*this.xAxisValuesSum))/this.count; 
    } 

    private int CalculateStart() 
    { 
     return (this.Slope*this.xAxisValues.First()) + this.Intercept; 
    } 

    private int CalculateEnd() 
    { 
     return (this.Slope*this.xAxisValues.Last()) + this.Intercept; 
    } 
} 
+2

Bedwyr Humphreys – TecHunter

+0

द्वारा प्रस्तावित समाधान पर विचार करें मेरा मानना ​​है कि यह मान रहा है कि डेटा सॉर्ट किया गया है ('xAxisVales.First()' और 'last()' का उपयोग करने के कारण) – Thymine

3

पिछले एक जवाब

(बी) y ऑफसेट = यदि + ढलान * x

तो (सी) ऑफसेट = y के बारे में/(ढलान * एक्स) गलत है

(सी) होना चाहिए:

ऑफसेट = y- (ढलान * x)

देखें: http://zedgraph.org/wiki/index.php?title=Trend

0

आप समाधान के लिए बहुत बहुत धन्यवाद, मैं था मेरे सिर खरोंच
यहां बताया गया है कि मैंने Excel में समाधान कैसे लागू किया।
मैंने एक्सेल में एमयूएचडी द्वारा दिए गए दो कार्यों का सफलतापूर्वक उपयोग किया:
ए = (योग (x * y) - योग (x) योग (y)/n)/(योग (x^2) - योग (x)^2/एन)
बी = योग (वाई)/एन - बी (योग (एक्स)/एन)
(सावधान मेरे ए और बी बी और एमयूएचडी समाधान में हैं)।

- 4 कॉलम बने, उदाहरण के लिए:
एनबी: मेरी मान y मूल्यों बी 3 में हैं: B17, तो मैं n है = 15;
मेरे एक्स मान 1,2,3,4 ... 15 हैं।
1. कॉलम बी: ज्ञात एक्स के
2. कॉलम सी: ज्ञात y के
3. स्तंभ D: गणना प्रवृत्ति लाइन
4. कॉलम E: बी मूल्यों * सी मूल्यों (ई 3 = बी 3 * सी 3, इ 4 = बी 4 * सी 4, ..., ई 17 = बी 17 * सी 17)
5. कॉलम एफ: एक्स वर्ग मूल्य
फिर मैं कॉलम बी, सी और ई कॉल करता हूं, रकम मेरे लिए लाइन 18 में जाती है, इसलिए मेरे पास बी 18 है एक्सएस, सी 18 के रूप में वाईएस के योग के रूप में, एक्स 18 एक्स के योग के रूप में, और एफ 18 वर्गों के योग के रूप में।
एक गणना करने के लिए, followin सूत्र (F35 मेरे लिए) किसी भी सेल में दर्ज करें:
F35 = (E18- (B18 * C18)/15)/(F18- (B18 * B18)/15)
गणना करने के लिए ख (मेरे लिए F36 में):
F36 = C18/15-F35 * (B18/15)
स्तंभ D मूल्यों, y = कुल्हाड़ी के अनुसार कंप्यूटिंग प्रवृत्ति लाइन + बी:
डी 3 = $ एफ $ 35 * बी 3 + $ एफ $ 36, डी 4 = $ एफ $ 35 * बी 4 + $ एफ $ 36 और इतने पर (मेरे लिए डी 17 तक)।

ग्राफ बनाने के लिए कॉलम डेटा (सी 2: डी 17) का चयन करें।
एचटीएच।

14

यहां Bedwyr Humphreys's answer का एक बहुत तेज़ (और अर्ध-गंदा) कार्यान्वयन है।इंटरफ़ेस @matt के उत्तर के साथ भी संगत होना चाहिए, लेकिन के बजाय decimal का उपयोग करता है और आशा करता है कि यह उपयोग करने और पढ़ने में आसान बनाने के लिए अधिक आईनेमेरेबल अवधारणाओं का उपयोग करता है।

Slopeb है, Intercept है a

public class Trendline 
{ 
    public Trendline(IList<decimal> yAxisValues, IList<decimal> xAxisValues) 
     : this(yAxisValues.Select((t, i) => new Tuple<decimal, decimal>(xAxisValues[i], t))) 
    { } 
    public Trendline(IEnumerable<Tuple<Decimal, Decimal>> data) 
    { 
     var cachedData = data.ToList(); 

     var n = cachedData.Count; 
     var sumX = cachedData.Sum(x => x.Item1); 
     var sumX2 = cachedData.Sum(x => x.Item1 * x.Item1); 
     var sumY = cachedData.Sum(x => x.Item2); 
     var sumXY = cachedData.Sum(x => x.Item1 * x.Item2); 

     //b = (sum(x*y) - sum(x)sum(y)/n) 
     // /(sum(x^2) - sum(x)^2/n) 
     Slope = (sumXY - ((sumX * sumY)/n)) 
        /(sumX2 - (sumX * sumX/n)); 

     //a = sum(y)/n - b(sum(x)/n) 
     Intercept = (sumY/n) - (Slope * (sumX/n)); 

     Start = GetYValue(cachedData.Min(a => a.Item1)); 
     End = GetYValue(cachedData.Max(a => a.Item1)); 
    } 

    public decimal Slope { get; private set; } 
    public decimal Intercept { get; private set; } 
    public decimal Start { get; private set; } 
    public decimal End { get; private set; } 

    public decimal GetYValue(decimal xValue) 
    { 
     return Intercept + Slope * xValue; 
    } 
} 
0

इस तरह मैं ढलान गणना की है: स्रोत: http://classroom.synonym.com/calculate-trendline-2709.html

class Program 
    { 
     public double CalculateTrendlineSlope(List<Point> graph) 
     { 
      int n = graph.Count; 
      double a = 0; 
      double b = 0; 
      double bx = 0; 
      double by = 0; 
      double c = 0; 
      double d = 0; 
      double slope = 0; 

      foreach (Point point in graph) 
      { 
       a += point.x * point.y; 
       bx = point.x; 
       by = point.y; 
       c += Math.Pow(point.x, 2); 
       d += point.x; 
      } 
      a *= n; 
      b = bx * by; 
      c *= n; 
      d = Math.Pow(d, 2); 

      slope = (a - b)/(c - d); 
      return slope; 
     } 
    } 

    class Point 
    { 
     public double x; 
     public double y; 
    } 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^