アセットマネージャーのためのファイナンス機械学習:クラスタリング 練習問題 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