인공지능/공부

모두를 위한 머신러닝 과제2 - k means 진행, 계산

이게될까 2024. 5. 20. 21:44
728x90
728x90

[과제 내용]

2차원 특징 공간 상에서 다음과 같이 6개의 데이터가 주어졌을 ,

(–1, 1), (0, 0.5), (1, 1), (–1, –0.5), (0, –1), (1, –0.5)

 데이터들을 K-means 클러스터링 알고리즘을 사용하여 2개의 클러스터로 군집화하고자 한다.

랜덤하게 초기화한 클러스터 1 2 중심이 각각 (–1 ,1) (1, –0.5) 라고 하였을 , 다음 질문에 답하시오:

 

      (1)   데이터들과 클러스터 중심의 초기값들을 2차원 특징 공간 상에 함께 표시하고 데이터 포인트들이 어느 클러스터에 속하는지 판단하여 다음 표를 완성하시오:

일단 컴퓨터 계산

손 계산도 한번 해보겠습니다...

[0 2.5

1.118 1.414

2 1.5

1.5 2

2.236 1.118

2.5  0]인거 보면 잘 맞추네요 ㅎㅎ...

클러스터 배분은 위와 같이 되겠네요

        (2)  클러스터 중심을 이동시키고 업데이트 된 클러스터 중심의 값을 구하시오.

그럼 평균값으로 클러스터를 이동하면!

     (3)  업데이트 된 클러스터 중심을 2차원 특징 공간 상에 데이터들과 함께 표시하고, 각 데이터 포인트들이 어느 클러스터에 속하는지 판단하여 다음 표를 완성하시오:

     

 

    (4)  각 클러스터 중심의 업데이트가 필요한가? 만일 필요하다면 업데이트된 클러스터 중심의 값을 구하시오. 만일 필요하지 않다면, 그 이유를 설명하시오.

필요없다! 클러스터에 속한 요소들이 변하지 않아 중심점이 이동하지 않았기 때문!

(     (5) 새로운 데이터 (0, 0), (2, 0), (0, 1) 주어졌을 ,  데이터들과 클러스터 중심을 2차원 특징 공간 상에 함께 표시하고,  데이터들이 어느 클러스터에 속하는지 판단하여 다음 표를 완성하시오:

     

 

import matplotlib.pyplot as plt
import numpy as np

# 데이터 포인트와 초기 클러스터 중심 정의
data = np.array([[-1, 1], [0, 0.5], [1, 1], [-1, -0.5], [0, -1], [1, -0.5]])
centroids = np.array([[-1, 1], [1, -0.5]])

def plot_clusters(data, centroids, clusters, iteration):
    plt.figure(figsize=(8, 6))
    plt.scatter(data[:, 0], data[:, 1], c=clusters, cmap='viridis', marker='o', label='Data Points')
    plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='x', s=100, label='Centroids')
    plt.title(f'Iteration {iteration}')
    plt.xlabel('$x_1$')
    plt.ylabel('$x_2$')
    plt.legend()
    plt.grid(True)
    plt.show()
    
    
def kmeans(data, centroids):
    for iteration in range(1, 11):  # 최대 10번의 반복
        # 각 데이터 포인트와 클러스터 중심 사이의 거리 계산
        distances = np.linalg.norm(data[:, np.newaxis] - centroids, axis=2)
        print("distances",distances)
        # 각 데이터 포인트를 가장 가까운 클러스터에 할당
        clusters = np.argmin(distances, axis=1)
        print("clusters",clusters)
        plot_clusters(data, centroids, clusters, iteration)
        
        # 새로운 클러스터 중심 계산
        new_centroids = np.array([data[clusters == k].mean(axis=0) for k in range(centroids.shape[0])])
        print("new_centroids",new_centroids)
        # 클러스터 중심이 변하지 않으면 종료
        if np.all(centroids == new_centroids):
            break
        
        centroids = new_centroids

# K-means 클러스터링 수행 및 시각화
kmeans(data, centroids)

진행한 코드

 

728x90