파이썬 프로그래밍 : 클러스터링 결과를 3D 산점도에 그려 보았습니다.

소개



과거 기사 ( 위키피디아의 데이터를 사용하여 word2vec을 해보자 {4. 모델 응용편} )에서는 word2vec 모델의 다차원 벡터를 사용하여 단어의 비 계층 적 클러스터링을했습니다.
이번에는 비계층형 클러스터링의 결과를 보여주는 방법을 바꾸어 3D 산점도를 그립니다.

궁극적으로 다음과 같은 물건을 만듭니다.


본고에서 소개하는 것


  • 3D 산점도 그리기

  • Plotly Python Graphing Library | Python | Plotly

    본고에서 소개하지 않는 것


  • Python 라이브러리 사용법
  • scikit-learn
  • pandas
  • matplotlib
  • plotly ※ 그래프 그리기 용 Python 라이브러리


  • 샘플 코드



    비계층형 클러스터링을 실행할 때까지는 과거 기사 를 참고되었고.
    클러스터링 결과에서 시각화하는 Code에 중점을 둡니다.

    코드 소개



    우선은 PCA에서 차원 압축을 하는 부분입니다.
    차원 수 지정을 변경하고 실행하면 됩니다.

    analyzeWiki_Word2Vec1
    from sklearn.decomposition import PCA
    import pandas as pd
    import matplotlib.pyplot as plt
    
    #PCAで3次元に圧縮
    pca = PCA(n_components=3)
    pca.fit(df.iloc[:, :-2])
    feature = pca.transform(df.iloc[:, :-2])
    
    #日本語フォントの指定
    plt.rcParams["font.family"] = 'Yu Gothic'
    
    #散布図プロット
    color = {0:"green", 1:"red", 2:"yellow", 3:"blue"}
    colors = [color[x] for x in cluster_labels]
    plt.figure(figsize=(20, 20))
    for x, y, name in zip(feature[:, 0], feature[:, 1], df.iloc[:, -2]):
        plt.text(x, y, name)
    plt.scatter(feature[:, 0], feature[:, 1], color=colors)
    plt.savefig("../result/word_clustering_scatter2.png")
    plt.show()
    

    당연하지만 2D 산점도라면 결과는 같습니다.


    다음으로 3D 산점도를위한 데이터 가공입니다.

    analyzeWiki_Word2Vec2
    feature_df = pd.DataFrame(feature)
    #feature_df.head()
    feature_df["word"] = words
    feature_df["cluster"] = cluster_labels
    #feature_df
    

    그리고 이 논문의 주제, 3D 산점도를 그립니다.

    analyzeWiki_Word2Vec3
    import plotly
    import plotly.express as px
    
    plotly.offline.init_notebook_mode(connected=False)
    
    fig = px.scatter_3d(feature_df, x=0, y=1, z=2, text="word", color='cluster', symbol='cluster', opacity=0.7)
    fig.update_layout(margin=dict(l=0, r=0, b=0, t=0))
    plotly.offline.plot(fig, filename='../result/word_clustering_scatter2.html', auto_open=True)
    

    그러면 시작 부분에 표시된 화면이 표시됩니다.


    Plotly를 이용한 이유가 여기에서 발휘됩니다.
    Plotly로 그린 3D 산포도는, 화면상에서 확대·축소는 물론, 회전도 할 수 버립니다!

    조속히 회전을 해 보면 matplotlib로 그린 2D 산포도와 비슷한 단면이 나타났습니다.


    좀 더 회전해 보고, “도쿄”와 “일본”, 그리고 3 도시(”가나가와”, “치바”, “사이타마”)와의 위치 관계를 찾아봅니다.

    첫째, 국가("일본", "미국", "독일")는 대체로 같은 평면에 존재했다.
    이미지에서는 알기 어려울지도 모르지만, 도쿄도 3 도시도, 나라의 평면과는 다른 장소에 위치하고 있습니다.


    그리고 다른 각도에서.
    세 도시는 대체로 같은 평면에 존재했다. 하지만 같은 평면상으로 "도쿄"는 존재하지 않았습니다.
    "도쿄"는 국가의 평면과 도시의 평면 모두 다른 장소에 위치하고 있습니다.


    Plotly, 매우 강력하네요.
    3D 산포도를 다루었습니다만, 그 이외의 이용에도 대응한, 범용적인 그래프화 툴입니다! ! !

    그건 그렇고
    word2vec 모델에서도 단어의 유사도는 어떻게 되어 있는가 하면 다음과 같았습니다.
    다차원 벡터 공간상에서도, “도쿄”는 3 도시에 비해, “일본” 쪽이 유사도가 높아지고 있었습니다.

    analyzeWiki_Word2Vec4
    $ model.wv.similarity('東京', '日本')
    0.329558
    $ model.wv.similarity('東京', '神奈川')
    0.2497174
    $ model.wv.similarity('東京', '千葉')
    0.25432715
    $ model.wv.similarity('東京', '埼玉')
    0.21400008
    

    요약



    word2vec 모델(다차원 벡터)의 클러스터링 결과를 시각화하는 방법, 3차원 공간상에 산포도를 그리는 방법을 소개.

    좋은 웹페이지 즐겨찾기