对于复杂的多维数据,很多时候如果通过PCA或NMF进行降维处理,可能会完全破坏数据集的结构,这个时候我们可以尝试通过K均值使用多个簇中心来进行处理,下面我们以two_moons数据集为例来进行说明。
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
x, y = make_moons(n_samples=200, noise=0.05, random_state=0)
#使用15个簇中心
kmeans = KMeans(n_clusters=15, random_state=0)
kmeans.fit(x)
y_pred = kmeans.predict(x)
plt.scatter(x[:, 0], x[:, 1], c=y_pred, s=60,cmap='Paired')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=60,
marker='^', c=range(kmeans.n_clusters), linewidth=2, cmap='Paired')
plt.xlabel("feature 0 value")
plt.ylabel("feature 1 value")
print("cluster memberships:\n{}".format*(y_pred))
运行后结果如下:
利用K均值的许多簇来表示复杂数据集的变化
这里我们使用了15个簇中心,也就是说,我们给每个点都分配了0-14之间的数字,我们可以将其看作是15个分量表示的数据(15个特征),只有表示该点对应的簇中心的那个特征不为0, 其余特征均为0,利用该15维表示,现在可以用线性模型来划分两个半月形,而利用原始的两个特征不可能做到这一点。将得到的每个簇中心的距离作为特征,还可以得到一种表现力更强的表示,可以利用kmeans的transform方法来实现这一点:
distance_features = kmeans.transform(x)
print("Distance feature shape: {}".format(distance_features.shape))
print("distance features:\n{}".format(distance_features))
打印出来的结果如下:
K均值在two_moons数据集上使用15个簇中心的距离特征
K均值是非常流行的聚类算法,因为它不仅相对容易理解和实现,而且运行速度也相对较快,K均值可以轻松扩展到大型数据集,scikit-learn甚至在MinMAXScaler类中办好了一种根据扩展性的变体,可以处理非常大的数据集。
K均值缺点之一在于,它依赖于随机初始化,也就是说,算法的输出依赖于随机种子。默认情况下,scikit-learn用10中不同的随机初始化将算法运行10次,并返回最佳结果(簇的方差之和最小),K均值还有一个缺点,就是对簇形状的假设的约束性较强,而且还要求指定所需要寻找簇的个数(事先应用中可能不知道这个数字)。
领取专属 10元无门槛券
私享最新 技术干货