はじめに
今回は、比較的簡単でシンプルなデータマイニングアルゴリズム(K平均アルゴリズム)について説明します。K-Meansアルゴリズムは、教師なしクラスタリングアルゴリズムです。監視なしとは何ですか?つまり、トレーニングセット内のデータについては、トレーニングプロセス中に、特定のデータがどのカテゴリに属するかをトレーニングアルゴリズムに伝えません。K-Meansアルゴリズムの場合、彼はいくつかのSao操作を使用して、「類似した」データの束をまとめて収集し、それらを同じカテゴリとして扱います。たとえば、次の図:最後に、データは3つのカテゴリーに集約されます。
K-Meansアルゴリズムの\(K \)は、代表的なカテゴリの数であり、ユーザーのニーズに応じて決定することも、何らかの方法(エルボー法など)を使用して決定することもできます。
アルゴリズム
アルゴリズムの紹介
与えられたサンプルセットに対して\(D = \ left \ {\ boldsymbol {x} _ {1}、\ boldsymbol {x} _ {2}、\ ldots、\ boldsymbol {x} _ {m} \ right \} \)、クラスタリングのk平均アルゴリズムによって取得されたクラスターは\(\ mathcal {C} = \ left \ {C_ {1}、C_ {2}、\ ldots、C_ {k} \ right \} \)の場合、除算の最小二乗誤差は次のとおりです。
\(E \)が小さいほど、データセットサンプルの類似性が高くなります。最小の\(E \)を取得する必要がありますが、直接的な解決は簡単ではないため、ヒューリスティックアルゴリズムを使用して解決します。
アルゴリズムの流れ
アルゴリズムのフローは、次のように非常に単純です。
-
最初の図心を選択
まず、次のデータセットがある場合、\(k \)ポイント(セントロイドと呼ばれます。ここでは\(k = 3 \))をランダムに選択します。これは、下の図の赤、緑、青の3つのポイントです。
-
データセットサンプルの他のポイントから重心までの距離を計算し、最も近い重心を持つカテゴリをカテゴリとして選択します。
それは、「朱朱Chi紫Z霞Heiの近く」として理解できます。サンプルポイントは、重心が私に近いので、だれが「パパ」であるかがわかります。同時に、「ユークリッド距離」や「マンハッタン距離」など、「距離」の計算方法はたくさんあります。
-
重心を再計算します
上記の手順で、3つのクラスターを取得し、これらの3つのクラスターから重心を再選択します。つまり、新しい「パパ」を選択します。この「パパ」は、サンプルポイント(赤い点など)にすることができます。 、またはサンプル内のポイントではない(青や緑のポイントなど)。選出方法は非常に単純で、各クラスターのサンプルポイントの平均値を計算します。
-
再定義
2番目のステップの計算方法に従って、サンプルを再分割します。
-
特定のしきい値に達するまで手順3と4を繰り返します
このしきい値は反復の数にすることができます。または、重心が変化しない場合、または重心の変化の大きさが特定の値よりも小さい場合に停止できます。
「スイカブック」のアルゴリズムステップは次のとおりです。
アルゴリズムgifは次のとおりです。
アルゴリズムの最適化
K-Meansアルゴリズムの手順は上記のとおりですが、実際には最適化できる詳細がいくつかあります。
K-Means ++アルゴリズム
上記では、k平均アルゴリズムのフローについて説明しましたが、重心の初期化の最初のステップで、重心の位置が特に良くない場合、たとえば3つの点が接近している場合は、その時点で慎重に考えることができます。このように、多くの反復ステップを使用する必要があります。同時に、最後のクラスターの結果にも影響を与える可能性があります。このエラーを解決するには、初期の重心のランダムなセットを選択してから、最小の\(E \)値を選択します(つまり、最小二乗エラーが最小です)。
もちろん、他の方法もあります。
上記のK平均++アルゴリズムと従来のK平均アルゴリズムの違いは、ランダムに重心を選択するのではなく、特定の方法を使用してアルゴリズムの最初のステップ(重心の初期化)をより合理的にすることです。アルゴリズムのステップは次のとおりです。
- 入力サンプルからランダムにサンプルを重心として選択します\(\ mu_1 \)
- データセット内の各サンプル\(x_i \)について、選択した重心からのその他の距離\(\ mu_r \)を計算し、サンプル\(x_i \)から重心までの距離を\(D(x_i)\)として設定します [この距離は、重心からの最短距離でなければなりません]したがって、\(D(x_i)= arg \; min || x_i- \ mu_r || _2 ^ 2 \; \; r = 1,2、... k_ {選択} \)。
- 新しい重心として新しいデータサンプルを選択します。選択の原則は次のとおりです。\(D(x_i)\)大きいほど、選択される確率が高くなります。
- \(k \)重心が選択されるまで、手順2と3を繰り返します。
- 従来のk-meansアルゴリズムのステップ2、3、4、および5を実行します。
K-Means ++は実際には重心の初期化のステップを変更しましたが、他のステップは変更されていません。
K-Meansアルゴリズムでの距離計算の最適化
我々が持っていると仮定し、(N + K \)\(含むサンプル\(K \) 、間違いなく、我々は計算する必要重心)\(N- \)にサンプル(K \)\重心から。このステップを少し簡略化できます。三角形の2つの辺の合計を使用して、3番目の辺より大きいことがわかります。
上記の2つのルールを使用すると、計算をある程度簡略化できます。
K値の決定
以前、\(K \)の値はクラスターの数を表すと述べましたが、必要に応じて、または計算によって\(K \)のより妥当な値を与えることができます。妥当な\(K \)値を決定するための「エルボー法」を紹介しましょう。他の方法については、ウィキペディアを参照してください。
エルボー方式
エルボー法の原理は非常に単純です。たとえば、0(-10 )の範囲の\(K \)を指定し、各K値に対応するSSEを個別に計算します。これは、前部の最小二乗誤差(E \ )、次に、各\(K \)値に対応するSSE を描画します。\(K \)の値が増加すると、SSEは0になる傾向があることは容易にわかります(各サンプルポイントが重心の場合、対応する距離\(E \)は0です)。\(K \)の値も小さくなるようにしながら、SSEを小さくしたいことがよくあります。
\(K \)の値に対応するSSEグラフを腕と見なすことができ、選択した\(K \)の場所が「肘」の場所であり、これがターンが最大の場所です。
sklearnに基づくK-Meansアルゴリズムの使用
データセットを生成する
まず、データセットが必要です。ここでは、sklearnでmake_blobsを使用して、等方性ガウスクラスターを生成します。次に、データを描画します。
import matplotlib.pyplot as plt
import sklearn.datasets as ds
import matplotlib.colors
# 数据集的个数
data_num = 1000
# k值,同时也是生成数据集的中心点
k_num = 4
# 生成聚类数据,默认n_features为二,代表二维数据,centers表示生成数据集的中心点个数,random_state随机种子
data,y=ds.make_blobs(n_samples=data_num,centers=k_num,random_state=0)
data
2次元座標、y
データラベル、0〜3。描画コードは次のとおりです。
# 不同的数据簇用不同的颜色表示
data_colors = matplotlib.colors.ListedColormap(['red','blue','yellow','Cyan'])
# data为二维数据
plt.scatter(data[:,0],data[:,1],c=y,cmap=data_colors)
plt.title("orginal data")
plt.grid()
plt.show()
図面は次のとおりです
K平均法を使用する
クラスタパッケージでKMeansを使用して、k-meansアルゴリズムを使用できます。具体的なパラメータについては、公式ドキュメントをご覧ください。
'''
sklearn.cluster.KMeans(
n_clusters=8,
init='k-means++',
n_init=10,
max_iter=300,
tol=0.0001,
precompute_distances='auto',
verbose=0,
random_state=None,
copy_x=True,
n_jobs=1,
algorithm='auto' )
参数说明:
(1)n_clusters:簇的个数,也就是k值
(2)init: 初始簇中心的方式,可以为k-means++,也可以为random
(3)n_init: k-means算法在不同随机质心情况下迭代的次数,最后的结果会输出最好的结果
(4)max_iter: k-means算法最大的迭代次数
(5)tol: 关于收敛的相对公差
(8)random_state: 初始化质心的随机种子
(10)n_jobs: 并行工作,-1代表使用所有的处理器
'''
from sklearn.cluster import KMeans
model=KMeans(n_clusters=k_num,init='k-means++')
# 训练
model.fit(data)
# 分类预测
y_pre= model.predict(data)
次に、予測分類結果を描画できます。
plt.scatter(data[:,0],data[:,1],c=y_pre,cmap=data_colors)
plt.title("k-means' result")
plt.grid()
plt.show()
まとめ
もちろん、以下のように、いくつかの分類タスクではk平均法は依然として困難です。
明らかに、データを内側と外側の円に分割する必要がありますが、k平均アルゴリズムを使用した後、データセットは上部と下部に分割されますが、これは間違いなく正しくありません。
一般に、k-meansアルゴリズムは比較的単純で、複雑なものはなく、実装も簡単です。
プロジェクトの住所:Github