2016-12-10 9 views
2

サイファーの線形回帰R-二乗係数はどのようにして求めることができますか?Cypherの線形回帰関数

Oracle Databaseで定義されているように私は、サイファーの等価線形回帰関数をしたい:

REGR_R2(column_y, column_x) 

答えて

4

あなたがあなた自身のJava procedures in Neo4jを書いて、サイファーからそれらを呼び出すことができます。

回帰関数については、ApacheのコモンSimpleRegressionクラスを使用できます。

次のコードは、regrという名前のプロシージャを作成し、与えられたXプロパティとYプロパティの基本回帰値を返します。ところでregr('MY_LABEL', 'Y', 'X')

public class Regression { 
@Context public GraphDatabaseService db; 

// Result class 
public static class Output { 
    public double r2; 
    public double avg_x; 
    public double avg_y; 
    public double slope; 
    public Output(double r2, double avg_x, double avg_y, double slope){ 
     this.r2 = r2; 
     this.avg_x = avg_x; 
     this.avg_y = avg_y; 
     this.slope = slope; 
    } 
} 

@Procedure("regr") 
public Stream<Output> regr(@Name("label") String label, 
          @Name("property_y") String y, @Name("property_x") String x) { 

    SimpleRegression regr = new SimpleRegression(false); 
    double regr_avgx = 0; 
    double regr_avgy = 0; 
    int count = 0; 

    try (ResourceIterator it = db.findNodes(Label.label(label))) { 
     while (it.hasNext()) { 
      Node node = (Node)it.next(); 
      if(node.hasProperty(x) && node.hasProperty(y)) 
      { 
       Object prop_x = node.getProperty(x); 
       Object prop_y = node.getProperty(y); 

       regr_avgx += (double) ((Long)prop_x); 
       regr_avgy += (double) ((Long)prop_y); 
       regr.addData((double) ((Long)prop_x), (double) ((Long)prop_y)); 
       count++; 
      } 
     } 
    } 
    regr_avgx /= count; 
    regr_avgy /= count; 
    return Stream.of(new Output(regr.getRSquare(), regr_avgx, regr_avgy, regr.getSlope())); 
} 
} 
+1

あなたはとサイファーからこのプロシージャを呼び出すことができます。あなたはボン、ドイツの両方にいるようです:) –