c_cpp K-NN.cpp

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp K-NN.cpp相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#define garis printf("---------------------------------------------------------\n")
#define garis2 printf("|=======================================================|\n")
struct hasil_jarak{
	int index;
	double jaraknya;
};

bool acompare(hasil_jarak lhs, hasil_jarak rhs) { return lhs.jaraknya < rhs.jaraknya; }
void input_data1(int *, int *, int *);
void input_data2(char a[][100], int);
void input_dataset(int a[][100], int, int, int);
void input_kasus(int *, int, int);
void input_K(int *);
void display_table(int a[][100], hasil_jarak *, int, int, bool, int);
void display_hasil(int *, char a[][100], int, int);
double euclidean_distance(int *, int *, int);

int main(){
	int total_atribut, total_dataset, total_class;
	input_data1(&total_atribut, &total_dataset, &total_class);
	
	char class_name[total_class][100];
	input_data2(class_name, total_class);

	int data[total_dataset][100], kasus[total_atribut], K;
	input_dataset(data, total_dataset, total_atribut, total_atribut);
	input_kasus(kasus, total_atribut, total_atribut);
	input_K(&K);

	hasil_jarak jarak[total_dataset];
	int hasil[total_class];
	memset(hasil, 0, sizeof(hasil));

	int tmp_data[total_atribut];
	for(int i=0; i<total_dataset; i++){
		for(int j=0; j<total_atribut; j++)
			tmp_data[j] =  data[i][j];
		jarak[i].index = i;
		jarak[i].jaraknya = euclidean_distance(tmp_data, kasus, total_atribut);
	}

	printf("\n >>> Data jarak sebelum diurutkan :\n");
	display_table(data, jarak, total_atribut, total_dataset, false, K);
	
	std::sort(jarak, jarak+total_dataset, acompare);

	printf("\n >>> Data jarak setelah diurutkan :\n");
	display_table(data, jarak, total_atribut, total_dataset, true, K);

	for(int i=0; i<K; i++)
		hasil[data[jarak[i].index][total_atribut]]++;
	
	printf("\n");
	for(int i=0; i<total_class; i++){
		printf(" > Jumlah class ke-%d (\"%s\") -> %d\n", i+1, class_name[i], hasil[i]);
	}

	int maks = -1, maks_index = 0;
	for(int i=0; i<total_class; i++)
		if(hasil[i] > maks){
			maks = hasil[i];
			maks_index = i;
		}

	display_hasil(kasus, class_name, total_atribut, maks_index);
	
	return 0;
}

void input_data1(int *a, int *b, int *c){
	printf("> Jumlah atribut\t: "); scanf("%d", a);
	printf("> Jumlah dataset\t: "); scanf("%d", b);
	printf("> Jumlah class\t\t: "); scanf("%d", c);
}

void input_data2(char class_name[][100], int total_class){
	printf("  (Masukkan nama class)\n");
	for(int i=0; i<total_class; i++){
		printf("  > Class %d (nilai %d) : ", i+1, i);
		scanf("%s", class_name[i]);
	}
}

void input_dataset(int data[][100], int a, int b, int n){
	printf("Masukkan data");
	printf("\n( ");
	for(int i=0; i<n; i++)
		printf("atribut%d ", i+1);
	printf("class )\n");
	for(int i=0; i<a; i++)
		for(int j=0; j<b+1; j++){
			scanf("%d", &data[i][j]);
		}
}

void input_kasus(int *a, int b, int n){
	printf("> Masukkan contoh kasus\t: ");
	printf("\n  ( ");
	for(int i=0; i<n; i++)
		printf("atribut%d ", i+1);
	printf(")\n  > ");
	for(int i=0; i<b; i++)
		scanf("%d", &a[i]);
}

void input_K(int *K){
	printf("> Masukkan nilai K\t: "); scanf("%d", K);
}

void display_table(int data[][100], hasil_jarak *jarak, int n, int m, bool flag, int k){
	garis;
	printf("|     Index\t|         Jarak\t\t|     Class\t|\n");
	garis;
	for(int i=0; i<m; i++){
		printf("|\t%d\t", jarak[i].index);
		printf("|\t%lf\t", jarak[i].jaraknya);
		printf("|\t%d\t|\n", data[jarak[i].index][n]);
		if(flag and i==k-1)
			garis2;
	}
	garis;
}

void display_hasil(int *kasus, char class_name[][100], int n, int m){
	printf("\n");
	printf(" > Kesimpulan class dari kasus (");
		for(int i=0; i<n; i++){
			printf("%d", kasus[i]);
			if(i!=n-1)
				printf(", ");
		}
	printf(") adalah \"%s\"\n\n", class_name[m]);
}

double euclidean_distance(int *data, int *kasus, int n){
	int tmp=0;
	for(int i=0; i<n; i++){
		tmp += pow((data[i]-kasus[i]), 2);
	}
	return sqrt(tmp);
}

/*
4
12
2
0 0 0 0 0
0 0 0 1 0
1 0 0 0 1
2 1 0 0 1
2 2 1 0 1
2 2 1 1 0
1 2 1 1 1
0 1 0 0 0
0 2 1 0 1
2 1 1 0 1
0 1 1 1 1
1 1 0 1 1
2 1 0 1
3
*/

以上是关于c_cpp K-NN.cpp的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 200.岛屿数量

c_cpp 127.单词阶梯

c_cpp MOFSET

c_cpp MOFSET

c_cpp 31.下一个排列

c_cpp string→char *