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

news/2024/5/20 7:28:41 标签: python, kmeans, 聚类

无监督

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

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

看代码

python"># 导入包
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()

看效果

一维数据

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

在这里插入图片描述

多维数据

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

在这里插入图片描述


http://www.niftyadmin.cn/n/783859.html

相关文章

9.11

Ls -lt 按照时间顺序排列 Inode 节点 -i Ls -l Ll Ll -a Ll -d ls -i Ll -h 介质-双绞线 STP 屏蔽 UTP 非屏蔽 介质-光纤 波长-光单位 冲突域 共享式网络中,不同的主机同时发送数据时,就会产生信号冲突的问题 CSMA/CD 载波侦听多路访问/冲突检测技术 C…

进程应用之fork 和 execve

如果要了解进程和线程的区别请参考&#xff1a;进程和线程的描述 1.fork(&#xff09;函数介绍 #include<sys/types.h> #include<unistd.h> pid_t fork(void);这个函数虽然执行一次&#xff0c;但是会返回2次的不同的值。就是在这里一个进程会变为两个进程&#…

Android视频的放大和缩小

Android视频的放大和缩小 这个还是在很久以前的时候写的&#xff0c;当时公司有一个需求&#xff0c;就是需要仿360或者是小蚁的app&#xff0c;做一个视频的放大缩小&#xff0c;当时是搜遍了&#xff0c;搜到的都是关于图片的放大缩小等&#xff0c;无奈之下&#xff0c;就自…

Pinpoint完整集群实现,包括flink集群的加入

Pinpoint是韩国人开发的一套基于java的Apm&#xff08;应用性能监控&#xff09;&#xff0c;具有低延迟、实时监控、拓扑发现、低性能损耗的特点&#xff08;官方预估是3%&#xff09;&#xff0c;同事有一个完善的web后台&#xff0c;一目了然查看应用拓扑。 安装使用前我搜索…

延迟绑定(PLT)

ELF动态连接时&#xff0c;会PLT&#xff08;procesure linkage table&#xff09;的方式来进程链接其他模块的函数。就是不会把所有的函数都链接好&#xff0c;而是在第一次去调用的时候去连接 #include<stdio.h> #include<stdlib.h>int main(int argc, char **a…

计算机数据存储方式-源码和补码

计算机的数据都是以补码的形式来存在的&#xff0c;计算机只能进行加法不能经行减法运行&#xff0c;通过补码来变相实现减法 正数的补码是本身负数的补码是&#xff0c;最高位&#xff08;符号位&#xff09;不变&#xff0c;原码取反&#xff0c;再加一 char a 2; 的存在方…

C语言中字符串和字符数组

字符串概念&#xff1a; C语言中字符串就是用双引号括起来的任意字符序列&#xff0c;在字符串中同时也可以包括转义字符&#xff0c;它是以’\0’为结尾的字符数组 如”helloworld”; char *string “helloworld”; 字符数组&#xff1a; 用来存放字符的数组&#xff0c…

中秋福利 | 10本技术图书(编程语言、数据分析等)免费送

中秋将至&#xff0c;技术宅们有福利了&#xff0c;网易云社区联合博文视点为大家送来一大波技术图书&#xff0c;内容涉及Kubernetes、Go语言、OpenResty、Python编程、Spark SQL、PyTorch等&#xff0c;话不多说&#xff0c;“十仁”干货陪你过中秋。知乎活动的帖子&#xff…