目次
3. さまざまなパラメータの組み合わせをループし、クラスタリング効果を計算します。
1. 実験の紹介
この実験では、スペクトルクラスタリング アルゴリズム を使用してクラスター分析を実装します。
2. 実験環境
この一連の実験では PyTorch 深層学習フレームワークを使用し、関連する操作は次のとおりです (深層学習シリーズの記事の環境に基づく)。
1. 仮想環境を構成する
ディープラーニング連載記事の環境
conda create -n DL python=3.7
conda activate DL
pip install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
conda install matplotlib
conda install scikit-learn
新規追加
conda install pandas
conda install seaborn
conda install networkx
conda install statsmodels
pip install pyHSICLasso
注:私の実験環境では上記の順番で各種ライブラリをインストールしていますので、まとめてインストールしてみたい方は試してみてください(問題が起こるかどうかは神のみぞ知る)
2. ライブラリバージョンの紹介
ソフトウェアパッケージ | 今回の実験版は | 現在の最新バージョン |
マットプロットライブラリ | 3.5.3 | 3.8.0 |
しこり | 1.21.6 | 1.26.0 |
パイソン | 3.7.16 | |
scikit-learn | 0.22.1 | 1.3.0 |
松明 | 1.8.1+cu102 | 2.0.1 |
トーショーディオ | 0.8.1 | 2.0.2 |
トーチビジョン | 0.9.1+cu102 | 0.15.2 |
新しい
ネットワークx | 2.6.3 | 3.1 |
パンダ | 1.2.3 | 2.1.1 |
pyHSICLase | 1.4.2 | 1.4.2 |
シーボーン | 0.12.2 | 0.13.0 |
状態モデル | 0.13.5 | 0.14.0 |
3.IDE
Pycharmの使用を推奨します(中でもpyHSICLassoライブラリはVScodeでエラーが発生しており、解決策はまだ見つかっていません...)
3. 実験内容
0. 必要なツールをインポートする
import numpy as np
from sklearn.cluster import SpectralClustering
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from numpy import random
from sklearn import metrics
1. テストデータの生成
random.seed(1)
x, y = make_blobs(n_samples=400, centers=4, cluster_std=1.5)
この方法を使用してmake_blobs
、合計 4 つのクラスター中心と各クラスター中心の標準偏差 1.5 を持つ 400 個のサンプルを含むデータ セットが生成されました。
2. 初期データ分布グラフを描画する
plt.scatter(x[:, 0], x[:, 1], c=y, label=len(np.unique(y)))
plt.title("Initial Data Distribution")
plt.show()
生成されたデータセットは散布図としてプロットされ、異なるクラスター内のサンプルが異なる色でマークされます。
3. さまざまなパラメータの組み合わせをループし、クラスタリング効果を計算します。
gamma_best = 0
k_cluster_best = 0
CH = 0
for index, gamma in enumerate((1, 1.5, 2, 2.5, 5)):
for index, k in enumerate((2, 3, 4, 5, 6)):
y_pred = SpectralClustering(n_clusters=k, gamma=gamma).fit_predict(x)
print("Calinski-Harabasz Score with gamma=", gamma, "n_clusters=", k, "score:",
metrics.calinski_harabasz_score(x, y_pred))
curr_CH = metrics.calinski_harabasz_score(x, y_pred)
if (curr_CH > CH):
gamma_best = gamma
k_cluster_best = k
CH = curr_CH
- ネストされたループを使用して、さまざまなパラメーターの組み合わせを試します
- ここで、 は
gamma
スペクトル クラスタリングのガウス カーネル パラメータを表します k
クラスターの数を表します。
- ここで、 は
- パラメータのセットごとに、を使用してクラスタリングを実行し、クラスタリング結果の
SpectralClustering
Calinski-Harabasz スコア ( ) を計算します。metrics.calinski_harabasz_score
スコアが高いほど、クラスタリング効果が高くなります。コードは、最高スコアを持つパラメーターの組み合わせを記録します。
4. 最適なパラメータの組み合わせを出力
print("best gamma:", gamma_best, "best cluster", k_cluster_best)
gamma
最高のスコア (つまり、最良の合計 ) を持つパラメーターの組み合わせを出力します k
。
5. 最適なクラスタリング結果グラフを描画する
f = plt.figure()
sc = SpectralClustering(n_clusters=k_cluster_best, gamma=gamma_best).fit_predict(x)
plt.scatter(x[:, 0], x[:, 1], c=sc)
plt.title("n_clusters: " + str(k_cluster_best))
plt.show()
6. コードの統合
import numpy as np
from sklearn.cluster import SpectralClustering
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from numpy import random
from sklearn import metrics
SpectralClustering(affinity='rbf', coef0=1, degree=3, gamma=1.0,
kernel_params=None, n_clusters=4, n_init=10,
n_neighbors=10)
# scikit中的make_blobs方法常被用来生成聚类算法的测试数据,make_blobs会根据用户指定的特征数量、中心点数量、范围等来生成几类数据,这些数据可用于测试聚类算法的效果
random.seed(1)
# n_samples:样本数 n_features:int,可选(默认值= 2)centers:要生成的中心数或固定的中心位置 cluster_std: 聚类的标准偏差
x, y = make_blobs(n_samples=400, centers=4, cluster_std=1.5)
plt.scatter(x[:, 0], x[:, 1], c=y, label=len(np.unique(y)))
plt.title("Initial Data Distribution")
plt.show()
gamma_best = 0
k_cluster_best = 0
CH = 0
for index, gamma in enumerate((1, 1.5, 2, 2.5, 5)):
for index, k in enumerate((2, 3, 4, 5, 6)):
y_pred = SpectralClustering(n_clusters=k, gamma=gamma).fit_predict(x)
# 卡林斯基哈拉巴斯得分(Calinski Harabasz score),本质是簇间距离与簇内距离的比值,整体计算过程与方差计算方式类似,也称为方差比标准,
# 通过计算类内各点与类中心的距离平方和来度量类内的紧密度(类内距离),各个类中心点与数据集中心点距离平方和来度量数据集的分离度(类间距离),
# 较高的 Calinski Harabasz 分数意味着更好的聚类
print("Calinski-Harabasz Score with gamma=", gamma, "n_clusters=", k, "score:",
metrics.calinski_harabasz_score(x, y_pred))
curr_CH = metrics.calinski_harabasz_score(x, y_pred)
if (curr_CH > CH):
gamma_best = gamma
k_cluster_best = k
CH = curr_CH
print("best gamma:", gamma_best, "best cluster", k_cluster_best)
f = plt.figure()
sc = SpectralClustering(n_clusters=k_cluster_best, gamma=gamma_best).fit_predict(x)
plt.scatter(x[:, 0], x[:, 1], c=sc)
plt.title("n_clusters: " + str(k_cluster_best))
plt.show()
请详细介绍上述代码