LoginSignup
1

More than 5 years have passed since last update.

【翻訳】scikit-learn 0.18 チュートリアル 科学的データ処理のための統計学習のチュートリアル 教師なし学習:データの表現を求める

Last updated at Posted at 2016-12-26

http://scikit-learn.org/stable/tutorial/statistical_inference/unsupervised_learning.html を google翻訳した
scikit-learn 0.18 チュートリアル 目次
科学的データ処理のための統計学習のチュートリアル 目次
前のチュートリアルページ


教師なし学習:データの表現を求める

クラスタリング:観測値をまとめてグループ化する

クラスタリングで解決された問題

虹彩データセットが与えられた場合、3種類の虹彩があるが、タキソノミストにラベルを付けるためのアクセス権がない場合、クラスタリングタスクを試すことができます:観測をクラスタと呼ばれるよく分離されたグループに分割します。

K平均クラスタリング

異なるクラスタリング基準および関連するアルゴリズムが多数存在することに注意してください。最も単純なクラスタリングアルゴリズムは K平均 である。

>>> from sklearn import cluster, datasets
>>> iris = datasets.load_iris()
>>> X_iris = iris.data
>>> y_iris = iris.target

>>> k_means = cluster.KMeans(n_clusters=3)
>>> k_means.fit(X_iris) 
KMeans(algorithm='auto', copy_x=True, init='k-means++', ...
>>> print(k_means.labels_[::10])
[1 1 1 1 1 0 0 0 0 0 2 2 2 2 2]
>>> print(y_iris[::10])
[0 0 0 0 0 1 1 1 1 1 2 2 2 2 2]

警告 地上の真実を回復することは絶対に保証されていません。まず、適切な数のクラスタを選択するのは難しいです。第2に、アルゴリズムは初期値に敏感であり、scikit-learn はこの問題を緩和するためにいくつかのトリックを使用するが、局所的な最小値に収まる可能性がある。

悪い初期化 8つのクラスタ Ground truth

クラスタリング結果を過度に解釈しない

アプリケーション例:ベクトル量子化

一般的にクラスタリングやKMeansは、情報を圧縮するための少数の模範を選択する方法と見ることができます。この問題は、ベクトル量子化と呼ばれることもあります。例えば、これはイメージをポスタライズするために使うことができます:

>>> import scipy as sp
>>> try:
...    face = sp.face(gray=True)
... except AttributeError:
...    from scipy import misc
...    face = misc.face(gray=True)
>>> X = face.reshape((-1, 1)) # We need an (n_sample, n_feature) array
>>> k_means = cluster.KMeans(n_clusters=5, n_init=1)
>>> k_means.fit(X) 
KMeans(algorithm='auto', copy_x=True, init='k-means++', ...
>>> values = k_means.cluster_centers_.squeeze()
>>> labels = k_means.labels_
>>> face_compressed = np.choose(labels, values)
>>> face_compressed.shape = face.shape
生の画像 K-量子化 等しいビン 画像ヒストグラム

階層的凝集クラスタリング:ウォード法

階層的クラスタリング方法は、クラスタの階層を構築することを目的としたクラスタ分析の一種です。一般に、この技術の様々なアプローチは、

  • 凝集型 - ボトムアップアプローチ:各観測はそれ自身のクラスターで開始し、クラスターは結合基準を最小限にするような方法で集中的にマージされます。このアプローチは、関心のあるクラスタがほんのわずかの観察から作られている場合に特に興味深い。クラスタの数が多い場合、k平均よりもはるかに計算効率が良い。
  • 分枝型 - トップダウンアプローチ:すべての観測は1つのクラスタから開始され、階層内を移動するにつれて反復的に分割されます。多数のクラスタを見積もるために、このアプローチは(1つのクラスタとして開始し、再帰的に分割するすべての観測のために)遅く、統計的に悪意のあるものです。

接続性に制約のあるクラスタリング

凝集型クラスタリングを使用すると、接続グラフを作成することで、どのサンプルをクラスタリングするかを指定することができます。 scikit内のグラフは、その隣接行列によって表されます。多くの場合、スパース行列が使用されます。これは、たとえば、イメージをクラスタリングするときに、接続された領域(接続されたコンポーネントとも呼ばれます)を取得する場合に便利です。

import matplotlib.pyplot as plt

from sklearn.feature_extraction.image import grid_to_graph
from sklearn.cluster import AgglomerativeClustering
from sklearn.utils.testing import SkipTest
from sklearn.utils.fixes import sp_version

if sp_version < (0, 12):
    raise SkipTest("Skipping because SciPy version earlier than 0.12.0 and "
                   "thus does not include the scipy.misc.face() image.")


###############################################################################
# Generate data
try:
    face = sp.face(gray=True)
except AttributeError:
    # Newer versions of scipy have face in misc
    from scipy import misc
    face = misc.face(gray=True)

# Resize it to 10% of the original size to speed up the processing
face = sp.misc.imresize(face, 0.10) / 255.

特徴の凝集

我々は、次元数の呪縛、すなわち特徴の数に比べて観察量が不十分であることを緩和するために希薄さを使用することができることを見出した。 もう1つのアプローチは、同様の特徴を統合することです。特徴の凝集です。 このアプローチは、特徴方向のクラスタリング、換言すると転置されたデータのクラスタリングによって実現することができる。

>>> digits = datasets.load_digits()
>>> images = digits.images
>>> X = np.reshape(images, (len(images), -1))
>>> connectivity = grid_to_graph(*images[0].shape)

>>> agglo = cluster.FeatureAgglomeration(connectivity=connectivity,
...                                      n_clusters=32)
>>> agglo.fit(X) 
FeatureAgglomeration(affinity='euclidean', compute_full_tree='auto',...
>>> X_reduced = agglo.transform(X)

>>> X_approx = agglo.inverse_transform(X_reduced)
>>> images_approx = np.reshape(X_approx, images.shape)
transform メソッドと inverse_transform メソッド

いくつかの推定器は、例えばデータセットの次元数を減らすために transform メソッドを公開します。

分解:シグナルからコンポーネントおよびローディングまで

コンポーネントとローディング

X が私たちの多変量データであるならば、我々が解決しようとしている問題は、それを別の観察基準で書き直すことです:我々は、ローディング $L$ と $X=L C$ のような構成要素 $C$ の集合を学習したいと考えています。構成要素を選択するための異なる基準が存在する。

主成分分析:PCA

主成分分析(PCA)は、信号の最大分散を説明する連続成分を選択します。

上記の観測結果にまたがる点群は、ある方向では非常に平坦です.3つの単変量特徴のうちの1つは、他の2つの関数を使用してほぼ正確に計算できます。 PCAは、データが平らでない方向を見つける
PCAは、データの変換に使用すると、主な部分空間に投影することによってデータの次元を減らすことができます。

>>> # 有効な2つの次元だけを持つシグナルを作成する
>>> x1 = np.random.normal(size=100)
>>> x2 = np.random.normal(size=100)
>>> x3 = x1 + x2
>>> X = np.c_[x1, x2, x3]

>>> from sklearn import decomposition
>>> pca = decomposition.PCA()
>>> pca.fit(X)
PCA(copy=True, iterated_power='auto', n_components=None, random_state=None,
  svd_solver='auto', tol=0.0, whiten=False)
>>> print(pca.explained_variance_)  
[  2.18565811e+00   1.19346747e+00   8.43026679e-32]

>>> # 見ての通り、最初の2つのコンポーネントだけが役に立ちます
>>> pca.n_components = 2
>>> X_reduced = pca.fit_transform(X)
>>> X_reduced.shape
(100, 2)

独立成分分析:ICA

独立成分分析(ICA) は、その成分の分布が最大量の独立した情報を運ぶように成分を選択する。 非ガウス 独立信号を復元することができます。

>>> # Generate sample data
>>> time = np.linspace(0, 10, 2000)
>>> s1 = np.sin(2 * time)  # Signal 1 : sinusoidal signal
>>> s2 = np.sign(np.sin(3 * time))  # Signal 2 : square signal
>>> S = np.c_[s1, s2]
>>> S += 0.2 * np.random.normal(size=S.shape)  # Add noise
>>> S /= S.std(axis=0)  # Standardize data
>>> # Mix data
>>> A = np.array([[1, 1], [0.5, 2]])  # Mixing matrix
>>> X = np.dot(S, A.T)  # Generate observations

>>> # Compute ICA
>>> ica = decomposition.FastICA()
>>> S_ = ica.fit_transform(X)  # Get the estimated sources
>>> A_ = ica.mixing_.T
>>> np.allclose(X,  np.dot(S_, A_) + ica.mean_)
True

次のチュートリアルページ
©2010 - 2016、scikit-learn developers(BSDライセンス)。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1