WolfmanZ Posted December 27, 2012 at 02:09 AM Report #488557 Posted December 27, 2012 at 02:09 AM (edited) Boas Estou a fazer um trabalho onde o algoritmo KNN (vizinhos + proximos através de distancia euclidiana) é para ser usado a minha duvida não é o algoritmo em si mas um erro que me está a escapar. o programa tem um conjunto de dados numa matriz e vai ler outros dados de um ficheiro que vai ser lida para outra matriz com o proposito de dizer se é X ou Y. compara cada linha do ficheiro com todas as linhas da matrizTreino e no fim se o vector tiver mais X que Y a amostra (linha do ficheiro é X) e faz isso para todas as linhas do ficheiro no final a soma de X e Y é o numero de linha do ficheiro. O meu problema é que o programa da sempre resultados X e nao é suposto, visto que tenho 2 ficheiros de controlo. int KNN(float **matrizNV, float **mTreino, int *contNV, int *contTr){ int k=15,l,i,j,cM,cB,h,p,g,cMR=0,cBR=0,s; float *vec_dis=NULL, d=0; int *diag=NULL; for(i=0;i<contTr-1;i++){ printf("$%f! ",mTreino[i][1]); } vec_dis = (float*) malloc(k*sizeof(float)); //vector que guarda os menores valores para as distancias euclidiana calculadas diag = (int*) malloc(k*sizeof(int)); // vector que guarda se é X ou Y da disntancia que foi guardada no outro vector for(l=0;l<contNV;l++){ //percorre linhas da matriz do ficheiro cM=0; //contador cB=0; // contador //inicializa vector por cada linha do ficheiro for(h=0;h<k;h++){ vec_dis[h] = 100000; diag[h]=-1; } for(i=0;i<contTr;i++){ //percorre linhas da matriz dados d=0; for(j=2;j<32;j++){ d = d + pow((matrizNV[l][j]-mTreino[i][j]),2); // calcula distancia euclidiana } d=sqrt(d); //compara e ordena com o vector distancias for(p=0;p<k;p++){ if(d<=vec_dis[p]){ for(g=k-1;g>=p;g--){ vec_dis[g] = vec_dis[g-1]; diag[g] = diag[g-1]; } vec_dis[p] = d; diag[p] = i; break; } } }//if i printf("\n"); for(s=0;s<k;s++){ printf("%d$ ",diag[s]); } printf("\n"); for(s=0;s<k;s++){ printf("%f! ",mTreino[diag[s]][1]); if(mTreino[diag[s]][1]==0){ cB++; } if(mTreino[diag[s]][1]==1){ cM++; } } if (cM>cB) cMR++; else cBR++; printf("Linha %d : M=%d | B=%d \n",l+1,cM,cB); }//if l printf("Total: M=%d | B=%d \n",cMR,cBR); printf("Casos analisados: %d \n\n", contNV); } Obrigado desde já Edited December 27, 2012 at 10:50 AM by pmg Falta LP
HappyHippyHippo Posted December 27, 2012 at 07:15 AM Report #488561 Posted December 27, 2012 at 07:15 AM tu calculas a distância, mas não parece fazeres nada com ela ps : para a próxima apresenta o código com a tag para código C ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
WolfmanZ Posted December 27, 2012 at 03:47 PM Author Report #488608 Posted December 27, 2012 at 03:47 PM a distancia sao calculada para inserir as menores no vector vec_dis[] e na mesma posiçao do vector diag[] guarda a informaçao se é X ou Y
HappyHippyHippo Posted December 27, 2012 at 04:11 PM Report #488613 Posted December 27, 2012 at 04:11 PM e na mesma posiçao do vector diag[] guarda a informaçao se é X ou Y for(i=0;i<contTr;i++){ //percorre linhas da matriz dados // ... diag[p] = i; // ... } não parece ... o teu código de registar uma distância e ordenação é uma confusão eu efectuava as seguintes alterações ao teu código: - usa uma estrutura para cada elemento da lista e não duas listas separadas: //vec_dis = (float*) malloc(k*sizeof(float)); //diag = (int*) malloc(k*sizeof(int)); typedef struct { float dist; int diag; }Elem; // ... vector = malloc(k * sizeof(Elem)); - adicinar sempre no fim dos elementos da lista - efectuar a ordenação do array numa função separada IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
WolfmanZ Posted December 27, 2012 at 04:19 PM Author Report #488616 Posted December 27, 2012 at 04:19 PM (edited) ok isto ja tem haver com tentativas de emendar o erro tentei ir pela posição na matriz o original é diag[p] = mTreino[i][1]; o trabalho é para usar matrizes dinâmicas por isso é que não usei listas e estruturas Edited December 27, 2012 at 04:24 PM by WolfmanZ
HappyHippyHippo Posted December 27, 2012 at 04:28 PM Report #488618 Posted December 27, 2012 at 04:28 PM o trabalho é para usar matrizes dinâmicas por isso é que não usei listas e estruturas vector = malloc(k * sizeof(Elem)); // <------------------ e isto não é dinâmico ??? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
WolfmanZ Posted December 27, 2012 at 04:36 PM Author Report #488620 Posted December 27, 2012 at 04:36 PM (edited) sim é dinâmico mas não há necessidade de usar structs o codigo original é este: int KNN(float **matrizNV, float **mTreino, int *contNV, int *contTr){ int k=15,l,i,j,cM,cB,h,p,g,cMR=0,cBR=0,s; float *vec_dis=NULL, d=0; int *diag=NULL; for(i=0;i<contTr-1;i++){ printf("$%f! ",mTreino[i][1]); } vec_dis = (float*) malloc(k*sizeof(float)); diag = (int*) malloc(k*sizeof(int)); for(l=0;l<contNV;l++){ cM=0; cB=0; //inicializa vector por cada linha do ficheiro for(h=0;h<k;h++){ vec_dis[h] = 100000; diag[h]=-2; } for(i=0;i<contTr;i++){ d=0; for(j=2;j<32;j++){ d = d + pow((matrizNV[l][j]-mTreino[i][j]),2); } d=sqrt(d); //compara com o vector distancias for(p=0;p<k;p++){ if(d<=vec_dis[p]){ for(g=k-1;g>=p;g--){ vec_dis[g] = vec_dis[g-1]; diag[g] = diag[g-1]; } vec_dis[p] = d; diag[p] = mTreino[i][1]; break; } } }//if i for(s=0;s<k;s++){ if(diag[s]==0){ cB++; } if(diag[s]==1){ cM++; } } if (cM>cB) cMR++; else cBR++; printf("Linha %d : M=%d | B=%d \n",l+1,cM,cB); }//if l printf("Total: M=%d | B=%d \n",cMR,cBR); printf("Casos analisados: %d \n\n", contNV); } há alteraçoes em relaçao ao outro na parte de meter para o vector e na parte de verificar se é X ou Y Edited December 27, 2012 at 04:37 PM by WolfmanZ
HappyHippyHippo Posted December 27, 2012 at 05:10 PM Report #488632 Posted December 27, 2012 at 05:10 PM não há necessidade, mas é uma questão de simplificação. tipo aqueles métodos que se usam para simplificar o código e a sua leitura, como dar nomes com significao às variáveis, para que quando venha uma segunda pessoa, não tenha problemas em perceber rapidamente o que está escrito. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
WolfmanZ Posted December 27, 2012 at 05:17 PM Author Report #488635 Posted December 27, 2012 at 05:17 PM sim ok. acho que o problema esta na passagem para os vectores pk fiz um teste onde mandei imprimir o vector diag[] e so aparecem 1 e tem que haver tambem 0 nesse vector pois se so encontra 1 é natural que de so malignos
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now