2013-07-11 7 views
11

मैं ऐसे एप्लिकेशन को विकसित करने की कोशिश कर रहा हूं जो एक्सेल करने वाली समान प्रवृत्ति लाइनों की गणना करेगी, लेकिन बड़े डेटासेट के लिए।ट्रेन्ड लाइनें (रिग्रेशन, वक्र फिटिंग) जावा लाइब्रेरी

enter image description here

लेकिन मैं किसी भी जावा पुस्तकालय है कि इस तरह प्रतिगमन की गणना करता है ढूँढने में सक्षम नहीं हूँ। Linera मॉडल के लिए मैं अपाचे कॉमन्स गणित का उपयोग कर रहा है, और अन्य के लिए माइकल थॉमस फ्लानागन से एक महान संख्यात्मक पुस्तकालय था लेकिन जनवरी के बाद से यह अब उपलब्ध है:

http://www.ee.ucl.ac.uk/~mflanaga/java/

आप किसी भी अन्य पुस्तकालयों जानते हो जावा में इन प्रतिगमनों की गणना करने के लिए कोड भंडार। बेस्ट,

+0

क्यों ना आप अपना रोल आउट नहीं? कम से कम गणित कोड के लिए sorta आसान है, है ना? IOW 'आपने क्या प्रयास किया है?' – Shark

उत्तर

30

चूंकि वे सभी रैखिक फिट पर आधारित हैं, OLSMultipleLinearRegression आपको रैखिक, बहुपद, घातीय, लॉगरिदमिक और पावर ट्रेंड लाइनों की आवश्यकता है।

आपका प्रश्न मुझे एक बहाना डाउनलोड करने और कॉमन्स गणित प्रतिगमन उपकरणों के साथ खेलने के लिए दे दी है, और मैं एक साथ कुछ प्रवृत्ति लाइन उपकरण डाल:

एक इंटरफेस:

public interface TrendLine { 
    public void setValues(double[] y, double[] x); // y ~ f(x) 
    public double predict(double x); // get a predicted y for a given x 
} 

regression- के लिए एक सार वर्ग आधारित ट्रेंडलाइनें:

public abstract class OLSTrendLine implements TrendLine { 

    RealMatrix coef = null; // will hold prediction coefs once we get values 

    protected abstract double[] xVector(double x); // create vector of values from x 
    protected abstract boolean logY(); // set true to predict log of y (note: y must be positive) 

    @Override 
    public void setValues(double[] y, double[] x) { 
     if (x.length != y.length) { 
      throw new IllegalArgumentException(String.format("The numbers of y and x values must be equal (%d != %d)",y.length,x.length)); 
     } 
     double[][] xData = new double[x.length][]; 
     for (int i = 0; i < x.length; i++) { 
      // the implementation determines how to produce a vector of predictors from a single x 
      xData[i] = xVector(x[i]); 
     } 
     if(logY()) { // in some models we are predicting ln y, so we replace each y with ln y 
      y = Arrays.copyOf(y, y.length); // user might not be finished with the array we were given 
      for (int i = 0; i < x.length; i++) { 
       y[i] = Math.log(y[i]); 
      } 
     } 
     OLSMultipleLinearRegression ols = new OLSMultipleLinearRegression(); 
     ols.setNoIntercept(true); // let the implementation include a constant in xVector if desired 
     ols.newSampleData(y, xData); // provide the data to the model 
     coef = MatrixUtils.createColumnRealMatrix(ols.estimateRegressionParameters()); // get our coefs 
    } 

    @Override 
    public double predict(double x) { 
     double yhat = coef.preMultiply(xVector(x))[0]; // apply coefs to xVector 
     if (logY()) yhat = (Math.exp(yhat)); // if we predicted ln y, we still need to get y 
     return yhat; 
    } 
} 

बहुपद या रैखिक मॉडल के लिए एक कार्यान्वयन:

(। रैखिक मॉडल के लिए, बस जब निर्माता बुला 1 डिग्री सेट)

public class PolyTrendLine extends OLSTrendLine { 
    final int degree; 
    public PolyTrendLine(int degree) { 
     if (degree < 0) throw new IllegalArgumentException("The degree of the polynomial must not be negative"); 
     this.degree = degree; 
    } 
    protected double[] xVector(double x) { // {1, x, x*x, x*x*x, ...} 
     double[] poly = new double[degree+1]; 
     double xi=1; 
     for(int i=0; i<=degree; i++) { 
      poly[i]=xi; 
      xi*=x; 
     } 
     return poly; 
    } 
    @Override 
    protected boolean logY() {return false;} 
} 

घातीय और बिजली के मॉडल और भी आसान कर रहे हैं:

(ध्यान दें: हम अब लॉग y की भविष्यवाणी कर रहे हैं - वह महत्वपूर्ण है। इन दोनों सकारात्मक y के लिए ही उपयुक्त) कर रहे हैं

public class ExpTrendLine extends OLSTrendLine { 
    @Override 
    protected double[] xVector(double x) { 
     return new double[]{1,x}; 
    } 

    @Override 
    protected boolean logY() {return true;} 
} 

और

public class PowerTrendLine extends OLSTrendLine { 
    @Override 
    protected double[] xVector(double x) { 
     return new double[]{1,Math.log(x)}; 
    } 

    @Override 
    protected boolean logY() {return true;} 

} 

और एक लॉग मॉडल:

(जो एक्स के लॉग लगता है लेकिन भविष्यवाणी y, एल.एन. नहीं वाई)

public class LogTrendLine extends OLSTrendLine { 
    @Override 
    protected double[] xVector(double x) { 
     return new double[]{1,Math.log(x)}; 
    } 

    @Override 
    protected boolean logY() {return false;} 
} 

और तुम इस तरह इसका इस्तेमाल कर सकते हैं:

public static void main(String[] args) { 
    TrendLine t = new PolyTrendLine(2); 
    Random rand = new Random(); 
    double[] x = new double[1000*1000]; 
    double[] err = new double[x.length]; 
    double[] y = new double[x.length]; 
    for (int i=0; i<x.length; i++) { x[i] = 1000*rand.nextDouble(); } 
    for (int i=0; i<x.length; i++) { err[i] = 100*rand.nextGaussian(); } 
    for (int i=0; i<x.length; i++) { y[i] = x[i]*x[i]+err[i]; } // quadratic model 
    t.setValues(y,x); 
    System.out.println(t.predict(12)); // when x=12, y should be... , eg 143.61380202745192 
} 

जब से तुम सिर्फ रुझान रेखाओं चाहता था, मैं OLS मॉडल को खारिज कर दिया, जब मैं उन लोगों के साथ किया गया था, लेकिन आप फिट की अच्छाई पर कुछ डेटा रखने के लिए आदि

चलती औसत का उपयोग कार्यान्वयन के लिए, आगे बढ़ चाहते हो सकता है औसत, आदि, ऐसा लगता है कि आप कॉमन्स गणित के साथ रह सकते हैं। DescriptiveStatistics आज़माएं और एक विंडो निर्दिष्ट करें। आप किसी अन्य उत्तर में सुझाए गए इंटरपोलेशन का उपयोग करके कुछ चिकनाई करना चाह सकते हैं।

+0

ओह - बिजली और विस्तार विधियों को स्विच किया। अब तय एक लॉगरिदमिक मॉडल भी जोड़ा। – maybeWeCouldStealAVan

+0

मैंने आपके कोड को अच्छा करने की कोशिश की है, लेकिन मैं सिर्फ यह जानना चाहता था कि एक बार ट्रेंड लाइन कैसे खींचना है यदि मुझे वाई की सरणी मिलती है। एक और बात यह है कि, यह केवल y = x2 + const समीकरण के लिए काम कर रहा है या मैं पीछा करने में सक्षम हूं यह मेरे समीकरण में वाई = 4x2 + 3x + 6.4 कहता है। –

+0

हां, 'पॉलीट्रेन्डलाइन (2)' के साथ बनाई गई 'ट्रेंडलाइन' 'y = b0 + b1 * x + b2 * x^2' के लिए गुणांक का अनुमान लगाएगी। बारीकी से 'xVector' देखें और आप देखेंगे कि यह x^0, x^1, ... x^k का उपयोग करता है जो के-डिग्री रिग्रेशन के लिए अनुमानक है। मुख्य रूप से कॉल करके – maybeWeCouldStealAVan

3

आप विभिन्न प्रकार के interpolatorsorg.apache.commons.math3.analysis.interpolation में उपलब्ध करा सकते हैं, उदाहरण के लिए, लीनियरइंटरपोलेटर, लोएसइंटरपोलेटर और नेविलइंटरपोलेटर।

2

क्या हो सकता है इसके अलावा क्या होउडॉल्डस्टेलएवा ने कहा;

कॉमन्स-मैथ 3 लाइब्रेरी maven repository में भी उपलब्ध है।

वर्तमान संस्करण 3.2 है और निर्भरता टैग है:

<dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-math3</artifactId> 
     <version>3.2</version> 
    </dependency> 
संबंधित मुद्दे