引き続き、教師なしモデルになります。
自分が知っているモデルメインになりますが。。。
1.K近傍法
モデル名 | K-Neighbor |
---|---|
目的 | クラスタリング |
調整すべき主なパラメーター | n_neighbors:周囲n個のデータポイントの 多数決で、あるデータのクラスを 決定する。 |
データ標準化が必要か? | はい |
ハズレ値に対しては | 弱い |
コマンド | sklearn.neighbors.KNeighborsClassifier |
特徴(損失関数など) | 与えられた学習データをベクトル空間上にプロットしておき、 未知のデータが得られたら、そこから距離が近い順に 任意のn個を取得し、その多数決でデータが属するクラスを 推定する。 |
利点 | アルゴリズムがシンプルで計算量少ない。 |
欠点 | nの数次第で結果が変わる。 単純なアルゴリズムであり、精度は高くない。 |
sklearnのドキュメント | https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html |
その他 | nを増やしすぎて、データポイント全体の数と等しくなってしまうと、 もはやデータ全体の中で最も数が多いクラスを出力するだけになるので注意 |
sklearnのドキュメント | こちら |
その他 | coefs_[i]で、i番目のレイヤの回帰係数を取り出せる intercepts_[i]で、切片(バイアス)項を取り出せる |
2.K-Means
モデル名 | K-Means |
---|---|
目的 | クラスタリング |
調整すべき主なパラメーター | n_clusters:初期のランダムに生成したクラスタ重心数を何個に設定するか ※default=8 random_state:乱数seedを与えることで生成クラスタの再現性を担保できる init: k-means++を使いたい場合は、‘k-means++’と指定する。※default=random (初期のクラスタ重心点をランダムではなく、なるべく互いに離れた位置に設定) |
データ標準化が必要か? | はい |
ハズレ値に対しては | 弱い |
コマンド | sklearn.cluster.Kmeans |
特徴(損失関数など) | (1)各点xiに対してランダムにクラスタを割り振る (2)各クラスタに割り当てられた点について重心を計算する (3)各点について上記で計算された重心からの距離を計算し、 距離が一番近いクラスタに割り当て直す。 (4)2.と3.の工程を、割り当てられるクラスタが変化しなくなるまで行う |
利点 | アルゴリズムがシンプルで計算量少なく、解釈性が高い。 |
欠点 | 初期点をランダムに選択する場合、初期点の選択次第で性能が大幅に変わる。ハズレ値に弱い。 |
sklearnのドキュメント | https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html |
その他 | こちらがわかりやすい http://tech.nitoyon.com/ja/blog/2013/11/07/k-means/ |
sklearnのドキュメント | |
その他 | coefs_[i]で、i番目のレイヤの回帰係数を取り出せる intercepts_[i]で、切片(バイアス)項を取り出せる |
3.X-Means
モデル名 | X-Means |
---|---|
目的 | クラスタリング |
調整すべき主なパラメーター | xmeans(data=X_std, initial_centers=xm_c, kmax=20, ccore=True) data:入力X initial_centers:初期重心 kmax: 求める重心数の上限 |
データ標準化が必要か? | はい |
ハズレ値に対しては | 弱い |
コマンド | from pyclustering.cluster.xmeans import xmeans from pyclustering.cluster.center_initializer import kmeans_plusplus_initializer |
特徴(損失関数など) | Kmeansの改良版。 (1)クラスター数Kを自動決定する (2)k-meansをデータ数が多くても 高速に動くアルゴリズムに工夫する という点が、従来のk-meansとの差分。 発見的な方法に拠らずk-meansのおおよそ2倍強の計算量で最適なクラスター数を求めることができる。 |
利点 | 最適なクラスタ数を自動決定できる。 |
欠点 | k-meansの欠点(初期値依存性)をひきづっている |
sklearnのドキュメント | sklearnでは実装されてない |
その他 | 以下にサンプル実装を掲載 |
#XMeansで、クラスター数Kを自動決定する
#pyclusteringのinstall
!pip install pyclustering
import numpy as np
import matplotlib.pyplot as plt
from pyclustering.cluster.xmeans import xmeans
from pyclustering.cluster.center_initializer import kmeans_plusplus_initializer
xm_c = kmeans_plusplus_initializer(X_std,2).initialize()#クラスター数の初期値を設定
#data=X_std(正規化が済んでいることが前提)
xm_i = xmeans(data=X_std, initial_centers=xm_c, kmax=10, ccore=True)#xmeansによって最適な重心を求める。kmaxでクラスタ数上限をset
xm_i.process()
# 結果をプロット
z_xm = np.ones(X_std.shape[0])
for k in range(len(xm_i._xmeans__clusters)):
z_xm[xm_i._xmeans__clusters[k]] = k+1
plt.subplot(1, 1, 1)
centers = np.array(xm_i._xmeans__centers)
plt.scatter(centers[:,0],centers[:,1],s=250, marker='*',c='red')
plt.show()
#重心の数
xm_c[0].size
4.PCA
モデル名 | PCA |
---|---|
目的 | 次元削減 |
調整すべき主なパラメーター | n_components:元々のXの次元数を、何次元にまで縮約するか whiten: True/False 白色化を行うかどうか。Default:false ※白色化については以下参照 https://panda-clip.com/pca-white/#index_id1 |
データ標準化が必要か? | はい |
ハズレ値に対しては | 弱い |
コマンド | sklearn.decomposition.PCA |
特徴(損失関数など) | データの次元を削減するために用いられる。 データをn次元空間にプロットした時、そのデータのばらつきが 最大になるような新しいベクトル(第1主成分)をみつけ、 そのベクトルと直交し、かつデータのばらつきが最大になるような ベクトル(第2主成分)をみつける。以降、同じ処理を、縮約したい次元数まで繰り返す。 第n主成分上に射影された、元のデータは、元のデータの情報量(この場合、分散)のうちのいくらかを保持している。(累積寄与率) 例えば第1主成分上で、元のデータの分散の8割を保持しているならば、そのデータを1次元に縮約しても大きく情報は失われない。 逆に、多くの主成分を構築しても、元のデータの分散のうち、少ない割合しか保持していないのならば、大きく情報が失われている、ということになる。一般的に、どの次元まで縮約するかは、 第n主成分までで、元のデータの分散をどれだけ含むか?で決める。 |
利点 | ・特徴量Xの次元が大きい場合(画像なども含む) 特徴量を削減して、計算を軽くできる。 ・3次元以下に次元を削減することが出来れば、データを可視化可能 ・多数の特徴量があるXを次元削減すれば、 その次元削減したデータで回帰分析することで、精度が上る可能性 もある。 |
欠点 | ・次元削減すると、元のデータの各特徴量は失われ、単に「第n主成分上に射影された特徴量」になってしまうので解釈ができない |
sklearnのドキュメント | https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html |
その他 | ここがわかりやすい https://qiita.com/aya_taka/items/4d3996b3f15aa712a54f |
5.DBSCAN
モデル名 | DBSCAN |
---|---|
目的 | クラスタリング |
調整すべき主なパラメーター | eps:あるデータが、もう一つのデータと 同じクラスタに属すると判定するための、 距離。(この距離圏内なら、同じクラスタと判定) default=0.5 (float) min_samples:自データポイントも含め、クラスタを 構成するためには、eps距離圏内に 最低何個のデータポイントが必要か? default=5(int) |
データ標準化が必要か? | はい |
ハズレ値に対しては | クラスターが再帰的に決定されていくため、外れ値(outlier)の影響を受けにくい |
コマンド | sklearn.cluster.DBSCAN |
特徴(損失関数など) | k-meansと違って,最初にクラスタ数を決めなくてもクラスターを作成できる。 データポイントの近傍の密度を利用して、所属するクラスタを判断する。 また、k-meansと違い、全てのデータが何らかのクラスタに属するように分けられるのではなく、「ノイズ」と判定されるデータポイントが存在するのが特徴。 |
利点 | ・事前にクラスタ数を指定する必要がない ・クラスタに属さない「ノイズ」データも判定可能 |
欠点 | ・eps/min_samplesの設定に敏感 |
sklearnのドキュメント | https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html |
その他 | ここがわかりやすい https://aizine.ai/dbscan-0712/ |