日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Python Kmeans聚類挑選合適的K值可視化

作者:赫凱 更新時(shí)間: 2023-07-07 編程語(yǔ)言

無(wú)監(jiān)督

無(wú)監(jiān)督聚類這里使用了Kmeans的聚類方式,適用于凸數(shù)據(jù)集,當(dāng)然如果有更好的聚類方式也可以替換的。

輸入一系列數(shù)據(jù),輸出的就是這一系列數(shù)據(jù)的標(biāo)簽。

看代碼

# 導(dǎo)入包
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

# 無(wú)監(jiān)督聚類出具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_
    
    # 再進(jìn)行KMeans聚類
    kmeans = KMeans(n_clusters=k, random_state=1, n_init='auto')
    kmeans.fit(data_X)
    
    # 獲取每個(gè)點(diǎn)的類別信息
    labels = kmeans.predict(data_X)
    
    return labels


# 原始數(shù)據(jù)如果是一維的這樣畫(huà)
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:
        # 畫(huà)兩條虛線
        plt.plot([i_x, i_x], [-0.1, 0.1], c='b', linestyle='--')
    
    # 可視化聚類結(jié)果和分界線
    plt.scatter(X.reshape(-1, 1)[:, 0], [0]*len(X.reshape(-1, 1)[:, 0]), c=labels, cmap="viridis")
    plt.colorbar()
    plt.show()

# 原始數(shù)據(jù)是多維度的,這樣畫(huà)
def draw2w(X, labels):
    # 將數(shù)據(jù)降維,降維出來(lái)就是X_tsne
    tSNE = manifold.TSNE(n_components=2, init='pca', random_state=0)
    X_tsne = tSNE.fit_transform(X)
    
    # 畫(huà)一下
    plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=labels, cmap="viridis")
    plt.colorbar()
    plt.show()

看效果

一維數(shù)據(jù)

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

在這里插入圖片描述

多維數(shù)據(jù)

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

在這里插入圖片描述

原文鏈接:https://blog.csdn.net/u010095372/article/details/131469934

  • 上一篇:沒(méi)有了
  • 下一篇:沒(méi)有了
欄目分類
最近更新