如何使用 k-means 输出(提取的特征)作为 SVM 输入?

数据挖掘 支持向量机 k-均值
2021-10-10 00:19:17

我有一个带有标签的图像数据集。l 将它们放入k-means算法中(作为特征提取器)。现在,我想使用这种新的图像表示(从 k-means 算法中提取的特征)作为 SVM 分类器的输入。我怎么能这样做?簇数 k=400,图像数=1000。

但是,我只有质心向量(400 个质心)

l 需要获得每个图像相对于质心的表示。

编辑1

包更新

from sklearn import mixture
gmm = mixture.GMM(n_components=6).fit(X)

现在我想用不同的 k=range(50,500) 运行 k-means,我怎样才能得到每个 k 的距离?执行以下操作是正确的:

K=range(50,500)
KM=[KMeans(n_clusters=k).fit(X) for k in K]
distances = [np.column_stack([np.sum((X - center)**2, axis=1)**0.5 for center in C.cluster_centers_]) for C in KM]
1个回答

每个观察值的 k-means 算法的“预测”只是相应的质心。因此,您可以获取预测质心的向量并将其用作分类特征(可能是单热编码)。

但这只是一个功能。只需少量编码,您就可以做得更好。例如,您可以找到每个样本到每个样本的距离ķ集群中心,因此创建ķ新特性。一个 Python 示例:

from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.svm import SVC
import numpy as np
iris =  load_iris()
X = iris['data']
y = iris['target']
kmeans = KMeans(n_clusters=6).fit(X)
distances = np.column_stack([np.sum((X - center)**2, axis=1)**0.5 for center in kmeans.cluster_centers_])
svm = SVC().fit(distances, y)

另一种(可能更简单的方法)是拟合高斯混合模型(例如通过scikit-learn)。它类似于 k-means,但对于每个观察,都会产生一个集群上的概率分布,而不是单个集群标签。这些预测聚类概率的向量也可以用作特征。

from sklearn.mixture import GaussianMixture
gmm = GaussianMixture(n_components=6).fit(X)
proba = gmm.predict_proba(X)
svm2 = SVC().fit(proba, y)