수다닷컴

  • 해외여행
    • 괌
    • 태국
    • 유럽
    • 일본
    • 필리핀
    • 미국
    • 중국
    • 기타여행
    • 싱가폴
  • 건강
    • 다이어트
    • 당뇨
    • 헬스
    • 건강음식
    • 건강기타
  • 컴퓨터
    • 프로그램 개발일반
    • C언어
    • 비주얼베이직
  • 결혼생활
    • 출산/육아
    • 결혼준비
    • 엄마이야기방
  • 일상생활
    • 면접
    • 취업
    • 진로선택
  • 교육
    • 교육일반
    • 아이교육
    • 토익
    • 해외연수
    • 영어
  • 취미생활
    • 음악
    • 자전거
    • 수영
    • 바이크
    • 축구
  • 기타
    • 강아지
    • 제주도여행
    • 국내여행
    • 기타일상
    • 애플
    • 휴대폰관련
  • 프로그램 개발일반
  • C언어
  • 비주얼베이직

K-mean 클러스터링 알고리즘 질문 드립니다.

Sonya

2023.04.01

질문 제목 : 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;
}

신청하기





COMMENT

댓글을 입력해주세요. 비속어와 욕설은 삼가해주세요.

번호 제 목 글쓴이 날짜
2700695 간단한 메모장 구현을 할려고 하는데요 (9) 늘솜 2025-07-07
2700668 c언어 질문입니다. 도와주세요~ (3) 가자 2025-07-07
2700639 한글입력받아서 ㄱㄴㄷ순서대로출력하는법좀 두빛나래 2025-07-06
2700610 정말 기초적인 더하기,여백 문제 help 무슬 2025-07-06
2700562 함수포인터에서요 (7) 소심한여자 2025-07-06
2700530 전처리문 질문입니다. (1) 아놀드 2025-07-05
2700510 c언어를 어케하면 잘할수 있을까요.. 연연두 2025-07-05
2700484 두 개가 차이가 뭔지 알려주세요...(소수 찾는 프로그램) (2) 날위해 2025-07-05
2700426 인터넷 창 띄우는 질문이요 (1) 정훈 2025-07-04
2700400 원넓이를 계산이요 ㅜㅜ 천칭자리 2025-07-04
2700368 if에 관해서 질문이요... Orange 2025-07-04
2700339 이거 결과값이 왜이런건지.. (4) 그댸와나 2025-07-04
2700313 파일 읽어서 저장하는데 빈파일일 경우 문재가 발생하네요.. (2) 크나 2025-07-03
2700287 구조체 동적할당 연습을 하는데 오류가 뜹니다...(해결) (3) 아련나래 2025-07-03
2700264 문자와 숫자 동시에 입력??? 글고운 2025-07-03
2700236 txt파일로만 쓰고 읽게 하려면 어떻게 해야 하나요..?? (8) 미국녀 2025-07-03
2700211 전위 연산자 (2) 어른처럼 2025-07-02
2700183 C에서 파일이름을 받고, 그 파일의 사이즈를 출력해줘야하는데 내용이 출력이 안되네요 ;ㅅ; 피스케스 2025-07-02
2700150 꼭좀 도와주세요ㅠㅠㅠ 호습다 2025-07-02
2700095 연산문제...질문... 오빤테앵겨 2025-07-01
<<  이전  1 2 3 4 5 6 7 8 9 10  다음  >>

수다닷컴 | 여러분과 함께하는 수다토크 커뮤니티 수다닷컴에 오신것을 환영합니다.
사업자등록번호 : 117-07-92748 상호 : 진달래여행사 대표자 : 명현재 서울시 강서구 방화동 890번지 푸르지오 107동 306호
copyright 2011 게시글 삭제 및 기타 문의 : clairacademy@naver.com