scikitlearnでよく使うモデルとパラメーター（教師なしモデル）

引き続き、教師なしモデルになります。
自分が知っているモデルメインになりますが。。。

1.K近傍法
| モデル名 	| K-Neighbor 	|
|---	|---	|
| 目的 	| クラスタリング 	|
| 調整すべき主なパラメーター 	| n_neighbors：周囲n個のデータポイントの<br>     　　　　　　  多数決で、あるデータのクラスを<br>     　　　　　　  決定する。 	|
| データ標準化が必要か？ 	| はい 	|
| ハズレ値に対しては 	| 弱い 	|
| コマンド 	| sklearn.neighbors.KNeighborsClassifier 	|
| 特徴(損失関数など) 	| 与えられた学習データをベクトル空間上にプロットしておき、<br>     未知のデータが得られたら、そこから距離が近い順に<br>     任意のn個を取得し、その多数決でデータが属するクラスを<br>     推定する。 	|
| 利点 	| アルゴリズムがシンプルで計算量少ない。 	|
| 欠点 	| nの数次第で結果が変わる。<br>     単純なアルゴリズムであり、精度は高くない。 	|
| sklearnのドキュメント 	| https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html 	|
| その他 	| nを増やしすぎて、データポイント全体の数と等しくなってしまうと、<br>     もはやデータ全体の中で最も数が多いクラスを出力するだけになるので注意 	|
| sklearnのドキュメント 	| こちら 	|
| その他 	| coefs_[i]で、i番目のレイヤの回帰係数を取り出せる<br>     intercepts_[i]で、切片（バイアス）項を取り出せる 	|

2.K-Means
| モデル名 	| K-Means 	|
|---	|---	|
| 目的 	| クラスタリング 	|
| 調整すべき主なパラメーター 	| n_clusters：初期のランダムに生成したクラスタ重心数を何個に設定するか   ※default=8<br>     random_state：乱数seedを与えることで生成クラスタの再現性を担保できる<br>     init: k-means++を使いたい場合は、‘k-means++’と指定する。※default=random<br> (初期のクラスタ重心点をランダムではなく、なるべく互いに離れた位置に設定) 	|
| データ標準化が必要か？ 	| はい 	|
| ハズレ値に対しては 	| 弱い 	|
| コマンド 	| sklearn.cluster.Kmeans 	|
| 特徴(損失関数など) 	| (1)各点xiに対してランダムにクラスタを割り振る<br>     (2)各クラスタに割り当てられた点について重心を計算する<br>     (3)各点について上記で計算された重心からの距離を計算し、<br>         距離が一番近いクラスタに割り当て直す。<br>     (4)2.と3.の工程を、割り当てられるクラスタが変化しなくなるまで行う 	|
| 利点 	| アルゴリズムがシンプルで計算量少なく、解釈性が高い。	|
| 欠点 	| 初期点をランダムに選択する場合、初期点の選択次第で性能が大幅に変わる。ハズレ値に弱い。 	|
| sklearnのドキュメント 	| https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html 	|
| その他 	| こちらがわかりやすい<br>     http://tech.nitoyon.com/ja/blog/2013/11/07/k-means/ 	|
| sklearnのドキュメント 	|  	|
| その他 	| coefs_[i]で、i番目のレイヤの回帰係数を取り出せる<br>     intercepts_[i]で、切片（バイアス）項を取り出せる 	|

3.X-Means
| モデル名 	| X-Means 	|
|---	|---	|
| 目的 	| クラスタリング 	|
| 調整すべき主なパラメーター 	| xmeans(data=X_std,   initial_centers=xm_c, kmax=20, ccore=True)<br>     <br>     data:入力X<br>     initial_centers:初期重心<br>     kmax: 求める重心数の上限 	|
| データ標準化が必要か？ 	| はい 	|
| ハズレ値に対しては 	| 弱い 	|
| コマンド 	| from   pyclustering.cluster.xmeans import xmeans<br>     from pyclustering.cluster.center_initializer import   kmeans_plusplus_initializer 	|
| 特徴(損失関数など) 	| Kmeansの改良版。<br>     （１）クラスター数Kを自動決定する<br>     （２）k-meansをデータ数が多くても<br>     　　　高速に動くアルゴリズムに工夫する<br>     という点が、従来のk-meansとの差分。<br>     <br>     発見的な方法に拠らずk-meansのおおよそ2倍強の計算量で最適なクラスター数を求めることができる。 	|
| 利点 	| 最適なクラスタ数を自動決定できる。 	|
| 欠点 	| k-meansの欠点（初期値依存性）をひきづっている 	|
| sklearnのドキュメント 	| sklearnでは実装されてない 	|
| その他 	|  以下にサンプル実装を掲載	|
```python
#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の次元数を、何次元にまで縮約するか<br>     whiten: True/False　白色化を行うかどうか。Default:false<br>     <br>     ※白色化については以下参照<br>     https://panda-clip.com/pca-white/#index_id1 	|
| データ標準化が必要か？ 	| はい 	|
| ハズレ値に対しては 	| 弱い 	|
| コマンド 	| sklearn.decomposition.PCA 	|
| 特徴(損失関数など) 	| データの次元を削減するために用いられる。<br>     データをn次元空間にプロットした時、そのデータのばらつきが<br>     最大になるような新しいベクトル(第１主成分)をみつけ、<br>     そのベクトルと直交し、かつデータのばらつきが最大になるような<br>     ベクトル(第２主成分)をみつける。以降、同じ処理を、縮約したい次元数まで繰り返す。<br>     第n主成分上に射影された、元のデータは、元のデータの情報量(この場合、分散)のうちのいくらかを保持している。（累積寄与率）<br>     例えば第１主成分上で、元のデータの分散の８割を保持しているならば、そのデータを１次元に縮約しても大きく情報は失われない。<br>       逆に、多くの主成分を構築しても、元のデータの分散のうち、少ない割合しか保持していないのならば、大きく情報が失われている、ということになる。一般的に、どの次元まで縮約するかは、<br>     第n主成分までで、元のデータの分散をどれだけ含むか？で決める。 	|
| 利点 	| ・特徴量Xの次元が大きい場合（画像なども含む）<br>     　特徴量を削減して、計算を軽くできる。<br>     ・3次元以下に次元を削減することが出来れば、データを可視化可能<br>     ・多数の特徴量があるXを次元削減すれば、<br>     　その次元削減したデータで回帰分析することで、精度が上る可能性<br>     　もある。 	|
| 欠点 	| ・次元削減すると、元のデータの各特徴量は失われ、単に「第n主成分上に射影された特徴量」になってしまうので解釈ができない 	|
| sklearnのドキュメント 	| https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html 	|
| その他 	| ここがわかりやすい<br>     https://qiita.com/aya_taka/items/4d3996b3f15aa712a54f 	|
|  	|  	|

5.DBSCAN
| モデル名 	| DBSCAN 	|
|---	|---	|
| 目的 	| クラスタリング 	|
| 調整すべき主なパラメーター 	| eps：あるデータが、もう一つのデータと<br>     　　　同じクラスタに属すると判定するための、<br>     　　　距離。（この距離圏内なら、同じクラスタと判定）<br>     　　　default=0.5 (float)<br>     <br>     min_samples：自データポイントも含め、クラスタを<br>     　　　　　　　構成するためには、eps距離圏内に<br>     　　　　　　　最低何個のデータポイントが必要か？<br>     　　　             default=5(int) 	|
| データ標準化が必要か？ 	| はい 	|
| ハズレ値に対しては 	| クラスターが再帰的に決定されていくため、外れ値（outlier）の影響を受けにくい 	|
| コマンド 	| sklearn.cluster.DBSCAN 	|
| 特徴(損失関数など) 	| k-meansと違って，最初にクラスタ数を決めなくてもクラスターを作成できる。<br>     データポイントの近傍の密度を利用して、所属するクラスタを判断する。<br>     <br>     また、k-meansと違い、全てのデータが何らかのクラスタに属するように分けられるのではなく、「ノイズ」と判定されるデータポイントが存在するのが特徴。 	|
| 利点 	| ・事前にクラスタ数を指定する必要がない<br>     ・クラスタに属さない「ノイズ」データも判定可能 	|
| 欠点 	| ・eps/min_samplesの設定に敏感 	|
| sklearnのドキュメント 	| https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html 	|
| その他 	| ここがわかりやすい     https://aizine.ai/dbscan-0712/ 	|
|  	|  	|