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;
}
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2692256 | scanf("%*c"); ㅠㅠ 고수님들 | 거북이 | 2025-04-21 |
2692230 | 하노이탑 질문입니다. (1) | 미쁘다 | 2025-04-21 |
2692210 | 정보 올림피아드 문제인데.. 풀이 과정이 궁금합니다.(재귀함수) (5) | 물티슈 | 2025-04-20 |
2692144 | C언어와 리눅스에 대한 질문입니다. | 싴흐한세여니 | 2025-04-20 |
2692114 | 컨텍스트 스위칭하는데 걸리는 시간 측정.. | YourWay | 2025-04-19 |
2692086 | 간접참조 연산자, 증감연산자 질문이용! (2) | 블랙캣 | 2025-04-19 |
2692056 | 주석좀 달아주세요. 몇개적엇는데 몇개만달아주세요. (2) | DevilsTears | 2025-04-19 |
2691978 | 진수 쉽게 이해하는법... (3) | 지지않는 | 2025-04-18 |
2691949 | getchar() 한 문자를 입력받는 함수 질문 | 채꽃 | 2025-04-18 |
2691919 | 배열 정렬 및 합치기 질문입니다. | 사과 | 2025-04-18 |
2691845 | c언어왕초보 질문이 있습니다........ | 루나 | 2025-04-17 |
2691815 | void add(int num); 함수... (4) | 살랑살랑 | 2025-04-17 |
2691756 | 명령 프롬프트 스크롤바가 없어요 | 두메꽃 | 2025-04-16 |
2691725 | 자료구조에 관련해서 질문이 있어 글을 올립니다. | 누리알찬 | 2025-04-16 |
2691697 | if 문에서 구조체 배열에 저장되있던 문자열 검사하는 법 ? (2) | 민트맛사탕 | 2025-04-16 |
2691678 | C언어 함수 질문이요~!!! | 연보라 | 2025-04-15 |
2691650 | 반복문 | 돋가이 | 2025-04-15 |
2691618 | 링크드리스트 개념 질문이예요 (3) | 맨마루 | 2025-04-15 |
2691592 | 동적할당 이용 배열선언 질문입니다.ㅠㅠ (3) | 허리달 | 2025-04-15 |
2691542 | /=의 용도를 알려주세요 ㅠㅠ! (2) | 아라 | 2025-04-14 |