K平均 Cluster例による R での操作
何ですか Cluster 分析?
Cluster 分析はその一部です 教師なし学習クラスターとは、類似した特徴を共有するデータのグループです。クラスタリング分析は予測よりも発見に重点が置かれていると言えます。マシンはデータの類似性を検索します。たとえば、次のアプリケーションにクラスター分析を使用できます。
- 顧客のセグメンテーション: 顧客グループ間の類似性を探します。
- 株式市場のクラスタリング: パフォーマンスに基づいて株式をグループ化
- データセットの次元をグループ分けによって削減するping 類似値を持つ観測値
Cluster分析は実装がそれほど難しくなく、ビジネスにとって有意義かつ実用的です。
教師あり学習と教師なし学習の最も顕著な違いは、結果にあります。 教師なし学習では新しい変数であるラベルが作成されますが、教師あり学習では結果が予測されます。 このマシンは、実務者が密接な関連性に基づいてデータにラベルを付けるのに役立ちます。 グループを利用し、それらに名前を付けるかどうかは分析者次第です。
クラスタリングの概念を理解するために、例を挙げてみましょう。簡単にするために、2 つの次元で作業します。顧客の合計支出額と年齢に関するデータがあります。広告を改善するために、マーケティング チームは顧客にターゲットを絞ったメールを送信したいと考えています。
次のグラフでは、総支出額と顧客の年齢をプロットします。
library(ggplot2)
df <- data.frame(age = c(18, 21, 22, 24, 26, 26, 27, 30, 31, 35, 39, 40, 41, 42, 44, 46, 47, 48, 49, 54),
spend = c(10, 11, 22, 15, 12, 13, 14, 33, 39, 37, 44, 27, 29, 20, 28, 21, 30, 31, 23, 24)
)
ggplot(df, aes(x = age, y = spend)) +
geom_point()
この時点でパターンが表示されます
- 左下には購買力の低い若者がいます。
- アッパーミドルは、より多くの費用を費やせる余裕のある仕事に就いている人々を反映しています
- 最後に、予算が低い高齢者です。
上の図では、観測値を手作業でクラスタリングし、3つのグループをそれぞれ定義しています。この例は、かなり単純で、非常に視覚的です。データセットに新しい観測値が追加された場合は、円の中にラベルを付けることができます。円は、私たちの判断に基づいて定義します。代わりに、次のように使用できます。 機械学習 データを客観的にグループ化します。
このチュートリアルでは、 k平均法 アルゴリズム。
K-meansアルゴリズム
K-mean は、間違いなく最も人気のあるクラスタリング手法です。研究者たちは数十年前にこのアルゴリズムをリリースし、その後 K-mean には多くの改良が加えられてきました。
このアルゴリズムは、観測値間の距離を最小化することによってグループを見つけようとします。 局所最適 ソリューション。 距離は観測の座標に基づいて測定されます。 たとえば、XNUMX 次元空間では、座標は単純であり、 です。
アルゴリズムは次のように機能します。
- ステップ 1: 機能プラン内のグループをランダムに選択する
- ステップ2: クラスター中心と異なる観測値間の距離を最小化する(重心)。 観察結果のあるグループが生成されます
- ステップ3: Shift 初期重心からグループ内の座標の平均まで。
- ステップ 4: 新しい重心に従って距離を最小化します。 新しい境界線が作成されます。 したがって、観察はあるグループから別のグループに移動します。
- グループに変化が観察されなくなるまで繰り返します
K 平均法は通常、特徴と特徴の間のユークリッド距離を計算します。
マンハッタン距離やミンロウスキー距離など、さまざまな尺度が利用可能です。K 平均法は、アルゴリズムを実行するたびに異なるグループを返すことに注意してください。最初の初期推測はランダムであり、アルゴリズムがグループ内で均一性に達するまで距離を計算することを思い出してください。つまり、K 平均法は最初の選択に非常に敏感であり、観測値とグループの数が少ない場合を除き、同じクラスタリングを得ることはほぼ不可能です。
クラスターの数を選択
k平均法のもう一つの難しさは、クラスター数の選択です。安定性を向上させるために、 の値を高く設定する、つまりグループ数を大きくすることができますが、 オーバーフィット データの過剰適合とは、新しく入ってくるデータに対してモデルのパフォーマンスが大幅に低下することを意味します。マシンはデータセットの細かい詳細を学習し、全体的なパターンを一般化するのに苦労します。
クラスターの数は、データ セット、業界、ビジネスなどの性質によって異なります。ただし、適切なクラスターの数を選択するための経験則があります。
データセット内の観測値の数に等しい。
一般に、ビジネス ニーズに適合する最適な値を時間をかけて探すのは興味深いことです。
クラスタリング分析を実行するために、「パソコンの価格」データセットを使用します。このデータセットには、6259 個の観測値と 10 個の機能が含まれています。データセットには、1993 年から 1995 年にかけての米国の 486 台のパソコンの価格が記録されています。変数には、価格、速度、RAM、画面、CD などがあります。
次のように進めます。
- インポート日
- モデルを訓練する
- モデルを評価する
インポート日
K 平均は距離に基づいており、離散値は意味のある値を返さないため、因子変数には適していません。 データセット内の XNUMX つのカテゴリ変数を削除できます。 さらに、このデータセットには欠損値はありません。
library(dplyr) PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/computers.csv" df <- read.csv(PATH) %>% select(-c(X, cd, multi, premium)) glimpse(df)
出力
## Observations: 6, 259 ## Variables: 7 ## $ price < int > 1499, 1795, 1595, 1849, 3295, 3695, 1720, 1995, 2225, 2... ##$ speed < int > 25, 33, 25, 25, 33, 66, 25, 50, 50, 50, 33, 66, 50, 25, ... ##$ hd < int > 80, 85, 170, 170, 340, 340, 170, 85, 210, 210, 170, 210... ##$ ram < int > 4, 2, 4, 8, 16, 16, 4, 2, 8, 4, 8, 8, 4, 8, 8, 4, 2, 4, ... ##$ screen < int > 14, 14, 15, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, ... ##$ ads < int > 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, ... ## $ trend <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
概要統計から、データに大きな値があることがわかります。 k の平均と距離の計算を行う場合は、平均が XNUMX に等しく、標準偏差が XNUMX に等しくなるようにデータを再スケールすることをお勧めします。
summary(df)
出力:
## price speed hd ram ## Min. : 949 Min. : 25.00 Min. : 80.0 Min. : 2.000 ## 1st Qu.:1794 1st Qu.: 33.00 1st Qu.: 214.0 1st Qu.: 4.000 ` ## Median :2144 Median : 50.00 Median : 340.0 Median : 8.000 ## Mean :2220 Mean : 52.01 Mean : 416.6 Mean : 8.287 ## 3rd Qu.:2595 3rd Qu.: 66.00 3rd Qu.: 528.0 3rd Qu.: 8.000 ## Max. :5399 Max. :100.00 Max. :2100.0 Max. :32.000 ## screen ads trend ## Min. :14.00 Min. : 39.0 Min. : 1.00 ## 1st Qu.:14.00 1st Qu.:162.5 1st Qu.:10.00 ## Median :14.00 Median :246.0 Median :16.00 ## Mean :14.61 Mean :221.3 Mean :15.93 ## 3rd Qu.:15.00 3rd Qu.:275.0 3rd Qu.:21.50 ## Max. :17.00 Max. :339.0 Max. :35.00
dplyr ライブラリのscale() 関数を使用して変数を再スケーリングします。 変換により外れ値の影響が軽減され、単一の観測値を平均値と比較できるようになります。 標準化された値(または Zスコア) が高い場合、この観測値が実際に平均を上回っていると確信できます (Z スコアが大きいということは、この点が標準偏差の観点から平均から遠く離れていることを意味します。Z スコアが 2 は、値が XNUMX 標準であることを示します) Z スコアはガウス分布に従い、平均を中心に対称であることに注意してください。
rescale_df <- df % > %
mutate(price_scal = scale(price),
hd_scal = scale(hd),
ram_scal = scale(ram),
screen_scal = scale(screen),
ads_scal = scale(ads),
trend_scal = scale(trend)) % > %
select(-c(price, speed, hd, ram, screen, ads, trend))
R Base には、k 平均アルゴリズムを実行する機能があります。 k 平均の基本関数は次のとおりです。
kmeans(df, k) arguments: -df: dataset used to run the algorithm -k: Number of clusters
モデルを訓練する
図 XNUMX では、アルゴリズムがどのように機能するかを詳しく説明しました。 Yi Hui (Knit for Rmarkdown の作成者でもある) によって構築された優れたパッケージを使用すると、各ステップをグラフィカルに確認できます。 パッケージ アニメーションは conda ライブラリでは使用できません。 install.packages(“animation”) を使用して、別の方法でパッケージをインストールすることもできます。 パッケージが Anaconda フォルダーにインストールされているかどうかを確認できます。
install.packages("animation")
ライブラリをロードした後、kmeans の後に .ani を追加します。 R すべてのステップをプロットします。説明のために、3 つのクラスターを持つ再スケールされた変数 hd と ram のみを使用してアルゴリズムを実行します。
set.seed(2345) library(animation) kmeans.ani(rescale_df[2:3], 3)
Code 説明
- kmeans.ani(rescale_df[2:3], 3): rescale_df データ セットの列 2 と 3 を選択し、k セットを 3 に設定してアルゴリズムを実行します。アニメーションをプロットします。
アニメーションは次のように解釈できます。
- ステップ 1: R はランダムに XNUMX つの点を選択します
- ステップ 2: ユークリッド距離を計算してクラスターを描画します。左下に緑色のクラスターが XNUMX つ、右側に黒色の大きなクラスターが XNUMX つ、その間に赤色のクラスターが XNUMX つあります。
- ステップ3: 重心、つまりクラスターの平均を計算する
- データが変更されなくなるまで繰り返します
アルゴリズムは 7 回の反復後に収束しました。5 つのクラスターを含むデータセットで k-mean アルゴリズムを実行し、pc_cluster と呼ぶことができます。
pc_cluster <-kmeans(rescale_df, 5)
- リスト pc_cluster には、次の 7 つの興味深い要素が含まれています。
- pc_cluster$cluster: 各観測のクラスターを示す
- pc_cluster$centers: クラスターセンター
- pc_cluster$totss: 平方和の合計
- pc_cluster$withinss: 平方和の範囲内。返されるコンポーネントの数は `k` に等しい
- pc_cluster$tot.withinss: 範囲内の合計
- pc_clusterbetweenss: 総平方和からクラスタ内平方和を引いた値
- pc_cluster$size: 各クラスター内の観測数
クラスターの最適な数 k を計算するには、内部二乗和の合計 (つまり、tot.withinss) を使用します。k を見つけることは、確かに大変な作業です。
最適なk
最適な k を選択するための XNUMX つの手法は、 エルボー法この方法では、グループ内の同質性またはグループ内の異質性を使用して変動性を評価します。言い換えると、各クラスターによって説明される分散のパーセンテージに関心があります。クラスターの数が増えると変動性が増加すると予想できますが、逆に異質性は減少します。私たちの課題は、収穫逓減を超える k を見つけることです。新しいクラスターを追加しても、説明できる情報がほとんど残っていないため、データの変動性は改善されません。
このチュートリアルでは、異質性測定を使用してこの点を見つけます。クラスター内の合計二乗和は、kmean() によって返されるリスト内の tot.withinss です。
次のようにエルボ グラフを作成し、最適な k を見つけることができます。
- ステップ1: クラスター内の合計二乗和を計算する関数を構築する
- ステップ 2: アルゴリズムを何度も実行する
- ステップ 3: アルゴリズムの結果を使用してデータ フレームを作成する
- ステップ 4: 結果をプロットする
ステップ1) クラスター内の合計の二乗和を計算する関数を構築する
k平均アルゴリズムを実行し、クラスター内の合計を平方和として保存する関数を作成します。
kmean_withinss <- function(k) {
cluster <- kmeans(rescale_df, k)
return (cluster$tot.withinss)
}
Code 説明
- function(k): 関数の引数の数を設定します。
- kmeans(rescale_df, k): アルゴリズムを k 回実行します
- return(cluster$tot.withinss): クラスター内の合計平方和を保存します。
関数は、equals 2 でテストできます。
出力:
## Try with 2 cluster
kmean_withinss(2)
出力:
## [1] 27087.07
ステップ2) アルゴリズムをn回実行する
sapply() 関数を使用して、k の範囲にわたってアルゴリズムを実行します。 この手法は、ループを作成して値を保存するよりも高速です。
# Set maximum cluster max_k <-20 # Run algorithm over a range of k wss <- sapply(2:max_k, kmean_withinss)
Code 説明
- max_k <-20: 最大数を 20 に設定します
- sapply(2:max_k, kmean_withinss): 関数 kmean_withinss() を 2:max_k、つまり 2 ~ 20 の範囲で実行します。
ステップ3) アルゴリズムの結果を使用してデータ フレームを作成する
関数を作成してテストした後、2 ~ 20 の範囲で K 平均アルゴリズムを実行し、tot.withinss 値を保存できます。
# Create a data frame to plot the graph elbow <-data.frame(2:max_k, wss)
Code 説明
- data.frame(2:max_k, wss): wss に格納されたアルゴリズムの出力を使用してデータ フレームを作成します。
ステップ4) 結果をプロットする
グラフをプロットしてエルボ ポイントがどこにあるかを視覚化します。
# Plot the graph with gglop
ggplot(elbow, aes(x = X2.max_k, y = wss)) +
geom_point() +
geom_line() +
scale_x_continuous(breaks = seq(1, 20, by = 1))
グラフから、最適な k は XNUMX であることがわかります。ここでは、曲線の収益が逓減し始めています。
最適な k が得られたら、k を 7 にしてアルゴリズムを再実行し、クラスターを評価します。
クラスターの調査
pc_cluster_2 <-kmeans(rescale_df, 7)
前に述べたように、kmean() によって返されるリスト内の残りの興味深い情報にアクセスできます。
pc_cluster_2$cluster pc_cluster_2$centers pc_cluster_2$size
評価部分は主観的であり、アルゴリズムの使用に依存します。ここでの目標は、類似した機能を持つコンピューターを集めることです。コンピューター担当者は、自分の専門知識に基づいて手作業でコンピューターをグループ化することができます。ただし、このプロセスには時間がかかり、エラーが発生しやすくなります。K 平均アルゴリズムは、クラスターを提案することで、担当者に代わってフィールドを準備できます。
事前評価として、クラスターのサイズを調べることができます。
pc_cluster_2$size
出力:
## [1] 608 1596 1231 580 1003 699 542
最初のクラスターは 608 個の観測値で構成されていますが、最小のクラスター 4 には 580 台のコンピューターしかありません。クラスター間の均質性は望ましいですが、そうでない場合は、より薄いデータの準備が必要になる可能性があります。
中心コンポーネントを使用すると、データをより詳細に見ることができます。行はクラスターの番号を示し、列はアルゴリズムで使用される変数を示します。値は、関心のある列の各クラスターの平均スコアです。標準化により、解釈が容易になります。正の値は、特定のクラスターの Z スコアが全体の平均を上回っていることを示します。たとえば、クラスター 2 は、すべてのクラスターの中で価格の平均が最も高くなります。
center <-pc_cluster_2$centers center
出力:
## price_scal hd_scal ram_scal screen_scal ads_scal trend_scal ## 1 -0.6372457 -0.7097995 -0.691520682 -0.4401632 0.6780366 -0.3379751 ## 2 -0.1323863 0.6299541 0.004786730 2.6419582 -0.8894946 1.2673184 ## 3 0.8745816 0.2574164 0.513105797 -0.2003237 0.6734261 -0.3300536 ## 4 1.0912296 -0.2401936 0.006526723 2.6419582 0.4704301 -0.4132057 ## 5 -0.8155183 0.2814882 -0.307621003 -0.3205176 -0.9052979 1.2177279 ## 6 0.8830191 2.1019454 2.168706085 0.4492922 -0.9035248 1.2069855 ## 7 0.2215678 -0.7132577 -0.318050275 -0.3878782 -1.3206229 -1.5490909
ggplot を使用してヒート マップを作成すると、カテゴリ間の違いを強調することができます。
ggplot のデフォルトの色は、RColorBrewer ライブラリを使用して変更する必要があります。 コンダを使用できます ライブラリ ターミナルで起動するコード:
conda install -cr r-rcolorbrewer
ヒート マップを作成するには、次の XNUMX つの手順を実行します。
- 中心の値を持つデータフレームを構築し、クラスターの番号を持つ変数を作成します。
- Tidyr ライブラリの Gather() 関数を使用してデータを再整形します。 データをワイドデータからロングデータに変換したいと考えています。
- カラーで色のパレットを作成するRampパレット()関数
ステップ1) データフレームを構築する
変形データセットを作成しましょう
library(tidyr) # create dataset with the cluster number cluster <- c(1: 7) center_df <- data.frame(cluster, center) # Reshape the data center_reshape <- gather(center_df, features, values, price_scal: trend_scal) head(center_reshape)
出力:
## cluster features values ## 1 1 price_scal -0.6372457 ## 2 2 price_scal -0.1323863 ## 3 3 price_scal 0.8745816 ## 4 4 price_scal 1.0912296 ## 5 5 price_scal -0.8155183 ## 6 6 price_scal 0.8830191
ステップ2) データを再形成する
以下のコードは、ヒート マップのプロットに使用する色のパレットを作成します。
library(RColorBrewer) # Create the palette hm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')
ステップ 3) 視覚化する
グラフをプロットして、クラスターがどのように見えるかを確認できます。
# Plot the heat map
ggplot(data = center_reshape, aes(x = features, y = cluster, fill = values)) +
scale_y_continuous(breaks = seq(1, 7, by = 1)) +
geom_tile() +
coord_equal() +
scale_fill_gradientn(colours = hm.palette(90)) +
theme_classic()
製品概要
k平均法アルゴリズムは以下の表にまとめられる。
| パッケージ | DevOps Tools Engineer試験のObjective | 演算 | 引数 |
|---|---|---|---|
| ベース | K 平均を訓練する | kmeans() | DF、K |
| アクセスクラスター | kmeans()$クラスター | ||
| Cluster センター | kmeans()$センター | ||
| サイズクラスター | kmeans()$size |








