アセットマネージャーのためのファイナンス機械学習:クラスタリング 練習問題 CGIS,エルボー法

MSCIのCGIS業務分類は、主とする事業活動により、セクター、インダストリーグループ、インダストリー、サブインダストリーの四段階に分けられており、階層型クラスタリングである。重要なファクターである収支と市場での認識度を基にも毎年見直されている。

エルボー法は、目的関数がクラスタ数に関して単純増加、または単純減少に従う場合にのみ有効であり、シルエット係数を用いた目的関数$${S_i}$$には使えない。また、結果のクラスタ数は閾値に強く依存する。

def Elbow(corr0,maxNumClusters=None,n_init=10,th_del=.2):
    if maxNumClusters==None:
        maxNumClusters=corr0.shape[1]-1
    x=((1-corr0.fillna(0))/2.)**.5 # the distance matrix
    score=np.nan;
    kmeans, stat = None, None
    for i in range(2,maxNumClusters+1): # find clusters from 2,3...maxNumClusters
        kmeans_=KMeans(n_clusters=i, init='k-means++',n_init=n_init)
        kmeans_=kmeans_.fit(x)
        score_=kmeans_.inertia_
        if np.isnan(score) or score-score_>th_del:
                print(i, score_, score, score-score_, th_del)
                score,kmeans=score_,kmeans_
        else:
            break
            
    newIdx=np.argsort(kmeans.labels_)
    corr1=corr0.iloc[newIdx]
    corr1=corr1.iloc[:,newIdx]
    clstrs={i:corr0.columns[np.where(kmeans.labels_==i)[0]].tolist()
                           for i in np.unique(kmeans.labels_)}
    return corr1, clstrs


いいなと思ったら応援しよう!