public void ChiSquareDistribution() { int B = 8; Random rng = new Random(0); //BinomialDistribution d = new BinomialDistribution(0.25, 6); //DiscreteUniformDistribution d = new DiscreteUniformDistribution(0, 4); //BernoulliDistribution d = new BernoulliDistribution(0.25); DiscreteDistribution d = new PoissonDistribution(2.0); Sample s = new Sample(); ChiSquaredDistribution nullDistribution = null; for (int i = 0; i < 512; i++) { Histogram h = new Histogram(B); for (int j = 0; j < 1024; j++) { int k = d.GetRandomValue(rng); h.Add(k); //if (k < h.Count) h[k].Increment(); //h[d.GetRandomValue(rng)].Increment(); } TestResult cr = h.ChiSquaredTest(d); nullDistribution = (ChiSquaredDistribution) cr.Distribution; //Console.WriteLine(((ChiSquaredDistribution) cr.Distribution).DegreesOfFreedom); s.Add(cr.Statistic); } Console.WriteLine(nullDistribution.DegreesOfFreedom); TestResult kr = s.KuiperTest(nullDistribution); Console.WriteLine(kr.LeftProbability); }
public void TwoSampleKS2() { int n = 2 * 3 * 3; int m = 2 * 2 * 3; Random rng = new Random(0); NormalDistribution d = new NormalDistribution(); Histogram h = new Histogram((int) AdvancedIntegerMath.LCM(n, m) + 1); //int[] h = new int[AdvancedIntegerMath.LCM(n, m) + 1]; int count = 1000; for (int i = 0; i < count; i++) { Sample A = new Sample(); for (int j = 0; j < n; j++) A.Add(d.GetRandomValue(rng)); Sample B = new Sample(); for (int j = 0; j < m; j++) B.Add(d.GetRandomValue(rng)); TestResult r = Sample.KolmogorovSmirnovTest(A, B); int k = (int) Math.Round(r.Statistic * AdvancedIntegerMath.LCM(n, m)); //Console.WriteLine("{0} {1}", r.Statistic, k); h[k].Increment(); //h[k] = h[k] + 1; } KolmogorovTwoSampleExactDistribution ks = new KolmogorovTwoSampleExactDistribution(n, m); double chi2 = 0.0; int dof = 0; for (int i = 0; i < h.Count; i++) { double ne = ks.ProbabilityMass(i) * count; Console.WriteLine("{0} {1} {2}", i, h[i].Counts, ne); if (ne > 4) { chi2 += MoreMath.Sqr(h[i].Counts - ne) / ne; dof++; } } Console.WriteLine("chi^2={0} dof={1}", chi2, dof); TestResult r2 = h.ChiSquaredTest(ks); ChiSquaredDistribution rd = (ChiSquaredDistribution) r2.Distribution; Console.WriteLine("chi^2={0} dof={1} P={2}", r2.Statistic, rd.DegreesOfFreedom, r2.RightProbability); }
//Method that calculates the calibration parameters void calibrazione(double[] X_kinect, double[] Y_kinect, double[] Z_kinect) { //Grid coordinates double[] X_Ref_B = new double[12] { -517.5, -172.5, 172.5, 517.5, -517.5, -172.5, 172.5, 517.5, -517.5, -172.5, 172.5, 517.5 };// coordinate X dei punti della griglia di riferimento (origine posta al centro della griglia stessa) double[] Y_Ref_B = new double[12] { 345.0, 345.0, 345.0, 345.0, 0.0, 0.0, 0.0, 0.0, -345.0, -345.0, -345.0, -345.0 };// coordinate Y dei punti della griglia di riferimento (origine posta al centro della griglia stessa) double[] Z_Ref_B = new double[12]; Sample XKINECT = new Sample(X_kinect); Sample YKINECT = new Sample(Y_kinect); Sample ZKINECT = new Sample(Z_kinect); // barycenter of Kinect coordinates double X_Bar = XKINECT.Mean; double Y_Bar = YKINECT.Mean; double Z_Bar = ZKINECT.Mean; //Kinect barycentric coordinates contaneirs double[] X_Kinect_Bar = new double[12]; double[] Y_Kinect_Bar = new double[12]; double[] Z_Kinect_Bar = new double[12]; //Kinect barycentric coordinates for (int i = 0; i < 12; i++) { X_Kinect_Bar[i] = X_kinect[i] - X_Bar; Y_Kinect_Bar[i] = Y_kinect[i] - Y_Bar; Z_Kinect_Bar[i] = Z_kinect[i] - Z_Bar; } //Modello rotazione + 2 parametri di scala Yoss=AX+b oppure B=Yoss-b=AX X=B*A^-1 RectangularMatrix A = new RectangularMatrix(36, 5); ColumnVector B = new ColumnVector(36); ColumnVector bb = new ColumnVector(36); ColumnVector Yoss = new ColumnVector(36); ColumnVector X = new ColumnVector(5); SquareMatrix X1 = new SquareMatrix(5); ColumnVector X2 = new ColumnVector(5); for (int i = 0; i < 12; i++) { Yoss[3 * i] = X_Ref_B[i]; Yoss[3 * i + 1] = Y_Ref_B[i]; Yoss[3 * i + 2] = Z_Ref_B[i]; A[3 * i, 0] = Y_Kinect_Bar[i]; A[3 * i, 1] = -Z_Kinect_Bar[i]; A[3 * i, 2] = 0.0; A[3 * i, 3] = X_Kinect_Bar[i]; A[3 * i, 4] = 0.0; A[3 * i + 1, 0] = -X_Kinect_Bar[i]; A[3 * i + 1, 1] = 0.0; A[3 * i + 1, 2] = Z_Kinect_Bar[i]; A[3 * i + 1, 3] = 0.0; A[3 * i + 1, 4] = Y_Kinect_Bar[i]; A[3 * i + 2, 0] = 0.0; A[3 * i + 2, 1] = X_Kinect_Bar[i]; A[3 * i + 2, 2] = -Y_Kinect_Bar[i]; A[3 * i + 2, 3] = 0.0; A[3 * i + 2, 4] = 0.0; bb[3 * i] = X_Kinect_Bar[i]; bb[3 * i + 1] = Y_Kinect_Bar[i]; bb[3 * i + 2] = Z_Kinect_Bar[i]; B[3 * i] = X_Ref_B[i] - X_Kinect_Bar[i]; B[3 * i + 1] = Y_Ref_B[i] - Y_Kinect_Bar[i]; B[3 * i + 2] = Z_Ref_B[i] - Z_Kinect_Bar[i]; } X1 = (SquareMatrix)(A.Transpose() * A); X2 = (A.Transpose() * B); X = (X1.Inverse()) * X2; a = X[0]; b = X[1]; c = X[2]; lambdaX = X[3]; lambdaY = X[4]; this.sw9.Write("{0:#####.0000} {1:#####.0000} {2:#####.0000} {3:#####.0000} {4:#####.0000} ", a, b, c, lambdaX, lambdaY); this.sw9.WriteLine(); }
/// <summary> /// Meetod kõigi sisendite (ehk eelduste) välja arvutamiseks /// </summary> /// <param name="finDataAdapter">Adapter kõigi finantsandmete kättesaamise jaoks</param> /// <param name="dcfInput">DCF arvutuste eelduste hoidja</param> public static void CalculateInput(FinDataAdapter finDataAdapter, DcfInput dcfInput) { CalculateCorrelation(finDataAdapter, dcfInput); int requiredPeriodsForMean = 1; List<FinData> finDatas = finDataAdapter.FinDataDao.FinDatas; int k = 0; Sample sampleRevenue = new Sample(); Sample sampleTax = new Sample(); Sample sampleInterest = new Sample(); Sample sampleTotalAssets = new Sample(); Sample sampleTotalLiabilities = new Sample(); Sample sampleTotalCurrentAssets = new Sample(); Sample sampleTotalCurrentLiabilities = new Sample(); Sample sampleAllCosts = new Sample(); Sample sampleEbitda = new Sample(); Sample sampleDepreciation = new Sample(); Sample sampleEbit = new Sample(); for (int i = finDatas.Count - 1; i >= 4; i--) { if (k < 12) { if (k == 0) { try { dcfInput.SharesOutstanding = (double)finDatas[i].BsCommonSharesOutstanding; } catch (InvalidOperationException) { } } try { double RevenueGrowth = (double)(finDatas[i].IsRevenue / finDatas[i - 4].IsRevenue) - 1; sampleRevenue.Add(RevenueGrowth); } catch (InvalidOperationException) { } try { double taxRate = (double)((finDatas[i].IsPretaxIncome - finDatas[i].IsIncomeAfterTax) / finDatas[i].IsPretaxIncome); sampleTax.Add(taxRate); } catch (InvalidOperationException) { } double debt = 0; if (finDatas[i].BsCurrentPortionOfLongTermDebt != null) { debt += (double)finDatas[i].BsCurrentPortionOfLongTermDebt; } if (finDatas[i].BsTotalLongTermDebt != null) { debt += (double)finDatas[i].BsTotalLongTermDebt; } if (finDatas[i].FrInterestExpense != null && debt != 0.0) { double interest = (double)(finDatas[i].FrInterestExpense) / debt; if (interest < 0.2) { sampleInterest.Add(interest); } } if (finDatas[i].IsRevenue != null && finDatas[i].IsRevenue != 0.0 && finDatas[i].BsTotalAssets != null) { double temp = (double)(finDatas[i].BsTotalAssets / finDatas[i].IsRevenue); if (temp > 0.5 && temp < 50) { sampleTotalAssets.Add(temp); } } if (finDatas[i].IsRevenue != null && finDatas[i].IsRevenue != 0.0 && finDatas[i].BsTotalLiabilities != null) { double temp = (double)(finDatas[i].BsTotalLiabilities / finDatas[i].IsRevenue); if (temp > 0.5 && temp < 50) { sampleTotalLiabilities.Add(temp); } } if (finDatas[i].IsRevenue != null && finDatas[i].IsRevenue != 0.0 && finDatas[i].BsTotalCurrentAssets != null) { double temp = (double)(finDatas[i].BsTotalCurrentAssets / finDatas[i].IsRevenue); if (temp > 0.5 && temp < 50) { sampleTotalCurrentAssets.Add(temp); } } if (finDatas[i].IsRevenue != null && finDatas[i].IsRevenue != 0.0 && finDatas[i].BsTotalCurrentLiabilities != null) { double temp = (double)(finDatas[i].BsTotalCurrentLiabilities / finDatas[i].IsRevenue); if (temp > 0.5 && temp < 50) { sampleTotalCurrentLiabilities.Add(temp); } } double allCosts = 0.0; if (finDatas[i].IsTotalOperatingExpenses != null) { allCosts += (double)finDatas[i].IsTotalOperatingExpenses; } if (finDatas[i].IsDepreciationAmortization != null) { allCosts -= (double)finDatas[i].IsDepreciationAmortization; } if (finDatas[i].IsRevenue != null && finDatas[i].IsRevenue != 0.0 && allCosts != 0.0) { double temp = (double)(allCosts / finDatas[i].IsRevenue); if (temp > 0.1 && temp < 1) { sampleAllCosts.Add(temp); } } if (finDatas[i].IsRevenue != null && finDatas[i].IsRevenue != 0.0 && finDatas[i].FrEbitda != null) { double temp = (double)(finDatas[i].FrEbitda / finDatas[i].IsRevenue); if (temp > -1.0 && temp < 1.0) { sampleEbitda.Add(temp); } } if (finDatas[i].IsRevenue != null && finDatas[i].IsRevenue != 0.0 && finDatas[i].IsDepreciationAmortization != null) { double temp = (double)(finDatas[i].IsDepreciationAmortization / finDatas[i].IsRevenue); if (temp > -1.0 && temp < 1.0) { sampleDepreciation.Add(temp); } } if (finDatas[i].IsRevenue != null && finDatas[i].IsRevenue != 0.0 && finDatas[i].FrEbit != null) { double temp = (double)(finDatas[i].FrEbit / finDatas[i].IsRevenue); if (temp > -1.0 && temp < 1.0) { sampleEbit.Add(temp); } } } k++; } if (sampleRevenue.Count >= requiredPeriodsForMean) { dcfInput.GrowthRatePrognosis = sampleRevenue.Mean; } if (sampleTax.Count >= requiredPeriodsForMean) { dcfInput.TaxRate = sampleTax.Mean; } if (sampleInterest.Count >= requiredPeriodsForMean) { dcfInput.CostOfDebt = sampleInterest.Mean; } if (sampleTotalAssets.Count >= requiredPeriodsForMean) { dcfInput.TotalAssetsPrcRevenue = sampleTotalAssets.Mean; } if (sampleTotalLiabilities.Count >= requiredPeriodsForMean) { dcfInput.TotalLiabilitiesPrcRevenue = sampleTotalLiabilities.Mean; } if (sampleTotalCurrentAssets.Count >= requiredPeriodsForMean) { dcfInput.TotalCurrentAssetsPrcRevenue = sampleTotalCurrentAssets.Mean; } if (sampleTotalCurrentLiabilities.Count >= requiredPeriodsForMean) { dcfInput.TotalCurrentLiabilitiesPrcRevenue = sampleTotalCurrentLiabilities.Mean; } if (sampleAllCosts.Count >= requiredPeriodsForMean) { dcfInput.AllCostsPrcRevenue = sampleAllCosts.Mean; } if (sampleEbitda.Count >= requiredPeriodsForMean) { dcfInput.EbitdaPrcRevenue = sampleEbitda.Mean; } if (sampleDepreciation.Count >= requiredPeriodsForMean) { dcfInput.DepreciationPrcRevenue = sampleDepreciation.Mean; } if (sampleEbit.Count >= requiredPeriodsForMean) { dcfInput.EbitPrcRevenue = sampleEbit.Mean; } }
// Method that calculates the calibration parameters public void Calibration(double[] X_Kinect, double[] Y_Kinect, double[] Z_Kinect) { double[] X_Ref_B = new double[dim]; double[] Y_Ref_B = new double[dim]; double[] Z_Ref_B = new double[dim]; if (colonne_griglia_calibrazione % 2 == 0 && righe_griglia_calibrazione % 2 == 0) { for (int i = 0; i < righe_griglia_calibrazione; i++) { for (int j = 0; j < colonne_griglia_calibrazione; j++) { X_Ref_B[colonne_griglia_calibrazione*i + j] = (-colonne_griglia_calibrazione/2 + j)*step + step/2; Y_Ref_B[colonne_griglia_calibrazione*i + j] = (righe_griglia_calibrazione/2 - i)*step - step/2; } } } if (colonne_griglia_calibrazione % 2 == 0 && righe_griglia_calibrazione % 2 != 0) { for (int i = 0; i < righe_griglia_calibrazione; i++) { for (int j = 0; j < colonne_griglia_calibrazione; j++) { X_Ref_B[colonne_griglia_calibrazione * i + j] = (-colonne_griglia_calibrazione / 2 + j) * step + step / 2; Y_Ref_B[colonne_griglia_calibrazione * i + j] = ((righe_griglia_calibrazione-1)/ 2 - i) * step; } } } if (colonne_griglia_calibrazione % 2 != 0 && righe_griglia_calibrazione % 2 == 0) { for (int i = 0; i < righe_griglia_calibrazione; i++) { for (int j = 0; j < colonne_griglia_calibrazione; j++) { X_Ref_B[colonne_griglia_calibrazione*i + j] = (-(colonne_griglia_calibrazione-1)/2 + j)*step; Y_Ref_B[colonne_griglia_calibrazione*i + j] = (righe_griglia_calibrazione/2 - i)*step - step/2; } } } if (colonne_griglia_calibrazione % 2 != 0 && righe_griglia_calibrazione % 2 != 0) { for (int i = 0; i < righe_griglia_calibrazione; i++) { for (int j = 0; j < colonne_griglia_calibrazione; j++) { X_Ref_B[colonne_griglia_calibrazione * i + j] = (-(colonne_griglia_calibrazione - 1) / 2 + j) * step; Y_Ref_B[colonne_griglia_calibrazione * i + j] = ((righe_griglia_calibrazione - 1) / 2 - i) * step; } } } // Grid coordinates for (int k = 0; k < dim; k++) { this.Win.sw5.WriteLine("{0:#####.0000} {1:#####.0000} {2:#####.0000} ", X_Ref_B[k], Y_Ref_B[k], Z_Ref_B[k]); } this.Win.sw5.WriteLine(); Sample XKINECT = new Sample(X_Kinect); Sample YKINECT = new Sample(Y_Kinect); Sample ZKINECT = new Sample(Z_Kinect); // barycenter of Kinect coordinates double X_Bar = XKINECT.Mean; double Y_Bar = YKINECT.Mean; double Z_Bar = ZKINECT.Mean; //Kinect barycentric coordinates contaneirs double[] X_Kinect_Bar = new double[dim]; double[] Y_Kinect_Bar = new double[dim]; double[] Z_Kinect_Bar = new double[dim]; //Kinect barycentric coordinates for (int i = 0; i < dim; i++) { X_Kinect_Bar[i] = X_Kinect[i] - X_Bar; Y_Kinect_Bar[i] = Y_Kinect[i] - Y_Bar; Z_Kinect_Bar[i] = Z_Kinect[i] - Z_Bar; this.Win.sw3.WriteLine("{0:#####.0000} {1:#####.0000} {2:#####.0000} ", X_Kinect_Bar[i], Y_Kinect_Bar[i], Z_Kinect_Bar[i]); } this.Win.sw3.WriteLine(); //Modello rotazione + 2 parametri di scala Yoss = AX+b oppure B = Yoss-bb = AX X = B*A^-1 RectangularMatrix A = new RectangularMatrix(dim * 3, 5); ColumnVector B = new ColumnVector(dim * 3); ColumnVector bb = new ColumnVector(dim * 3); ColumnVector Yoss = new ColumnVector(dim * 3); ColumnVector X = new ColumnVector(5); SquareMatrix X1 = new SquareMatrix(5); ColumnVector X2 = new ColumnVector(5); for (int i = 0; i < dim; i++) { Yoss[3 * i ] = X_Ref_B[i]; Yoss[3 * i + 1] = Y_Ref_B[i]; Yoss[3 * i + 2] = Z_Ref_B[i]; A[3 * i, 0] = Y_Kinect_Bar[i]; A[3 * i, 1] = -Z_Kinect_Bar[i]; A[3 * i, 2] = 0.0; A[3 * i, 3] = X_Kinect_Bar[i]; A[3 * i, 4] = 0.0; A[3 * i + 1, 0] = -X_Kinect_Bar[i]; A[3 * i + 1, 1] = 0.0; A[3 * i + 1, 2] = Z_Kinect_Bar[i]; A[3 * i + 1, 3] = 0.0; A[3 * i + 1, 4] = Y_Kinect_Bar[i]; A[3 * i + 2, 0] = 0.0; A[3 * i + 2, 1] = X_Kinect_Bar[i]; A[3 * i + 2, 2] = -Y_Kinect_Bar[i]; A[3 * i + 2, 3] = 0.0; A[3 * i + 2, 4] = 0.0; bb[3 * i] = X_Kinect_Bar[i]; bb[3 * i + 1] = Y_Kinect_Bar[i]; bb[3 * i + 2] = Z_Kinect_Bar[i]; B[3 * i] = X_Ref_B[i] - X_Kinect_Bar[i]; B[3 * i + 1] = Y_Ref_B[i] - Y_Kinect_Bar[i]; B[3 * i + 2] = Z_Ref_B[i] - Z_Kinect_Bar[i]; } X1 = (SquareMatrix)(A.Transpose() * A); X2 = (A.Transpose() * B); X = (X1.Inverse()) * X2; a = X[0]; b = X[1]; c = X[2]; lambdaX = X[3]; lambdaY = X[4]; this.Win.sw12.Write("{0:#####.0000} {1:#####.0000} {2:#####.0000} {3:#####.0000} {4:#####.0000} ", a, b, c, lambdaX, lambdaY); this.Win.sw12.WriteLine(); this.Win.textBlock8.Text = string.Format("Calibration parameters:\na = {0} \nb = {1} \nc = {2} \nlambdaX = {3} \nlambdaY = {4}", a, b, c, lambdaX, lambdaY); SquareMatrix ROT = new SquareMatrix(3); ROT[0, 0] = 1 + lambdaX; ROT[0, 1] = a; ROT[0, 2] = -b; ROT[1, 0] = -a; ROT[1, 1] = 1 + lambdaY; ROT[1, 2] = c; ROT[2, 0] = b; ROT[2, 1] = -c; ROT[2, 2] = 1; }