Добро пожаловать на главный сайт 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-средних.
** Разделительный — ** Метод «сверху вниз»: все точки выборки сначала принадлежат к одному классу, а затем постепенно итеративно разделяются для формирования иерархии. Этот метод не только медленный, но и статистически плохо обусловленный при работе с задачами с большим количеством кластеров.
Кластеризация с ограничением подключения
В агломеративной кластеризации выборки, принадлежащие классу, можно указать с помощью графа связности. В 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)
Методы преобразования и обратного преобразования
Некоторые предикторы предоставляют методы преобразования, такие как уменьшение размерности набора данных.
Декомпозиция: от сигнала к компонентам и нагрузкам
Состав и загрузка
Предполагатьявляются многомерными данными, следующий вопрос заключается в том, как анализировать и реконструировать различные контрольные показатели выборки: загрузитьи набор ингредиентовсделатьучредил. Существуют разные критерии выбора ингредиентов.
Анализ главных компонентов (PCA: анализ главных компонентов)
Анализ главных компонент выбирает компоненты в сигнале, которые представляют наибольшую дисперсию.
Выборочное облако точек на изображении выше очень плоское в одном направлении: один из трех одномерных признаков можно почти даже вычислить из двух других. 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: анализ независимых компонентов)
Анализ независимых компонентов выбирает такое распределение компонентов, которое дает компонентам их нагрузки наиболее независимую информацию и позволяет восстановить негауссову информацию.
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()