rakha asyrofi
/
KNN_coba7
mantap
main.cpp@0:d6253d3647d4, 2018-04-17 (annotated)
- Committer:
- asyrofi
- Date:
- Tue Apr 17 13:19:59 2018 +0000
- Revision:
- 0:d6253d3647d4
alhamdulillah berhasil..
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
asyrofi | 0:d6253d3647d4 | 1 | //#include<iostream> |
asyrofi | 0:d6253d3647d4 | 2 | //#include <stdio.h> |
asyrofi | 0:d6253d3647d4 | 3 | #include<math.h> |
asyrofi | 0:d6253d3647d4 | 4 | #include<stdlib.h> |
asyrofi | 0:d6253d3647d4 | 5 | #include "mbed.h" |
asyrofi | 0:d6253d3647d4 | 6 | #include "Serial.h" |
asyrofi | 0:d6253d3647d4 | 7 | #include <algorithm> |
asyrofi | 0:d6253d3647d4 | 8 | Serial uart1(USBTX,USBRX); |
asyrofi | 0:d6253d3647d4 | 9 | #define MAX 20 |
asyrofi | 0:d6253d3647d4 | 10 | #define k 4 |
asyrofi | 0:d6253d3647d4 | 11 | using namespace std; |
asyrofi | 0:d6253d3647d4 | 12 | enum category{SHORT,TALL,AVERAGE}; |
asyrofi | 0:d6253d3647d4 | 13 | class data{ |
asyrofi | 0:d6253d3647d4 | 14 | int x,y; |
asyrofi | 0:d6253d3647d4 | 15 | category cat; |
asyrofi | 0:d6253d3647d4 | 16 | public: |
asyrofi | 0:d6253d3647d4 | 17 | void setd(int a,int b,category c){ |
asyrofi | 0:d6253d3647d4 | 18 | x=a; |
asyrofi | 0:d6253d3647d4 | 19 | y=b; |
asyrofi | 0:d6253d3647d4 | 20 | cat=c; |
asyrofi | 0:d6253d3647d4 | 21 | } |
asyrofi | 0:d6253d3647d4 | 22 | int getx(){return x;} |
asyrofi | 0:d6253d3647d4 | 23 | int gety(){return y;} |
asyrofi | 0:d6253d3647d4 | 24 | category getcat(){ |
asyrofi | 0:d6253d3647d4 | 25 | return cat; |
asyrofi | 0:d6253d3647d4 | 26 | } |
asyrofi | 0:d6253d3647d4 | 27 | };//end of class |
asyrofi | 0:d6253d3647d4 | 28 | int dis(data d1,data d2) |
asyrofi | 0:d6253d3647d4 | 29 | { |
asyrofi | 0:d6253d3647d4 | 30 | //return sqrt(pow((d2.getx()-d1.getx()),2)+pow((d2.gety()-d1.gety()),2)); |
asyrofi | 0:d6253d3647d4 | 31 | return sqrt(pow(((double)d2.getx()-(double)d1.getx()),2.0)+pow(((double)d2.gety()-(double)d1.gety()),2.0)); |
asyrofi | 0:d6253d3647d4 | 32 | } |
asyrofi | 0:d6253d3647d4 | 33 | int main() |
asyrofi | 0:d6253d3647d4 | 34 | { |
asyrofi | 0:d6253d3647d4 | 35 | uart1.baud(9600); |
asyrofi | 0:d6253d3647d4 | 36 | do{ |
asyrofi | 0:d6253d3647d4 | 37 | int p,q; //input |
asyrofi | 0:d6253d3647d4 | 38 | int a[MAX]; //store distances |
asyrofi | 0:d6253d3647d4 | 39 | int b[k]; //to get min distances, used in calc |
asyrofi | 0:d6253d3647d4 | 40 | int c[k]; //to store freq |
asyrofi | 0:d6253d3647d4 | 41 | for(int i=0;i<k;i++){ //initiLIZATION |
asyrofi | 0:d6253d3647d4 | 42 | b[i]=-1; |
asyrofi | 0:d6253d3647d4 | 43 | c[i]=0; |
asyrofi | 0:d6253d3647d4 | 44 | } int min=1000; |
asyrofi | 0:d6253d3647d4 | 45 | //cout<<"Enter x,y(negative value to exit): "; |
asyrofi | 0:d6253d3647d4 | 46 | uart1.printf("Enter x,y(negative value to exit):"); |
asyrofi | 0:d6253d3647d4 | 47 | //cin>>p>>q; |
asyrofi | 0:d6253d3647d4 | 48 | uart1.scanf("%ld,%ld",&p,&q); |
asyrofi | 0:d6253d3647d4 | 49 | if((p < 0) | (q < 0)) |
asyrofi | 0:d6253d3647d4 | 50 | exit(0); |
asyrofi | 0:d6253d3647d4 | 51 | data n; //data point to classify |
asyrofi | 0:d6253d3647d4 | 52 | n.setd(p,q,SHORT); |
asyrofi | 0:d6253d3647d4 | 53 | data d[MAX]; //training set |
asyrofi | 0:d6253d3647d4 | 54 | |
asyrofi | 0:d6253d3647d4 | 55 | d[0].setd(1,1,SHORT); |
asyrofi | 0:d6253d3647d4 | 56 | d[1].setd(1,2,SHORT); |
asyrofi | 0:d6253d3647d4 | 57 | d[2].setd(1,3,SHORT); |
asyrofi | 0:d6253d3647d4 | 58 | d[3].setd(1,4,SHORT); |
asyrofi | 0:d6253d3647d4 | 59 | d[4].setd(1,5,SHORT); |
asyrofi | 0:d6253d3647d4 | 60 | d[5].setd(1,6,SHORT); |
asyrofi | 0:d6253d3647d4 | 61 | d[6].setd(1,7,SHORT); |
asyrofi | 0:d6253d3647d4 | 62 | d[7].setd(2,1,SHORT); |
asyrofi | 0:d6253d3647d4 | 63 | d[8].setd(2,2,SHORT); |
asyrofi | 0:d6253d3647d4 | 64 | d[9].setd(2,3,AVERAGE); |
asyrofi | 0:d6253d3647d4 | 65 | d[10].setd(2,4,AVERAGE); |
asyrofi | 0:d6253d3647d4 | 66 | d[11].setd(2,5,AVERAGE); |
asyrofi | 0:d6253d3647d4 | 67 | d[12].setd(2,6,AVERAGE); |
asyrofi | 0:d6253d3647d4 | 68 | d[13].setd(2,7,AVERAGE); |
asyrofi | 0:d6253d3647d4 | 69 | d[14].setd(5,1,TALL); |
asyrofi | 0:d6253d3647d4 | 70 | d[15].setd(5,2,TALL); |
asyrofi | 0:d6253d3647d4 | 71 | d[16].setd(5,3,TALL); |
asyrofi | 0:d6253d3647d4 | 72 | d[17].setd(5,4,TALL); |
asyrofi | 0:d6253d3647d4 | 73 | d[18].setd(5,5,TALL); |
asyrofi | 0:d6253d3647d4 | 74 | d[19].setd(5,6,TALL); |
asyrofi | 0:d6253d3647d4 | 75 | for(int i=0;i<20;i++){ |
asyrofi | 0:d6253d3647d4 | 76 | a[i]=dis(n,d[i]); |
asyrofi | 0:d6253d3647d4 | 77 | //cout<<"\t\t"<<a[i]<<endl; |
asyrofi | 0:d6253d3647d4 | 78 | uart1.printf("\t\t %d\n", a[i]); |
asyrofi | 0:d6253d3647d4 | 79 | } |
asyrofi | 0:d6253d3647d4 | 80 | //k-nearest neighbours calculation i.e smallest k distances |
asyrofi | 0:d6253d3647d4 | 81 | for(int j=0;j<k;j++) |
asyrofi | 0:d6253d3647d4 | 82 | { |
asyrofi | 0:d6253d3647d4 | 83 | min=1000; |
asyrofi | 0:d6253d3647d4 | 84 | for(int i=0;i<20;i++) |
asyrofi | 0:d6253d3647d4 | 85 | { |
asyrofi | 0:d6253d3647d4 | 86 | if(i!=b[0]&&i!=b[1]&&i!=b[2]) |
asyrofi | 0:d6253d3647d4 | 87 | { |
asyrofi | 0:d6253d3647d4 | 88 | if((a[i]<=min)) |
asyrofi | 0:d6253d3647d4 | 89 | { |
asyrofi | 0:d6253d3647d4 | 90 | min=a[i]; |
asyrofi | 0:d6253d3647d4 | 91 | b[j]=i; |
asyrofi | 0:d6253d3647d4 | 92 | } |
asyrofi | 0:d6253d3647d4 | 93 | } |
asyrofi | 0:d6253d3647d4 | 94 | } |
asyrofi | 0:d6253d3647d4 | 95 | //cout<<min<<endl; |
asyrofi | 0:d6253d3647d4 | 96 | uart1.printf("%d\n",min); |
asyrofi | 0:d6253d3647d4 | 97 | } |
asyrofi | 0:d6253d3647d4 | 98 | //counting frequency of a class in each neighbour |
asyrofi | 0:d6253d3647d4 | 99 | for(int i=0;i<k;i++) |
asyrofi | 0:d6253d3647d4 | 100 | { |
asyrofi | 0:d6253d3647d4 | 101 | switch (d[b[i]].getcat()) |
asyrofi | 0:d6253d3647d4 | 102 | { |
asyrofi | 0:d6253d3647d4 | 103 | case SHORT: |
asyrofi | 0:d6253d3647d4 | 104 | c[0]++; |
asyrofi | 0:d6253d3647d4 | 105 | break; |
asyrofi | 0:d6253d3647d4 | 106 | case AVERAGE: |
asyrofi | 0:d6253d3647d4 | 107 | c[2]++; |
asyrofi | 0:d6253d3647d4 | 108 | break; |
asyrofi | 0:d6253d3647d4 | 109 | case TALL: |
asyrofi | 0:d6253d3647d4 | 110 | c[1]++; |
asyrofi | 0:d6253d3647d4 | 111 | break; |
asyrofi | 0:d6253d3647d4 | 112 | } |
asyrofi | 0:d6253d3647d4 | 113 | } //counting max frequency |
asyrofi | 0:d6253d3647d4 | 114 | int max=-1,j; |
asyrofi | 0:d6253d3647d4 | 115 | for(int i=0;i<k;i++) |
asyrofi | 0:d6253d3647d4 | 116 | { |
asyrofi | 0:d6253d3647d4 | 117 | if(c[i]>max){ |
asyrofi | 0:d6253d3647d4 | 118 | max=c[i]; |
asyrofi | 0:d6253d3647d4 | 119 | j=i; |
asyrofi | 0:d6253d3647d4 | 120 | } |
asyrofi | 0:d6253d3647d4 | 121 | } |
asyrofi | 0:d6253d3647d4 | 122 | //cout<<"Prediction is : "; |
asyrofi | 0:d6253d3647d4 | 123 | printf("Prediction is:"); |
asyrofi | 0:d6253d3647d4 | 124 | switch (j) |
asyrofi | 0:d6253d3647d4 | 125 | { |
asyrofi | 0:d6253d3647d4 | 126 | case 0: |
asyrofi | 0:d6253d3647d4 | 127 | //cout<<"SHORT"<<endl; |
asyrofi | 0:d6253d3647d4 | 128 | uart1.printf("SHORT\n"); |
asyrofi | 0:d6253d3647d4 | 129 | break; |
asyrofi | 0:d6253d3647d4 | 130 | case 1: |
asyrofi | 0:d6253d3647d4 | 131 | //cout<<"TALL"<<endl; |
asyrofi | 0:d6253d3647d4 | 132 | uart1.printf("TALL\n"); |
asyrofi | 0:d6253d3647d4 | 133 | break; |
asyrofi | 0:d6253d3647d4 | 134 | case 2: |
asyrofi | 0:d6253d3647d4 | 135 | //cout<<"AVERAGE"<<endl; |
asyrofi | 0:d6253d3647d4 | 136 | uart1.printf("AVERAGE\n"); |
asyrofi | 0:d6253d3647d4 | 137 | break; |
asyrofi | 0:d6253d3647d4 | 138 | } |
asyrofi | 0:d6253d3647d4 | 139 | }while(true); |
asyrofi | 0:d6253d3647d4 | 140 | return 0; |
asyrofi | 0:d6253d3647d4 | 141 | } |