혼합 고스 모형을 연구했다(그 1)

이것은 내가 최근에 군집을 연구할 때 만난 혼합 고스 모델(GMM)에 관한 연구이다.
※ 지금 제 이해를 적었기 때문에 잘못된 부분도 있을 수 있습니다.이런 상황에서 지적할 수 있다면 나는 매우 기쁠 것이다.

혼합 고스 모형의 특징

  • 분류 방법 중의 하나
  • 어떤 집단에 속하는 데이터 군이 고스 분포를 따른다고 가정한다
  • 고스 분포는 무엇입니까?


    고스 분포는 정적 분포의 별명이다.
    정적 분포는 평균 $\mu$와 방차 $\sigma$의 매개 변수를 지정하여 그 모양의 확률 분포를 결정합니다.
    그 형상은 아래와 같이 좌우 대칭의 산 형상을 띠고 있다.

    산꼭대기 부분의 평균값은 $\mu$이고 산의 너비는 $\sigma$입니다.
    다음 방식을 통해python을 사용하여 고스 분포(정적 분포)에 부합되는 무작위 데이터를 생성할 수 있다.
    # ガウス分布に従うランダムなデータを生成
    import numpy.random as rnd
    data = rnd.normal(0,10,50)
    # 結果を散布図で可視化
    import matplotlib.pyplot as plt
    plt.scatter(data,[0 for i in range(50)])
    
    rnd.normal(mu,sigma,array_size) 첫 번째 파라미터의 평균 $\mu$, 두 번째 파라미터의 분포 $\sigma$, 세 번째 파라미터의 출력 데이터 크기를 지정합니다.
    1차원 데이터를 생성할 때, 예를 들어 다음과 같다.

    2차원이면 이런 느낌이야.
    # ガウス分布に従うランダムなデータを生成
    import numpy.random as rnd
    data = rnd.normal(0,10,(50,2))
    # 結果を散布図で可視化
    import matplotlib.pyplot as plt
    plt.scatter(data[:,0],data[:,1])
    plt.xlim(-30,30)
    plt.ylim(-30,30)
    

    3차원이면 이런 느낌이야참조 URL
    from mpl_toolkits.mplot3d import Axes3D
    import numpy.random as rnd
    data = rnd.normal(0,10,(200,3))
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    ax.scatter(data[:,0],data[:,1],data[:,2])
    

    인상상 1차원이면 산이고 2차원은 원, 3차원은 공의 느낌이다.(모두 중심이 깊음)
    4차원 이상은 가시화할 수 없지만 같은 인상이면 좋을 것 같아요.

    혼합 고스 모형


    혼합 고스 모델에서 가설적으로 주어진 데이터는 몇 개의 집단에 의해 구축되어야 하며 모든 집단은 고스 분포를 바탕으로 생성된다.
    이 가설 아래 각 집단이 어떤 고스 분포로 표시할 수 있는지 추측하는 방법이다.
    위에서 설명한 바와 같이, 고스 분포 (정적 분포) 는 평균 $\mu$와 방차 $\sigma$를 확인하여 그 모양을 확인하기 때문에 내부에서 이 인자들을 추정합니다.

    해보다


    예를 들어 다음과 같은 데이터가 있다고 가정한다.

    이 데이터는 두 가지 서로 다른 고스 분포에 따라 생성된 데이터로 다음과 같다.
    import numpy.random as rnd
    data1 = rnd.normal(0,10,50) # 平均0、分散10
    data2 = rnd.normal(-40,10,50) # 平均-40、分散10
    data_all = np.append(data1,data2)
    plt.scatter(data_all,[0 for i in range(100)])
    
    산에서 가시화되면 다음과 같은 느낌이다.

    실제로 상술한 데이터는 scikit-learn의 혼합 고스 모델의 설치이다GaussianMixuture 반에서 해답을 시도했다.
    # 混合ガウスモデルでクラスタリングと可視化
    from sklearn.mixture import GaussianMixture
    from matplotlib import cm
    # 想定するクラスタ数
    cluster_num = 2
    # データのshapeをあわせる(もっとうまいことできるはず。。。)
    data_all = data_all.reshape((100,1))
    data_all_2d = np.concatenate([data_all,np.zeros((100,1))],axis=1)
    data_all_2d = data_all_2d.reshape((100,2))
    # 各クラスタ用のガウス分布のパラメータを推定してデータをクラスタリング
    pred = GaussianMixture(n_components=cluster_num).fit_predict(data_all_2d)
    # 可視化
    for i in range(cluster_num):
        cluster_datas = data_all_2d[pred==i]
        color = cm.jet(i/cluster_num)
        plt.scatter(cluster_datas[:,0],cluster_datas[:,1],c=color,label='cluster {}'.format(i))
    plt.legend()
    plt.plot()
    
    결과는 다음과 같다.

    확실히 두 개의 집단으로 나눌 수 있다.

    여러 가지 데이터로 해봤어요.


    (2D 데이터)
    다음은 분류하기 좋은 예이다.



    [분류가 잘 안 되는 예]

    혼합 고스 모델의 정의를 보면 명백히 알 수 있지만 고스 분포에 따르지 않는 상술한 데이터는 정확하게 분류할 수 없다.
    (3D 데이터)
    이것이 바로

    이렇게 되다

    이것도 잘 모르겠지만 고스 분포에 따라 3개의 데이터가 생성되어 정확하게 분류할 수 있다.
    길어질 것 같아저것 계속.

    좋은 웹페이지 즐겨찾기