K-mean 클러스터링 알고리즘 질문 드립니다.
Sonya
질문 제목 : k-mean 클러스터링 알고리즘 질문 드립니다.main함수 구현에 대한 질문질문 내용 : 안녕하세요 졸업 작품 으로 k-mean 알고리즘을 사용하게 되었는데 main함수 구현이 잘안되서 질문 드립니다. 대충 k-mean 알고리즘 은 만약 data가 5개 이고 값은 (4,4)/(8,4)/(15,8)/(24,4)/(24,12)이렇게 있으면 2개 클러스터로 나눠서 초기 중심값을 1번=(4,4) / 2번=(8,8)로 잡아서 각 데이터의 거리를 구해 클러스트링 합니다. 클러스트링 하는 방법은 (x,y)좌표를 유클리드 거리기법으로 가까운걸 찾는것입니다. 한번 클러스트링은 하게 되면
1번=(4,4) 2번=(8,4)
(4,4) 0 4
(8,4) 40
(15,8)11.70 8.06
(24,4) 2016
(24,12) 21.54 17.88
그러면 데이터(4,4)는 1번과 가깝고 나머지는 2번가 가까워 집니다. 그리고 왜곡 값을 구하면 28.06이 되고(식은 소스에 첨부)다시 새로 운 중심 값을 찾는데 1번은 (4,4)이고 2번은 (8+15+24+24/4),(4+8+4+12)/4 = (17.75 , 7)에 다시 중심값을 둬서 반복하고 왜곡 값이 0이되거나 변화가 없으면 종료하는 소스입니다. 계산 식을 구했는데 main로 어떻게 빼야하는지 모르겠습니다 ㅠ 도와주시면 정말 감사하겠습니다.(main함수 구현을 못하겟어요)
#include stdio.h
#include stdlib.h
#include assert.h
#include float.h
#include math.h
/*
** parameter
** double **data : [데이터의 수][데이터 차원수]로 이루어진 데이터 배열
** int n : 데이터의 수
** int m : 데이터의 차원
** int k : 클러스터의 수
** double t : 왜곡이 안정되었는지에 대한 기준치
** double **centroids : 초기 센터 값[클러스터 수][클러스터 차원 수]으로 이루어진 배열
**
** return
** 각 데이터들이 속한 클러스터 라벨
*/
int *k_means(double **data, int n, int m, int k, double t, double **centroids)
{
// 클러스터라벨 저장을 위한 배열 동적할당 (데이터의 수만큼)
int *labels = (int*)calloc(n, sizeof(int));
int h, i, j;
int *counts = (int*)calloc(k, sizeof(int));
double old_error, error = dbl_max; // squared euclidean distance
double **c = centroids ? centroids : (double**)calloc(k, sizeof(double*));
double **c1 = (double**)calloc(k, sizeof(double*));
for (h = i = 0; i k; h += n / k, i++) {
c1[i] = (double*)calloc(m, sizeof(double));
if (!centroids) {
c[i] = (double*)calloc(m, sizeof(double));
}
// 초기 센터 값 저장
for (j = m; j-- 0; c[i][j] = data[h][j]);
}
do {
// 지난과정에서의 거리 합 저장, 새로운 거리 합 0 초기화
old_error = error, error = 0;
for (i = 0; i k; counts[i++] = 0) {
for (j = 0; j m; c1[i][j++] = 0);
}
for (h = 0; h n; h++) {
// 각 센터값과의 유사도(거리)를 비교하여 가장 유사한 클러스터에 배치
double min_distance = dbl_max;
for (i = 0; i k; i++) {
double distance = 0;
for (j = m; j-- 0;
distance += pow(data[h][j] - c[i][j], 2));
if (distance min_distance) {
labels[h] = i;
min_distance = distance;
}
}
for (j = m; j-- 0; c1[labels[h]][j] += data[h][j]);
counts[labels[h]]++;
// 각 클러스터의 데이터와 센터까지의 유사도 합
error += min_distance;
}
// 새로운 센터 값
for (i = 0; i k; i++) {
for (j = 0; j m; j++) {
c[i][j] = counts[i] ? c1[i][j] / counts[i] : c1[i][j];
}
}
} while (fabs(error - old_error) t);
for (i = 0; i k; i++) {
if (!centroids) {
free(c[i]);
}
free(c1[i]);
}
if (!centroids) {
free(c);
}
free(c1);
free(counts);
return labels;
}
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2676182 | 숫자 순서대로 배열하는법 | 권뉴 | 2024-11-24 |
2676152 | 기본적인거 하나 질문드립니다. | 개미 | 2024-11-24 |
2676124 | 함수선언관련 질문이에요~...털썩..수정완료 (2) | 가지 | 2024-11-24 |
2676092 | C언어 책 (2) | 아서 | 2024-11-24 |
2676065 | 웹사이트 또는 메신저 등에서 원하는 텍스트를 검사하는방법?? (1) | 모든 | 2024-11-23 |
2676033 | 배열 기초연습중 발생하는 에러 ㅠㅜ... | Creative | 2024-11-23 |
2676005 | keybd_event 게임 제어 | 영글 | 2024-11-23 |
2675900 | 진짜기본적인질문 | 글길 | 2024-11-22 |
2675845 | 수정좀해주세요ㅠㅠㅠ | 해골 | 2024-11-21 |
2675797 | 병합 정렬 소스 코드 질문입니다. (2) | 도래솔 | 2024-11-21 |
2675771 | 큐의 활용이 정확히 어떻게 되죠?? | 해긴 | 2024-11-21 |
2675745 | 도서관리 프로그램 질문이요 | 도리도리 | 2024-11-20 |
2675717 | 2진수로 변환하는것! (3) | 동생몬 | 2024-11-20 |
2675599 | for문 짝수 출력하는 법 (5) | 널위해 | 2024-11-19 |
2675575 | Linux 게시판이 없어서.. | 첫삥 | 2024-11-19 |
2675545 | 구조체 이용할 때 함수에 자료 넘겨주는 것은 어떻게 해야 하나요? | 아연 | 2024-11-19 |
2675518 | 사각형 가로로 어떻게 반복해서 만드는지좀.. 내용 | 신당 | 2024-11-18 |
2675491 | !느낌표를 입력하는것은 어떻게합니까~~?ㅠㅠ (5) | 사지타리우스 | 2024-11-18 |
2675411 | 파일입출력으로 받아온 파일의 중복문자열을 제거한 뒤 파일출력 | 앨버트 | 2024-11-17 |
2675385 | 링크드리스트 주소록 질문드립니다. (1) | 겨루 | 2024-11-17 |