Python Kmeans聚类挑选合适的K值可视化

无监督

无监督聚类这里使用了Kmeans的聚类方式,适用于凸数据集,当然如果有更好的聚类方式也可以替换的。

输入一系列数据,输出的就是这一系列数据的标签。

看代码

# 导入包
import numpy as np
from sklearn.cluster import KMeans
from yellowbrick.cluster.elbow import kelbow_visualizer
import matplotlib.pyplot as plt
from sklearn import manifold

# 无监督聚类出具labels
def y_knn(X):
    data_X = np.array(X)
    
    # 变形状
    if len(data_X.shape) == 1:
        data_X = data_X.reshape(-1, 1)
    
    # 找出最合适的K
    oz = kelbow_visualizer(KMeans(random_state=1, n_init='auto'), data_X, k=(2,20))
    k = oz.elbow_value_
    
    # 再进行KMeans聚类
    kmeans = KMeans(n_clusters=k, random_state=1, n_init='auto')
    kmeans.fit(data_X)
    
    # 获取每个点的类别信息
    labels = kmeans.predict(data_X)
    
    return labels


# 原始数据如果是一维的这样画
def draw1w(X, labels):
    X = np.array(X)
    min_arr = []
    max_arr = []
    
    for l in range(len(set(labels))):
        x = X.reshape(-1)[np.where(labels==l)]
        z_min = min(x)
        z_max = max(x)
        print(z_min, z_max)
        min_arr.append(z_min)
        max_arr.append(z_max)

        print(sorted(min_arr), sorted(max_arr))
        
    li_arr = [sorted(min_arr)[0]] + sorted(max_arr)
    print(li_arr)
    # L_ARR[i] = li_arr  
    # 获取簇中心
#     centers = kmeans.cluster_centers_
    
#     print(labels, centers)
    
    plt.figure(figsize=(8, 1))
    for i_x in li_arr:
        # 画两条虚线
        plt.plot([i_x, i_x], [-0.1, 0.1], c='b', linestyle='--')
    
    # 可视化聚类结果和分界线
    plt.scatter(X.reshape(-1, 1)[:, 0], [0]*len(X.reshape(-1, 1)[:, 0]), c=labels, cmap="viridis")
    plt.colorbar()
    plt.show()

# 原始数据是多维度的,这样画
def draw2w(X, labels):
    # 将数据降维,降维出来就是X_tsne
    tSNE = manifold.TSNE(n_components=2, init='pca', random_state=0)
    X_tsne = tSNE.fit_transform(X)
    
    # 画一下
    plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=labels, cmap="viridis")
    plt.colorbar()
    plt.show()

看效果

一维数据

X = np.random.random(100) 
labels = y_knn(X)
draw1w(X, labels)

在这里插入图片描述

多维数据

X = np.random.random((100, 5)) 
labels = y_knn(X)
draw2w(X, labels)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u010095372/article/details/131469934