From 657d8e47e5c763d72cf962504548d99b90e7135f Mon Sep 17 00:00:00 2001 From: Eilert Tunheim <emtunhei@stud.ntnu.no> Date: Wed, 4 May 2022 11:21:53 +0200 Subject: [PATCH] non-functioning-cubic-regression --- Bachelor_application.iml | 1 + pom.xml | 6 ++ .../GUI/LineChartFunctionality.java | 100 +++++++++++++++++- .../com.application/GUI/graphStyles.css | 2 +- .../com.application/GUI/graphStyles.css | 2 +- .../GUI/LineChartFunctionality.class | Bin 13662 -> 15003 bytes 6 files changed, 108 insertions(+), 3 deletions(-) diff --git a/Bachelor_application.iml b/Bachelor_application.iml index 06a8fa9..f8154df 100644 --- a/Bachelor_application.iml +++ b/Bachelor_application.iml @@ -54,5 +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.jblas:jblas:1.2.4" level="project" /> </component> </module> \ No newline at end of file diff --git a/pom.xml b/pom.xml index 51648b1..e6c3063 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,12 @@ <artifactId>joda-time</artifactId> <version>2.10.14</version> </dependency> + <dependency> + <groupId>org.jblas</groupId> + <artifactId>jblas</artifactId> + <version>1.2.4</version> + </dependency> + </dependencies> <properties> diff --git a/src/main/java/com/application/GUI/LineChartFunctionality.java b/src/main/java/com/application/GUI/LineChartFunctionality.java index a72f2b9..e68a03d 100644 --- a/src/main/java/com/application/GUI/LineChartFunctionality.java +++ b/src/main/java/com/application/GUI/LineChartFunctionality.java @@ -11,10 +11,11 @@ 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.jblas.DoubleMatrix; +import org.jblas.Solve; import java.util.*; -import static com.application.DB.Constants.ADJUST_REGRESSION; import static com.application.DB.Constants.CONFIDENCE_INTERVAL; public class LineChartFunctionality { @@ -258,6 +259,7 @@ 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), getNonLinearRegression( @@ -270,6 +272,12 @@ public class LineChartFunctionality { i, getDataPointsXAxis() ))); + + */ + regressionSeries.getData().add(new XYChart.Data<String, Number>( + String.valueOf(i), + getCubicNonLinearRegression(confidenceIntervalData,i) + )); } updateLineChart(regressionSeries); //lineChart.setOpacity(1); @@ -378,10 +386,100 @@ public class LineChartFunctionality { System.out.println("Beta: " + beta); //System.out.println(p_t); + + return p_t; } + + /** + * Third degree cubic non-linear regression + * + * n = + * + * sumT1 = + * sumT2 = + * sumT3 = + * sumT4 = + * + * sumY = + * sumYxT1= + * sumYxT2 = + * @param confidenceIntervalData Data to process + * @return + */ + public static double getCubicNonLinearRegression(Map<Integer, ArrayList<Double>> confidenceIntervalData, int index){ + + double n = confidenceIntervalData.size(); + //double n = getDataPointsYAxis(); + //System.out.println(n); + + double sumT1 = 0; + double sumT2 = 0; + double sumT3 = 0; + double sumT4 = 0; + + double sumY = 0; + double sumYxT1 = 0; + double sumYxT2 = 0; + + + + for (Map.Entry<Integer, ArrayList<Double>> entry : confidenceIntervalData.entrySet()) { + + sumT1 += entry.getKey(); + sumT2 += Math.pow(entry.getKey(),2); + sumT3 += Math.pow(entry.getKey(),3); + sumT4 += Math.pow(entry.getKey(),4); + + for (int j = 0; j < entry.getValue().size(); j++) { + + sumY += entry.getValue().get(j); + sumYxT1 += entry.getValue().get(j) * entry.getKey(); + sumYxT2 += entry.getValue().get(j) * Math.pow(entry.getKey(), 2); + } + } + + + + +/* + for (Map.Entry<Integer, ArrayList<Double>> entry : confidenceIntervalData.entrySet()) { + + + + for (int j = 0; j < entry.getValue().size(); j++) { + + sumT1 += Math.pow(entry.getValue().get(j), 1); + sumT2 += Math.pow(entry.getValue().get(j), 2); + sumT3 += Math.pow(entry.getValue().get(j), 3); + sumT4 += Math.pow(entry.getValue().get(j), 4); + + sumY += entry.getKey(); + sumYxT1 += entry.getKey() * entry.getValue().get(j); + sumYxT2 += entry.getKey() * Math.pow(entry.getValue().get(j), 2); + } + } + + */ + + + + DoubleMatrix firstMatrix = new DoubleMatrix(new double[][]{{n,sumT1,sumT2},{sumT1,sumT2,sumT3},{sumT2,sumT3,sumT4}}); + DoubleMatrix secondMatrix = new DoubleMatrix( new double[]{sumY, sumYxT1, sumYxT2}); + + + DoubleMatrix solvedMatrix = Solve.solve(firstMatrix,secondMatrix); + + //System.out.println(solvedMatrix); + + //return ((solvedMatrix.get(0)) + (solvedMatrix.get(1) * index) + (solvedMatrix.get(2) * Math.pow(index, 2))); + //return ((solvedMatrix.get(1) * index) + (solvedMatrix.get(2) * Math.pow(index, 2)))*(-1); + return ((solvedMatrix.get(1) * index) + (solvedMatrix.get(2) * Math.pow(index, 2))); + + } + public static int getDataPointsXAxis() { return dataPointsXAxis; } diff --git a/src/main/resources/com.application/GUI/graphStyles.css b/src/main/resources/com.application/GUI/graphStyles.css index 7cff0ac..fbc50cd 100644 --- a/src/main/resources/com.application/GUI/graphStyles.css +++ b/src/main/resources/com.application/GUI/graphStyles.css @@ -5,7 +5,7 @@ } .chart-earlier-data-line { - -fx-stroke-width: 5px; + -fx-stroke-width: 1px; -fx-effect: null; } diff --git a/target/classes/com.application/GUI/graphStyles.css b/target/classes/com.application/GUI/graphStyles.css index 7cff0ac..fbc50cd 100644 --- a/target/classes/com.application/GUI/graphStyles.css +++ b/target/classes/com.application/GUI/graphStyles.css @@ -5,7 +5,7 @@ } .chart-earlier-data-line { - -fx-stroke-width: 5px; + -fx-stroke-width: 1px; -fx-effect: null; } diff --git a/target/classes/com/application/GUI/LineChartFunctionality.class b/target/classes/com/application/GUI/LineChartFunctionality.class index fc06715ba9dfd5d758264f91fd1228deb018f988..7fed56545a4d3c4f04d50dafc1845a293cbaba83 100644 GIT binary patch delta 6511 zcmcbYHM_L_)W2Q(7#J8#n8Mi^9k>`Q86DXfowyj7867zpq!^vq8C|#-*dQENc1AZY z22MtIkc<ZhqbEq27l`oYVDteg^8yjx9E`poWqu&SpPMm&F_4SFmobQgF_?=ngfSE( z9LCNV&cPVL#aJK77{$dH%@_kx7t77y!x+cS7|)o%&6voT1R|2z8B;hJQyJ6P8PmBK zR2dyP7&Ab0CWy!a5!qafIgGjNjCouPI*g9o49bl8?2H9m4El@-?2Lt642FzFAemw| z`*&$zz{McNSOO9%<zTEYV`nS}sj1*%tYoYbVqjow0BLPxXKVr~Y35?EV{Bn_V1NJ+ zuN5TT#>Lpq*ul=&$yWaZCMCt##m?Bx#oz@B!yb0VK9IK^L1CKB!PpNne*(y+iChe` z7$*raFfvZ#W~ldJoDTB!43MSZaPntooC#7pn~NcmaSlk>5u{))hy^C*fw=QQo?Za* z$wCgsMWA3<42qQ{9E?jj7?*J{E(h^ea4@c9XJiH`UB%A0nu{Tq(Gf(f0ZFa}X<k<k zBG-e64IGRcL6Vz5hHd6x+ydfk<zU<fqPKG}?f}uvAjzE^jJwzz92>y?28r(GVB7<u z_i`}q1JV0I<{bbL2SLOkcE-b844sTc9E?Y}7>_a@<6t}v3ceE@j3>i57*BC9p5|aY z19IhAknlM+2M(~&3~UYp5C$kx&$BaL0EOH|cE(HW3_rLS<}h9c5m&evuQFZ(v95!> zbpsT{H#bjal4j+)#m<<*&X~u@FlX{XUg^m(Ji?Q8*cCRjaac1lc5Zg!jAoVvMH4$? z0XySrMg}g|isaOSlFa<PVs^&cj12Rky6iWL^R8s9mrhSDaV|~DO!mvq^U2IhO)LsZ zO)p9<F3!x)V`LE4@X1OnOVlqd$;{FBO)RkX)O2BFU@b1q4Kak$Mo`)qN}Dh;uoRc( zMlv$6gQyCSLMY3Kk%2ocv#7YlH?gEBvx1R9!p9=NC|y4*DJQX5-zC2^DJK;oWzERI zQ=FQdpO*sRgSh!QWvOs(Ak-INzcYGn-orPIk!?G}4n_v~$ro9LC!b~J;oxCd%dn1- zK^7#y?^l|elv?Ciky*^cu%2PV<b?u?S=$-!@GvZ4Sjx!2?UGoMs1T5!nO9QG!+4kR z9uMPv#s`cH%--c0j0^%UMU|O(=?Vcw`N^rp#i_+Sj1NId9x*;<XMDoL_>}P(594#j z7mN&CDTyVC?nQ|O8O7|3FL@YWft0;wd^}l4FiiIi593?LckGPsc^E%1e&k{N#IS>h z@iXHWcE+zfjNcf)voqe}Vf?}PlZWva<L}Aq1tr-2@G$;m{5Scmpqj*gCI%kH|4fWL zOiYX)*_oJmm{=I^F)~<B-pC<2xt>Fbm4}Iy@%LnJAuVAhHYRo+CJrV}9){ZtcX*h% znAj(G2w7S&aWnC-Gx72;@iFl;G6*>3=a&?h6eSk;rj}&nrxf$EF$oATKI3O&5)@z( z;$aeI65(MIWfEg#FrK`T!&sh&Nt{W7hhaMtCl8Y(lN1k=G!r{JlMD}&ERz%?gFV<G z0-S2BJPgMec1)fqtjfwH$H<^K`68>LJ|hF8Ef14ClL8NuB9jsi6E~Bx0Fw$o8<VO4 zqd5<g8k0H?lLnI}50e&?3M2}pCu@rE*fMc5X@jiP;bGEc)CWoH@i6H#8SpT%Fd6bN z9A`Me$iNqzS(U1gpQezLSzKbJ0171|9)^t!n<f{D7|LyC*u=;n42s?YaO^5X>LylX z7F#KR0#I!7K@mG=V<r<Gh7}B}c^D2d9O7ZrW7OwiRA5wOWMFqsEl~&pDK%wc2bpWe z$RGd`OHVBc3N9>7EJ_7QnlrIa_7PPQvS4C|>hXg(!*X(isA#<vD0ny>a|$vN6%}k1 zc$lm~>Uc8qN>YnJITI{q1F}GrQH+OSAH#kgMiWLMMg{?J*2_uEOV@{_UPcBcg$#Bk zTOKAmP~5X9<YwmaFxi95m)6AvCi9EQ@-eZ1V$Ffck%!5N@%Q9HX%TxKCTB){Mg}qL z84wicCLqFvoynDl$&JY!6!;!I3|kns@-TTad2Kcod&SJ-&E&(yAjRa%$RMgQ`98nc zW=AO_Miwy*PtD1JJi?RbN$WEDZ9XGi#yHtmwv3Y_J+&k_C%+(d@<CaLdgg-saz+ML z4Hp+snZlNyTH>8r$;iNwnO72)m{Xbxl8biH3}a;AN4PN<R0@Df8VK#B;e(JvDL`<E zYr-U~F^e1)4RG<so}8askXQtEfQyT!Cp(ir4^seBFb|^@qcsns8Ke1RWjRyE(8-Z< zw^+g$8B`}PkQ1NmCvOwEgkdQIBf~NV1_maE<qTY)L<Q%sVc-IlM+^)MT%ZC7OmAe^ z1g1Ab=`9Rf;p(?B2r)1+Y-iZPz{s$3@?-gg`dthR3|b6a3=9kk3@i+a415eq3=#~= z3>pk73<eCU4CV}K4E7A_3~me>41Nrn47(W^7<d>M85kJ+8TK&jWnf_71f?zpCWf61 z3=A@083qQHO$^){7#J8B89?T<fkkzpemKCu3Ca@?9g`0!*!Y6f2r;lQFfbT0@G=-N zh%p#5=rEWd*`>>Hm|-;o1H%!x?I4jg3=B{+k1}wA3J9>TycK07K_+rBFflMNm@{xQ zSTJybay7`t$&HHFz<xGk;ALQ7uw{^EaA2@taAI&^aArtnaAC-0aAhc9@M5TB@L_0T z@MY*`@MBoT5Xf+VA(-JXLkQSS9t`XZ=?rWPCmBvLurfF>G%%cIIK#lqP|4uVaF*c| z0}DeFgB`;;hEoh|4BZT-4Cfh6F>o-*Gc07dz;KCyDT0B4;V8pphOJN!i7_xiC9i;; z43fLbz`$^gfq_Aaf#nYa4?Dy4e+-W73^&*rZn866|HYvAgCPj&^;-;Fpb{DEbv<QY zu;;`WSQ!`?q8RuYVi@EY;u!Q9;u#DW62Oi(VPIw8XHa0c%W#i@nL&<0kl{Yq$p#E8 z3=bF{GBAUhxL^-~8WbiBj~GrdFoNB}#=w}*&hVIlli>-&QwC;Gg!5Q2urY`;FtF9` zVDQ|{;1#)j^DpJwEE-ypeA^fzb~8jqit_JZh?3+4QN=qLthO^m?_>~VVhC^HXI%dO z%4B}c<!&Y07&Ih#w=tA%V<_9kptX%bdlQ4oZU)uJ?F?!{<xt5AY?75w$*OG(Ws~n~ z%GB3l=&u7S5n-s`#?Xk(h$gW7Hil+wk}XilR=6bd4u-ZJ4DFz_%>qi>jOQ4N85kJS z7?>F{8Mx~ivKh1(au`e*@)+zG@);Z%3K)_YiWo8(iW!O+N*F2_N*P)hsu-p+R5Pq( zsAD+9P|t9bp@HE9Lkq)chHi$l3_T228G0G+G4wG!XXt16z%YT~AHzgOK88t*(hQRs zRT!o)YB5Y>G-jB=XvZ*<F`QuzV=TiY#$<*GjF}7z80#w-7BWs_SjM=RVL9VQhLwyv z8CEeKWLU#^f?+M=d4~0j*BLf4eq-3o_={l+lN`fVCR>JWOhF9WnJO7}FimIJ#x$2< z7t;cU-Ap?e_A*^&*w1vG;Q-TbhJ(yf42PKY84fdtF&tqoVK~HG#c+(dmf<+_RECqx z8yL<qZ)3Q`yp!Q_J@W~ME6n#9t}=gSxXk>M;Wi5w!(A3$hWjis3=dg!86LA(F+5>$ zVR*_C!SIYFn&B}^BEx-_bcWX~1q|<4Dj7boG%$Q&nZ@vpWf#L2mIDlbSWYqgWx2q} zz;ct3k>v@aD9d|BF_v$P;w=9eMOj%H8Ckg*rC0?R<ynmx6<KW<>y=pT8I@Tx7*$#G z8P!-D7&TdEGHS8TVbo@w~gi)V$Iim^d5k^zihm2;d{}?UUq#3Q*tQqatA{g!2 zN*SHmDj8it*@ST!gBC+3Lkz<+hUW~N3`GpV3@;d7GH@|eF!(aOVtCHL&CtT&$ncus z4FeBD5<@b>TZVTG9Q6#Q43in&Gi+sGVX$N9V)($Ynt_$Uk)fU8Bf};JHU=$*c?_Qz zE-^4O3Ni#Sd}i3hz{$wR5X$g{;VT0N!)JyvhHng;7}%K{7-GRJZYDW~dT^n^#ViXK z`wbV{!(a<h$6~->$ncq=eiH*fi!Or+*g!rO0fum}G%w361_g%i3_lnIS?)0CgT?q+ z^BHu(z7t_>V2}a(M3gmy!369RVOAT446ySBS&bPA!HyOHWpjp~;9`rLtq5FzF*2NG z-N5jRVG{!r!&TN5^$fomzA`W~++&^3@Q2|m0}I1*)@clX8MZR8GJIg|W%$Rim4S`% z1j|;2{|s9h*cs2WtYc(g*vi1cyp8ENBO}9B22SRkOh*`*7&b9*v2ZaJGrVVHX5ePw zWhwxNAP-9=6AL2?BP#<h%T2~5jBE_68Ti1J0;poMW2grO`5FdRNI)~PGcZGfmyv^k z0~(Z97`T`q0eFRh3ldh091MI=|E^(x`j?TN0qS2yP6h@Bh<~p#FoJx^@SBkX=1E2l zxF@eNu+~F;c@^%<t8ialh5Pa<11Hq=YZ&-IB`ae-gYsVnadt*7c82T!8O#|tKuj<X zROT~su`_ZrvNK#~VEE5a!N3fcWMKHk!1SL%9j2bKo}G~gjJVhtxfmH3{xZn2Gx9J> z82w~m{l&ogk6|8M?_UOUc7_{_KN(_vF);mMaA9Y-jw1Ar!46~wqZwGA7&}8YBjaBN zd602G84P|gu>NOIVGx8E#|XBQhn=w=WG_Svq#2}%oskzrF@oGK$sh`mgloX9o}FPX zJHuQ?us&f7i*V?R&jxAu!NB^LK^hchzZmrXFbINcPmpif8M(o=r{@m_c1Au11_l-e zMn--}J<2G+z{x1cC<Lk37``&Fg6q(DtsM*<T00qH85wpkv`wxy&}8Y{#?Uo+g@G2h zrd4C$WME+QVqjtPX5eM?W#DJ@W6)#tXRv1sVu)Z2W{74CVTfZ41r;d_S_~`<_Ry@x z!l1{X3(i)c`ZgY#t@s%N!0DV3oTfqT0<bDZVQ{SsQnd}*F5qEcQv1sw4N4Wi7@ROX zBf`MRD9R`XZWNRo+SGS%W6;>fptXacXE}o;v}%>!#*iY^3zyi)z`(!^s?r!Beu`jV zVvJ&7V~l1HV2opsWK3X?XG~;JVN7DMWlUiRW=sS73FJlwh7g7=;Kn8sLlC1l!zO5Z zffLkr5n$v{76pxCNia%+8(=m@^7Vb$$@%K(mfV{dRD}9b>-!1Y7&O%3)h$v(VB$6g z4NYtkleRHvNU*|XB)HeZeImuc#=yW>!ywIA&!EiMz+l7J$PmidRL_vl*ba6+s3ph1 zPy{Y|K+T;ZMk#P}2P7uVa0(pkMT|1wb{+#m5yNMOQw;13AX!<4Qw*F8(hT8@atx;! zxWN$yX%~Y`12x~kEp|qE22N1F59D<Q24({WE(TGCdIrYpkTliqxrsqVV;jR{K1&up zOEx}B4n9jRK1&`xOFlkJ0j-@3@{9~S859^9tb`<mb}}e3GR$NY1F@7C84fTgTM09p ziHM3w3h!jl0}1GFV~AVC@JWINAtEZWjUoO3gW)y?BmNx>Q<5!NB-rY)N{cW!f)%hy zaNv-i3YO=P;KCt49W2i!!2^<?33AY^Z49&9lP!59_>hI_XSaj65GNx!Fgw|jPeK4B zh0qM*VJL(+H9Of-phbjn`G2P6|DNq;m=npimtk%sGus~aNM?<oNEQi}ph#8;wxHlh z7O)tI&mzGV6j{$I!4VW3$qEr=11aSIDdh?Z-p(-3N(gKg$P@`4kQ^UKP9SJI!+a}Y zNg+w$9SjSsL?lI6wlOS}ZqJq!VFfc_ZUUt~aMO?>i9v#afpH!K2jc<;e#S)%LX3+U zL>ZSbNYpbfWsqiE&LGFQf<cjSC4&m%0S0%*BMdQ&#~7*@k2B0-Ji)Mw@g&17#?uUM z8P70^F`i{~Wjw;@&3K;CkMT0&OvWpWTNtl1?q$3SPQ^1A_!+zy8Nm$-5e9cg7I2e6 zn1O-uIxJ-~UWXPe9E|4~>p_W^i9v|*D5Da%?JvrBh*25bU6Eki&!__Ku1GWPVN_)} z#lXcN$GDSGjo}mn4}&7(Hb!-ZQw)3zDvX;MH5g7Y2r$lMuw&F@)M5}~+`^#DsLiOw zAk4UzL5fj_QHwzYoGn0Q1jJES7{HElW@Kal<q%K@N0ou)KZ79yH>kc~h5~R^_m@Ee zTtP8{DmiEwt;@g(8c6{cYXQch;1U?zxnz9Az{zO9s1K4s?S^K8I*E+nat)&L83QMy zA)^r_Ln3!r7l9h}$SPk!Z8c`#1dW|Qb+|Gxg1fV<TAO_t79mPaaCejO9RmyFdvK&c z3IkR~Q*eU`(QyTdfJ$*l@gO3=1?u~Q+&$UQL{c5paRs}Rp$f?q4n_+`O9lo3F3?~B zSZ$$+Nd4m34E&NT+Zc>Ab}%fS$H30AoPmWI<XuQH4lyPWY>Wc9B$EU8NkQeD90RCN z3hE!rG1@S^VPF9@Lm1c?m?fAU7#TPiZ6PBB3=9maV9zoza58UZNM+v4kO}fJIFzCo zz+PsMW?*5EVPIyo1C3BH+B2+TU|>*UU}5lO>}6QVAjzQ2;KOi{jgujgv6pccgCtWR jQwUQKgCt`$0|SE?0~2En12bbSV;y5Xm^GPk3gc7&En;!( delta 5318 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 JWUOMW1^|)QfSv#V -- GitLab