web-dev-qa-db-ja.com

scikit-learn:各KMeansクラスターに寄与する機能を見つける

3つのクラスターを作成するために使用している10個の機能があるとします。各機能が各クラスターに対して持つ貢献度を確認する方法はありますか?

私が言いたいのは、クラスターk1の場合、機能1、4、6が主要な機能であるのに対し、クラスターk2の主な機能は2、5、7であるということです。

これは私が使用しているものの基本的なセットアップです:

k_means = KMeans(init='k-means++', n_clusters=3, n_init=10)
k_means.fit(data_features)
k_means_labels = k_means.labels_
17
cmgerber

使用できます

主成分分析(PCA)

PCAは、データ共分散(または相関)行列の固有値分解またはデータ行列の特異値分解によって、通常は各属性のデータ行列を平均中心化(および正規化またはZスコアを使用)した後に実行できます。 PCAの結果は通常、因子スコア(特定のデータポイントに対応する変換された変数値)と呼ばれることもあるコンポーネントスコア、および負荷(コンポーネントスコアを取得するために標準化された各元の変数に乗算する必要がある重み)の観点から説明されます。 )。

いくつかの重要なポイント:

  • 固有値は対応するコンポーネントによって説明される分散の部分を反映します。たとえば、固有値が1, 4, 1, 2の4つの特徴があります。これらは、対応によって説明される分散です。ベクトル。 2番目の値は全体の分散の50%を説明するため、最初の主成分に属し、最後の値は全体の分散の25%を説明する2番目の主成分に属します。
  • 固有ベクトルはコンポーネントの線形結合です。どの機能が高/低影響であるかがわかるように、機能に重みを付けます。
  • 相関行列に基づくPCAを使用経験的共分散行列の代わりに、固有値が大きく異なる場合(大きさ)。

サンプルアプローチ

  • データセット全体でPCAを実行します(これが以下の関数の実行です)
    • 観察と特徴を備えたマトリックスを取る
    • それをその平均の中心に置きます(すべての観測値の特徴値の平均)
    • 経験的共分散行列(例:np.cov)または相関(上記を参照)を計算します
    • 分解を実行します
    • 固有値と固有ベクトルを固有値で並べ替えて、最も影響の大きいコンポーネントを取得します
    • 元のデータのコンポーネントを使用する
  • 変換されたデータセット内のクラスターを調べます。各コンポーネントでの位置を確認することで、分布/分散への影響が大きい特徴と小さい特徴を導き出すことができます。

サンプル関数

import numpy as npおよびscipy as spする必要があります。分解にはsp.linalg.eighを使用します。 scikit分解モジュール も確認することをお勧めします。

PCAは、行に観測値(オブジェクト)があり、列に特徴があるデータマトリックスに対して実行されます。

def dim_red_pca(X, d=0, corr=False):
    r"""
    Performs principal component analysis.

    Parameters
    ----------
    X : array, (n, d)
        Original observations (n observations, d features)

    d : int
        Number of principal components (default is ``0`` => all components).

    corr : bool
        If true, the PCA is performed based on the correlation matrix.

    Notes
    -----
    Always all eigenvalues and eigenvectors are returned,
    independently of the desired number of components ``d``.

    Returns
    -------
    Xred : array, (n, m or d)
        Reduced data matrix

    e_values : array, (m)
        The eigenvalues, sorted in descending manner.

    e_vectors : array, (n, m)
        The eigenvectors, sorted corresponding to eigenvalues.

    """
    # Center to average
    X_ = X-X.mean(0)
    # Compute correlation / covarianz matrix
    if corr:
        CO = np.corrcoef(X_.T)
    else:
        CO = np.cov(X_.T)
    # Compute eigenvalues and eigenvectors
    e_values, e_vectors = sp.linalg.eigh(CO)

    # Sort the eigenvalues and the eigenvectors descending
    idx = np.argsort(e_values)[::-1]
    e_vectors = e_vectors[:, idx]
    e_values = e_values[idx]
    # Get the number of desired dimensions
    d_e_vecs = e_vectors
    if d > 0:
        d_e_vecs = e_vectors[:, :d]
    else:
        d = None
    # Map principal components to original data
    LIN = np.dot(d_e_vecs, np.dot(d_e_vecs.T, X_.T)).T
    return LIN[:, :d], e_values, e_vectors

使用例

これは、指定された関数を使用し、クラスタリングにscipy.cluster.vq.kmeans2を使用するサンプルスクリプトです。結果は実行ごとに異なることに注意してください。これは、開始クラスターがランダムに初期化されるためです。

import numpy as np
import scipy as sp
from scipy.cluster.vq import kmeans2
import matplotlib.pyplot as plt

SN = np.array([ [1.325, 1.000, 1.825, 1.750],
                [2.000, 1.250, 2.675, 1.750],
                [3.000, 3.250, 3.000, 2.750],
                [1.075, 2.000, 1.675, 1.000],
                [3.425, 2.000, 3.250, 2.750],
                [1.900, 2.000, 2.400, 2.750],
                [3.325, 2.500, 3.000, 2.000],
                [3.000, 2.750, 3.075, 2.250],
                [2.075, 1.250, 2.000, 2.250],
                [2.500, 3.250, 3.075, 2.250],
                [1.675, 2.500, 2.675, 1.250],
                [2.075, 1.750, 1.900, 1.500],
                [1.750, 2.000, 1.150, 1.250],
                [2.500, 2.250, 2.425, 2.500],
                [1.675, 2.750, 2.000, 1.250],
                [3.675, 3.000, 3.325, 2.500],
                [1.250, 1.500, 1.150, 1.000]], dtype=float)

clust,labels_ = kmeans2(SN,3)    # cluster with 3 random initial clusters
# PCA on orig. dataset 
# Xred will have only 2 columns, the first two princ. comps.
# evals has shape (4,) and evecs (4,4). We need all eigenvalues 
# to determine the portion of variance
Xred, evals, evecs = dim_red_pca(SN,2)   

xlab = '1. PC - ExpVar = {:.2f} %'.format(evals[0]/sum(evals)*100) # determine variance portion
ylab = '2. PC - ExpVar = {:.2f} %'.format(evals[1]/sum(evals)*100)
# plot the clusters, each set separately
plt.figure()    
ax = plt.gca()
scatterHs = []
clr = ['r', 'b', 'k']
for cluster in set(labels_):
    scatterHs.append(ax.scatter(Xred[labels_ == cluster, 0], Xred[labels_ == cluster, 1], 
                   color=clr[cluster], label='Cluster {}'.format(cluster)))
plt.legend(handles=scatterHs,loc=4)
plt.setp(ax, title='First and Second Principle Components', xlabel=xlab, ylabel=ylab)
# plot also the eigenvectors for deriving the influence of each feature
fig, ax = plt.subplots(2,1)
ax[0].bar([1, 2, 3, 4],evecs[0])
plt.setp(ax[0], title="First and Second Component's Eigenvectors ", ylabel='Weight')
ax[1].bar([1, 2, 3, 4],evecs[1])
plt.setp(ax[1], xlabel='Features', ylabel='Weight')

出力

固有ベクトルは、コンポーネントの各特徴の重みを示します

enter image description here

enter image description here

短い解釈

クラスターゼロ、赤いクラスターを見てみましょう。分布の約3/4を説明しているので、最初のコンポーネントに主に関心があります。赤いクラスターは、最初のコンポーネントの上部にあります。すべての観測値はかなり高い値をもたらします。どういう意味ですか?ここで、一目でわかる最初のコンポーネントの線形結合を見ると、2番目の機能は(このコンポーネントにとって)かなり重要ではないことがわかります。 1番目と4番目の特徴は最も高い重みがあり、3番目の特徴は負のスコアを持っています。つまり、すべての赤い頂点は最初のPCでかなり高いスコアを持っているため、これらの頂点は最初と最後の機能で高い値を持ちます同時にこれらの頂点は3番目の機能。

2番目の機能については、2番目のPCを見ることができます。ただし、このコンポーネントは、最初のPCの約74%と比較して、分散の約16%しか説明できないため、全体的な影響ははるかに小さいことに注意してください。

19
embert

あなたはこのようにそれを行うことができます:

>>> import numpy as np
>>> import sklearn.cluster as cl
>>> data = np.array([99,1,2,103,44,63,56,110,89,7,12,37])
>>> k_means = cl.KMeans(init='k-means++', n_clusters=3, n_init=10)
>>> k_means.fit(data[:,np.newaxis]) # [:,np.newaxis] converts data from 1D to 2D
>>> k_means_labels = k_means.labels_
>>> k1,k2,k3 = [data[np.where(k_means_labels==i)] for i in range(3)] # range(3) because 3 clusters
>>> k1
array([44, 63, 56, 37])
>>> k2
array([ 99, 103, 110,  89])
>>> k3
array([ 1,  2,  7, 12])
3
Irshad Bhat

これを試して、

estimator=KMeans()
estimator.fit(X)
res=estimator.__dict__
print res['cluster_centers_']

Clusterとfeature_weightsのマトリックスを取得します。これから、より重みのある機能がクラスターに貢献するための主要な役割を果たします。

2
Rohit P

「主な機能」とは、クラスに最も大きな影響を与えたという意味だと思います。あなたができる素晴らしい探求は、クラスターの中心の座標を見ることです。たとえば、各特徴について、K個の中心のそれぞれで座標をプロットします。

もちろん、大規模なフィーチャは観測間の距離にはるかに大きな影響を与えるため、分析を実行する前にデータが適切にスケーリングされていることを確認してください。

1
Serendipity

クラスターごとに特徴の重要性について個別に話すのは難しいかもしれません。むしろ、異なるクラスターを分離するためにどの機能が最も重要であるかについてグローバルに話す方がよいかもしれません。

この目標のために、非常に簡単な方法を次のように説明します。 2つのクラスター中心間のユークリッド距離は、個々の特徴間の二乗差の合計であることに注意してください。次に、各特徴の重みとして二乗の差を使用できます。

Euclidean Distance

0
ZillGate