From 99fd7310629e64ac1f0b2c959fe8871e78dfb1e9 Mon Sep 17 00:00:00 2001 From: Eilert Tunheim <emtunhei@stud.ntnu.no> Date: Wed, 27 Apr 2022 14:24:57 +0200 Subject: [PATCH] Started working on logistic regression, wrong formula --- Bachelor_application.iml | 33 +------------- pom.xml | 6 +-- src/main/java/com/application/DB/DB.java | 5 ++ .../GUI/LineChartFunctionality.java | 43 +++++++++++++++--- target/classes/com/application/DB/DB.class | Bin 15680 -> 14919 bytes .../GUI/LineChartFunctionality.class | Bin 9379 -> 10007 bytes 6 files changed, 46 insertions(+), 41 deletions(-) diff --git a/Bachelor_application.iml b/Bachelor_application.iml index e44eb08..f8154df 100644 --- a/Bachelor_application.iml +++ b/Bachelor_application.iml @@ -54,37 +54,6 @@ <orderEntry type="library" name="Maven: com.google.auto.value:auto-value-annotations:1.9" level="project" /> <orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" /> <orderEntry type="library" name="Maven: joda-time:joda-time:2.10.14" level="project" /> - <orderEntry type="library" name="Maven: org.python:jython-slim:2.7.2" level="project" /> - <orderEntry type="library" name="Maven: org.antlr:antlr:3.5.2" level="project" /> - <orderEntry type="library" name="Maven: org.antlr:ST4:4.0.8" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: javax.servlet:javax.servlet-api:3.1.0" level="project" /> - <orderEntry type="library" name="Maven: org.antlr:antlr-runtime:3.5.2" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.commons:commons-compress:1.19" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.62" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: org.bouncycastle:bcprov-jdk15on:1.62" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: org.ow2.asm:asm:7.1" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: org.ow2.asm:asm-commons:7.1" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: org.ow2.asm:asm-tree:7.1" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: org.ow2.asm:asm-analysis:7.1" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: org.ow2.asm:asm-util:7.1" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: com.ibm.icu:icu4j:59.1" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: com.carrotsearch:java-sizeof:0.0.5" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: com.github.jnr:jffi:1.2.20" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: com.github.jnr:jnr-netdb:1.1.6" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: com.github.jnr:jnr-ffi:2.1.10" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: com.github.jnr:jffi:native:1.2.19" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: com.github.jnr:jnr-a64asm:1.0.0" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: com.github.jnr:jnr-x86asm:1.0.2" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: com.github.jnr:jnr-posix:3.0.50" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: com.github.jnr:jnr-constants:0.9.12" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: jline:jline:2.14.5" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: io.netty:netty-buffer:4.1.45.Final" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: io.netty:netty-codec:4.1.45.Final" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: io.netty:netty-common:4.1.45.Final" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: io.netty:netty-handler:4.1.45.Final" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: io.netty:netty-resolver:4.1.45.Final" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: io.netty:netty-transport:4.1.45.Final" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.ant:ant:1.9.7" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.ant:ant-launcher:1.9.7" level="project" /> + <orderEntry type="library" name="Maven: org.jblas:jblas:1.2.4" level="project" /> </component> </module> \ No newline at end of file diff --git a/pom.xml b/pom.xml index 6c3d1d1..221d396 100644 --- a/pom.xml +++ b/pom.xml @@ -41,9 +41,9 @@ <version>2.10.14</version> </dependency> <dependency> - <groupId>org.python</groupId> - <artifactId>jython-slim</artifactId> - <version>2.7.2</version> + <groupId>org.jblas</groupId> + <artifactId>jblas</artifactId> + <version>1.2.4</version> </dependency> </dependencies> diff --git a/src/main/java/com/application/DB/DB.java b/src/main/java/com/application/DB/DB.java index 6b14b56..53f8621 100644 --- a/src/main/java/com/application/DB/DB.java +++ b/src/main/java/com/application/DB/DB.java @@ -511,6 +511,7 @@ public class DB { formatedUtTidTorkPlussDays = addedDays.plusDays(ARJANG_NR_ADDED_DAYS).toString(); formatedUtTidTorkPlussDays = formatedUtTidTorkPlussDays.split("T")[0]; + /* if (locationID == ARJANG_LOCATION_ID) { // Sqlstatement @@ -543,8 +544,12 @@ public class DB { if(!moistureMeasured.isEmpty()){ manMoistData.put(formatedUtTidTork,moistureMeasured); } + + } + */ + diff --git a/src/main/java/com/application/GUI/LineChartFunctionality.java b/src/main/java/com/application/GUI/LineChartFunctionality.java index 0bc011d..b2d0807 100644 --- a/src/main/java/com/application/GUI/LineChartFunctionality.java +++ b/src/main/java/com/application/GUI/LineChartFunctionality.java @@ -9,7 +9,6 @@ import org.apache.commons.math3.distribution.TDistribution; import org.apache.commons.math3.exception.MathIllegalArgumentException; import org.apache.commons.math3.stat.descriptive.SummaryStatistics; import org.apache.commons.math3.stat.regression.SimpleRegression; -import org.python.util.PythonInterpreter; import java.util.*; @@ -117,7 +116,7 @@ public class LineChartFunctionality { index++; } //allSeries.add(newSeries); - updateLineChart(newSeries); + //updateLineChart(newSeries); //lineChart.setOpacity(1); } @@ -126,6 +125,8 @@ public class LineChartFunctionality { // Stores the data from the confidence interval in a new map Map<Integer, ArrayList<Double>> confidenceIntervalData = statistics(multiMap); + //getNonLinearRegression(confidenceIntervalData); + // Checks the max size for the arraylists needed for the data array later int jMaxSize = 0; for (int i = 0; i < confidenceIntervalData.size(); i++) { @@ -181,13 +182,12 @@ public class LineChartFunctionality { for (double[] datum : data) { + //System.out.println(""); for (double v : datum) { //System.out.println("Data: "+v); } } - PythonInterpreter pythonInterpreter = new PythonInterpreter(); - //pythonInterpreter @@ -196,9 +196,10 @@ public class LineChartFunctionality { // Connect the data to a series //System.out.println(simpleRegression.predict(i)); - regressionSeries.getData().add(new XYChart.Data<String, Number>(String.valueOf(i), simpleRegression.predict(i))); + //regressionSeries.getData().add(new XYChart.Data<String, Number>(String.valueOf(i), simpleRegression.predict(i))); + regressionSeries.getData().add(new XYChart.Data<String, Number>(String.valueOf(i), getNonLinearRegression(confidenceIntervalData,simpleRegression.getIntercept(),simpleRegression.getSlope(),i))); } - //updateLineChart(regressionSeries); + updateLineChart(regressionSeries); //lineChart.setOpacity(1); @@ -219,6 +220,36 @@ public class LineChartFunctionality { //simpleRegression.add + + return getLineChart(); } + + + public static double getNonLinearRegression(Map<Integer, ArrayList<Double>> confidenceIntervalData, double slope, double intercept, double j) { + //return Math.exp(intercept+slope*i)/(1+Math.exp(intercept+slope*i)); + + + double alpha = intercept/100; + double beta = alpha/(slope/100); + double maxYValue = 0.0; + double n = confidenceIntervalData.size(); + for (Map.Entry<Integer, ArrayList<Double>> entry : confidenceIntervalData.entrySet()) { + for (int i = 0; i < entry.getValue().size(); i++) { + if(maxYValue < entry.getValue().get(i)){ + maxYValue = entry.getValue().get(i); + } + } + } + //System.out.println("maxYValue: " + maxYValue); + //System.out.println("j*n: "+j/n); + + double p_t = ((beta*maxYValue)/(maxYValue+((beta-maxYValue)*Math.exp(-alpha*(j))))); + + System.out.println("---------------------------"); + System.out.println(p_t); + + return p_t; + + } } diff --git a/target/classes/com/application/DB/DB.class b/target/classes/com/application/DB/DB.class index dc3e7ef07457159c4cffad723fd086a463c4bef4..9d33fb5ed445c83a81f92756eb4ca1881531e601 100644 GIT binary patch delta 3961 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 delta 4761 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 B6|(>U diff --git a/target/classes/com/application/GUI/LineChartFunctionality.class b/target/classes/com/application/GUI/LineChartFunctionality.class index 5a32389b113ac7d683fcb180754a030be228f01d..074d021597c64fa7a2a3e9ef449d69717f744a45 100644 GIT binary patch delta 4047 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 delta 3478 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 -- GitLab