From 293a9f9e0811f35f30ab037a5d2b242ed9deef9c Mon Sep 17 00:00:00 2001 From: stasysp Date: Tue, 6 Dec 2016 10:09:54 +0300 Subject: [PATCH] Add files via upload --- classifier.cpp | 174 ++++++++++++++++++++++++++++++++++++++++++++++--- classifier.hpp | 8 ++- main.cpp | 46 ++++--------- 3 files changed, 185 insertions(+), 43 deletions(-) diff --git a/classifier.cpp b/classifier.cpp index a9371c6..4e7f066 100644 --- a/classifier.cpp +++ b/classifier.cpp @@ -1,4 +1,7 @@ #include "classifier.hpp" +#include +#include + Classifier::Classifier(){ mathModel = 0; @@ -11,9 +14,29 @@ Classifier::Classifier(){ ExH[0]=0; ExH[1]=0; DxH[0]=0; DxH[1]=0; H = 1e-7; + k = 0; } Classifier::~Classifier(){} +Classifier::Classifier(const Classifier &A){ + mathModel = A.mathModel; + H=A.H; + for (int i=0; i<2; i++){ + p[i]=A.p[i]; + counts[i]=A.counts[i]; + ExW[i]=A.ExW[i]; + DxW[i]=A.DxW[i]; + ExH[i]=A.ExH[i]; + DxH[i]=A.DxH[i]; + for (int j=0; j<250; j++){ + pWeight[i][j]=A.pWeight[i][j]; + pHeight[i][j]=A.pHeight[i][j]; + } + } + for (int i=0; i> Classifier::readTestFile(ifstream &F){ vector> r; while (!F.eof()){ - int x, y; + double x, y; F>>x>>y; r.push_back(make_pair(x, y)); } @@ -35,7 +58,7 @@ vector> Classifier::readTestFile(ifstream &F){ int Classifier::findNext(int i, double *arr){ for (; i<250; i++){ - if (arr[i] > 10e-8) return i; + if (arr[i] > 1e-9) return i; } return 0; } @@ -49,6 +72,21 @@ double kernel(double _h, int index, int label, vectordata){ } return f; } +double kernel1(double _h, int index, int label, vectordata){ + // sqrt((x-xi)^2+(y-yi)^2) + //K(x)=----------------------- if sqrt((x-xi)^2+(y-yi)^2) < h + // pi*h^2 + // + const double pi = 3.14159265; + double f=0.0; + for (int i=0; i> data){ + int count = 0; + for (int i=0; i<_k; i++) + if (data[i].second == 1) count++; + if (count > _k-count) return 1; + return 0; +} + Classifier barChart(Classifier A){ A.mathModel = 1; - int weight[2][250], heihgt[2][250]; + int weight[2][250], height[2][250]; const double eps = 1e-8; for (int i=0; i<2; i++){ for (int j=0; j<250; j++){ weight[i][j]=0; - heihgt[i][j]=0; + height[i][j]=0; } } for (int i=0; i= 0 && int(A.train_set[i].height) < 250); + // assert(int(A.train_set[i].weight) >= 0 && int(A.train_set[i].weight) < 250); + if (A.train_set[i].height>249) A.train_set[i].height = 249; + if (A.train_set[i].weight>249) A.train_set[i].weight = 249; + height[A.train_set[i].label][int(A.train_set[i].height)]++; weight[A.train_set[i].label][int(A.train_set[i].weight)]++; } @@ -99,7 +160,7 @@ Classifier barChart(Classifier A){ for (int i=0; i<2; i++) for (int j=0; j<250; j++){ A.pWeight[i][j] = double(weight[i][j])/double(A.counts[i]); - A.pHeight[i][j] = double(heihgt[i][j])/double(A.counts[i]); + A.pHeight[i][j] = double(height[i][j])/double(A.counts[i]); } A.pWeight[0][0]=eps; A.pWeight[1][0]=eps; @@ -166,12 +227,15 @@ Classifier parzanRozenblatt (Classifier A){ if (A.counts[0] == 0 && A.counts[1]==0) for (int i=0; i> *mydata; + mydata = new vector> [c]; + for (int i=0; imax) { + max = mycounts[i]; + tmpK = i; + } + } + A.k = tmpK; + return A; +} + +Classifier parzanRozenblatt2 (Classifier A){ + // 1 X-Xi + //P(x)=--------- * sum K(-----) + // n*pi*h^2 h + // + // sqrt((x-xi)^2+(y-yi)^2) + //K(x)=----------------------- if sqrt((x-xi)^2+(y-yi)^2) < h + // pi*h^2 + // + const double pi = 3.14159265; + A.mathModel = 5; + if (A.counts[0] == 0 && A.counts[1]==0) + for (int i=0; i= kernel(tmpH, j, 1, A.train_set)/A.counts[1] && A.train_set[j].label == 0) countTMP++; + if (kernel1(tmpH, j, 1, A.train_set)/A.counts[1] > kernel(tmpH, j, 0, A.train_set)/A.counts[0] && A.train_set[j].label == 1) countTMP++; + } + if (countTMP > count){ + count = countTMP; + A.H = tmpH; + } + tmpH+=eps; + } + + return A; +} + void Classifier::train(ifstream &F, Classifier (*f)(Classifier A)){ readTrainFile(F); train(this->train_set, f); } void Classifier::train(vector input, Classifier (*f)(Classifier A)){ *this = f(*this); + } vector Classifier::classify(ifstream &F){ @@ -203,11 +347,23 @@ vector Classifier::classify(ifstream &F){ vector Classifier::classify(vector>input){ vectorrez; + if (mathModel == 4){ + vector> mydata; + for (int i=0; i b) rez.push_back(0); else rez.push_back(1); + } } return rez; } diff --git a/classifier.hpp b/classifier.hpp index 7abea6d..c6b458a 100644 --- a/classifier.hpp +++ b/classifier.hpp @@ -24,8 +24,9 @@ class Classifier{ double p[2]; double pWeight[2][250], pHeight[2][250]; int counts[2]; - double ExW[2], DxW[2], ExH[2], DxH[2]; //матожидание&дисперсия + double ExW[2], DxW[2], ExH[2], DxH[2];//матожидание&дисперсия double H; //коэфф сглаживания + int k;//knn vectortrain_set; void readTrainFile(ifstream &F); @@ -35,7 +36,10 @@ class Classifier{ public: Classifier(); ~Classifier(); + Classifier(const Classifier &A); friend Classifier barChart(Classifier A); + friend Classifier KNN(Classifier A); + friend Classifier parzanRozenblatt2(Classifier A); friend Classifier normalDistribution (Classifier A); friend Classifier parzanRozenblatt (Classifier A); void train(ifstream &F, Classifier (*f)(Classifier A)); @@ -46,5 +50,7 @@ class Classifier{ Classifier barChart(Classifier A); Classifier normalDistribution (Classifier A); Classifier parzanRozenblatt (Classifier A); +Classifier KNN(Classifier A); +Classifier parzanRozenblatt2(Classifier A); #endif /* classifier_hpp */ diff --git a/main.cpp b/main.cpp index 755ed8f..7b88e02 100644 --- a/main.cpp +++ b/main.cpp @@ -14,40 +14,20 @@ using namespace std; int main() { Classifier my; - vector> myTest; - myTest.push_back(make_pair(190, 90)); - myTest.push_back(make_pair(185, 86)); - myTest.push_back(make_pair(165, 46)); - myTest.push_back(make_pair(164, 49)); - myTest.push_back(make_pair(179, 76)); - myTest.push_back(make_pair(155, 42)); - - vectortest1; - - ifstream F; - F.open("/Users/anastasiapopova/Desktop/YANDEX/lab2_Bayes/lab2/train_test_set"); - - my.train(F, barChart); - vectorans = my.classify(myTest); - for (int i=0; ians = my.classify(F1); + cout<<"classify"<