[Учебное пособие по Scikit-learn] 02.04 Обучение без учителя: стремление к представлению данных

искусственный интеллект алгоритм scikit-learn робот
[Учебное пособие по Scikit-learn] 02.04 Обучение без учителя: стремление к представлению данных

Добро пожаловать на главный сайт Jizhi:Jizhi, двигатель, ведущий к эре интеллекта


Уведомление!

Весь код в этой статье можно запустить и отладить в исходном посте Jizhi (установочная среда не требуется).кликните сюдаперейти к исходному сообщению


Кластеризация: кластеризация по номерам

Проблемы, решаемые кластеризацией

Для набора данных радужной оболочки, если вы знаете, что есть три категории, но не знаете, какие три категории, вы можете попробоватькластеризацияАлгоритм: Разделите образцы на отдельные группы.

Кластеризация K-средних

Существует множество стандартов кластеризации и соответствующих алгоритмов, самый простой алгоритм кластеризации — K-средних.

# 从Scikit-learn导入聚类和数据集两个模块
from sklearn import cluster, datasets

iris = datasets.load_iris()
X_iris = iris.data
y_iris = iris.target

# 创建聚类器对象,指定分组数量为3,并将结果每隔10个数据赋值予变量y_iris_k_means
k_means = cluster.KMeans(n_clusters=3)
k_means.fit(X_iris) 
y_iris_k_means = k_means.labels_[::10]

# 分别输出聚类算法结果,与标签进行对比
print("K-means聚类结果:")
print(y_iris_k_means)
print("数据集原始标签:")
print(y_iris[::10])
# 从Scikit-learn导入聚类和数据集两个模块
from sklearn import cluster, datasets

iris = datasets.load_iris()
X_iris = iris.data
y_iris = iris.target

# 创建聚类器对象,指定分组数量为3,并将结果每隔10个数据赋值予变量y_iris_k_means
k_means = cluster.KMeans(n_clusters=3)
k_means.fit(X_iris) 
y_iris_k_means = k_means.labels_[::10]

# 分别输出聚类算法结果,与标签进行对比
print("K-means聚类结果:")
print(y_iris_k_means)
print("数据集原始标签:")
print(y_iris[::10])
len(y_iris_k_means) == 15
导入cluster和datasets模块
创建数据集和聚类器对象cluset.KMeans()
结果每隔10个数据赋值予变量y_iris_k_means
与datasets自带的标签进行对比

предупреждать:Алгоритм не гарантирует восстановление истинных и точных кластеров (наземная правда). Во-первых, сложно выбрать правильное количество группировок, во-вторых, алгоритм чрезвычайно чувствителен к начальным условиям, и хотя Scikit-learn предпринимает ряд мер, чтобы этого избежать, риск застрять в локальных минимумах все же есть.

Не переоценивайте результаты кластеризации.

Пример приложения: квантованные векторы

Алгоритмы кластеризации в широком смысле и K-Means в частности можно рассматривать как выбор небольшого набора парадигм для сжатия объема информации.Эта проблема, также известная как векторное квантование, может использоваться для разделения изображений:

%matplotlib inline
import numpy as np
from sklearn import cluster
import matplotlib.pyplot as plt
# 导入科学计算库Scipy并缩写为sp
import scipy as sp
try:
    # 创建face对象,设置为灰度
    face = sp.face(gray=True)
except AttributeError:
    from scipy import misc
    face = misc.face(gray=True)

# 将图像转化为形如 (n_sample, n_feature) 的矢量
X = face.reshape((-1, 1)) 
k_means = cluster.KMeans(n_clusters=5, n_init=1)
k_means.fit(X) 

values = k_means.cluster_centers_.squeeze()
labels = k_means.labels_

face_compressed = np.choose(labels, values)
face_compressed.shape = face.shape

plt.imshow(face_compressed)

# 导入科学计算库Scipy并缩写为sp
import scipy as sp
try:
    # 创建face对象,设置为灰度
    face = sp.face(gray=True)
except AttributeError:
    from scipy import misc
    face = misc.face(gray=True)

# 将图像转化为形如 (n_sample, n_feature) 的矢量
X = face.reshape((-1, 1)) 
k_means = cluster.KMeans(n_clusters=5, n_init=1)
k_means.fit(X) 

values = k_means.cluster_centers_.squeeze()
labels = k_means.labels_

face_compressed = np.choose(labels, values)
face_compressed.shape = face.shape

plt.imshow(face_compressed)


原始图像        K-means量化       等组距    图像直方图

Иерархическая агломеративная кластеризация

Иерархическая кластеризация

**Агломеративный - ** Восходящий подход: каждая точка выборки начинается как отдельный класс, затем итеративно постепенно объединяется, чтобы минимизировать дискриминант. Этот метод особенно полезен, когда каждый кластер содержит несколько точек выборки. Но когда общее количество кластеров велико, вычислительные затраты превышают K-средних.

** Разделительный — ** Метод «сверху вниз»: все точки выборки сначала принадлежат к одному классу, а затем постепенно итеративно разделяются для формирования иерархии. Этот метод не только медленный, но и статистически плохо обусловленный при работе с задачами с большим количеством кластеров.

Кластеризация с ограничением подключения

В агломеративной кластеризации выборки, принадлежащие классу, можно указать с помощью графа связности. В Scikit графы представлены в виде их матриц смежности, которые обычно разрежены. Этот метод полезен при кластеризации изображений, например при извлечении связанных областей (иногда называемых связанными компонентами).

%matplotlib inline
import scipy as sp
import matplotlib.pyplot as plt

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


# 生成数据
try:
    face = sp.face(gray=True)
except AttributeError:
    # face在更新的Scipy版本中位于misc
    from scipy import misc
    face = misc.face(gray=True)

# 为加快处理速度,将尺寸缩小至10%
face = sp.misc.imresize(face, 0.10) / 255.
import matplotlib.pyplot as plt

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


# 生成数据
try:
    face = sp.face(gray=True)
except AttributeError:
    # face在更新的Scipy版本中位于misc
    from scipy import misc
    face = misc.face(gray=True)

# 为加快处理速度,将尺寸缩小至10%
face = sp.misc.imresize(face, 0.10) / 255.

plt.imshow(face)

Особенности конденсации

Известно, что разреженность помогает уменьшить проклятие размерности (недостаточное количество точек выборки по сравнению с большим количеством признаков). Другой подход заключается в объединении схожих функций: сплоченность функций. Конкретный метод реализации заключается в выполнении кластеризации в «направлении» функции, другими словами, кластеризации транспонированных данных.

%matplotlib inline
import numpy as np
from sklearn import cluster, datasets
import matplotlib.pyplot as plt
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) 
X_reduced = agglo.transform(X)

X_approx = agglo.inverse_transform(X_reduced)
images_approx = np.reshape(X_approx, images.shape)

plt.imshow(image_approx)
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) 
X_reduced = agglo.transform(X)

X_approx = agglo.inverse_transform(X_reduced)
images_approx = np.reshape(X_approx, images.shape)

Методы преобразования и обратного преобразования

Некоторые предикторы предоставляют методы преобразования, такие как уменьшение размерности набора данных.

Декомпозиция: от сигнала к компонентам и нагрузкам

Состав и загрузка

ПредполагатьXявляются многомерными данными, следующий вопрос заключается в том, как анализировать и реконструировать различные контрольные показатели выборки: загрузитьLи набор ингредиентовCсделатьX=LCучредил. Существуют разные критерии выбора ингредиентов.

Анализ главных компонентов (PCA: анализ главных компонентов)

Анализ главных компонент выбирает компоненты в сигнале, которые представляют наибольшую дисперсию.

enter_image_description_here

Выборочное облако точек на изображении выше очень плоское в одном направлении: один из трех одномерных признаков можно почти даже вычислить из двух других. PCA ищет направление, в котором данные не плоские. При преобразовании данных PCA может уменьшить размерность данных, проецируя их в подпространства.

%matplotlib inline
import numpy as np
# 创建一个变量,只有两个有效维度
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.n_components = 2
X_reduced = pca.fit_transform(X)
X_reduced.shape
# 创建一个变量,只有两个有效维度
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.n_components = 2
X_reduced = pca.fit_transform(X)
X_reduced.shape
X_reduced.shape == (100,2)
from sklearn import decomposition
pca = decomposition.PCA()
pca.fit(X)

Анализ независимых компонентов (ICA: анализ независимых компонентов)

Анализ независимых компонентов выбирает такое распределение компонентов, которое дает компонентам их нагрузки наиболее независимую информацию и позволяет восстановить негауссову информацию.

enter_image_description_here

import numpy as np
from sklearn import decomposition
# 生成示例数据
time = np.linspace(0, 10, 2000)
s1 = np.sin(2 * time)  # 信号1:正弦波Signal 1 : sinusoidal signal
s2 = np.sign(np.sin(3 * time))  # 信号2:方波
S = np.c_[s1, s2]
S += 0.2 * np.random.normal(size=S.shape)  # 添加噪音
S /= S.std(axis=0)  # 标准化数据

# 合并数据
A = np.array([[1, 1], [0.5, 2]])  # 合并矩阵
X = np.dot(S, A.T)  # 生成采样

# 计算独立成分分析
ica = decomposition.FastICA()
S_ = ica.fit_transform(X)  # 获得预测源
A_ = ica.mixing_.T
np.allclose(X,  np.dot(S_, A_) + ica.mean_)
# 生成示例数据
time = np.linspace(0, 10, 2000)
s1 = np.sin(2 * time)  # 信号1:正弦波Signal 1 : sinusoidal signal
s2 = np.sign(np.sin(3 * time))  # 信号2:方波
S = np.c_[s1, s2]
S += 0.2 * np.random.normal(size=S.shape)  # 添加噪音
S /= S.std(axis=0)  # 标准化数据

# 合并数据
A = np.array([[1, 1], [0.5, 2]])  # 合并矩阵
X = np.dot(S, A.T)  # 生成采样

# 计算独立成分分析
ica = decomposition.FastICA()
S_ = ica.fit_transform(X)  # 获得预测源
A_ = ica.mixing_.T
np.allclose(X,  np.dot(S_, A_) + ica.mean_)
np.allclose(X,  np.dot(S_, A_) + ica.mean_) == True
# 生成示例数据
time = np.linspace(0, 10, 2000)
s1 = np.sin(2 * time)  # 信号1:正弦波Signal 1 : sinusoidal signal
s2 = np.sign(np.sin(3 * time))  # 信号2:方波
...
ica = decomposition.FastICA()



Рекомендуемое чтение

Поддразнивание мошенников электронной почты с помощью PaddlePaddle (конец)

Этот комментарий ядовит! ——Общая процедура для классификации текста

Я сделал робота по имени Серсея, но она просто хотела, чтобы сир Грегор убивал меня на каждом шагу.