机器学习之K-Means聚类(python手写实现+使用Silhouette Coefficient来选取最优k值)

news2024/12/28 19:01:37

文章目录

  • K-Means
  • Silhouette Coefficient(轮廓系数)
  • 代码实现
  • 参考

K-Means

K-Means聚类又叫K均值聚类,是一种线性时间复杂度的聚类方法,也是比较成熟的一种聚类算法。
在这里插入图片描述
具体计算步骤如上。

Silhouette Coefficient(轮廓系数)

在"无监督学习" (unsupervised learning) 中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律,为进一步的数据分析提供基础。聚类结果的"簇内相似度" (intra-cluster similarity) 高且"簇间相似度" (inter-cluster similarity)被认为是比较好的聚类结果。

sklearn中对轮廓系数法的说明如下:
The Silhouette Coefficient is calculated using the mean intra-cluster
distance (a) and the mean nearest-cluster distance (b) for eachsample.
The Silhouette Coefficient for a sample is (b - a) / max(a, b).
To clarify, b is the distance between a sample and the nearestcluster that the sample is not a part of.
Note that Silhouette Coefficient is only defined if number of labelsis 2 <= n_labels <= n_samples - 1.

计算公式如下:
在这里插入图片描述

其中a(i)表示同簇相似度,计算方式为:
在这里插入图片描述

其中b(i)表示不同簇之间的不相似度,计算方式如下:
在这里插入图片描述
因此,轮廓系数取值为:
在这里插入图片描述
也就是说明s(i)越大说明聚类效果越好。

代码实现

data4.0:

密度,含糖率
0.697,0.46
0.774,0.376
0.634,0.264
0.608,0.318
0.556,0.215
0.403,0.237
0.481,0.149
0.437,0.211
0.666,0.091
0.243,0.267
0.245,0.057
0.343,0.099
0.639,0.161
0.657,0.198
0.36,0.37
0.593,0.042
0.719,0.103
0.359,0.188
0.339,0.241
0.282,0.257
0.748,0.232
0.714,0.346
0.483,0.312
0.478,0.437
0.525,0.369
0.751,0.489
0.532,0.472
0.473,0.376
0.725,0.445
0.446,0.459

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from sklearn import metrics
import pandas as pd
f = pd.read_csv("data4.0.csv")
 
def kmeans(data, center_ids, max_err=0.00001, max_round=100):
    process = []
    init_centers = []
    n = len(center_ids)
    for id in center_ids:
        init_centers.append(data[id, :])
    error, rounds = 1.0, 0
    while error > max_err and rounds < max_round:
        rounds += 1
        clusters = []
        for _ in range(n):
            clusters.append([])
        for j in range(len(data)):
            dist = []
            for i in range(n):
                vector = data[j, :] - init_centers[i]
                d_ji = np.dot(vector, vector) ** 0.5
                dist.append(d_ji)
            near_id = sorted(enumerate(dist), key=lambda x: x[1])[0][0]
            clusters[near_id].append(j)
 
        new_center = [0] * n
        error = 0
        for i in range(n):
            new_center[i] = np.sum(data[clusters[i], :], axis=0)
            new_center[i] /= len(clusters[i])
            vec = new_center[i] - init_centers[i]
            err = np.dot(vec, vec) ** 0.5
            if err:
                init_centers[i] = new_center[i]
                error += err

        data_ = np.zeros(data.shape)
        label_ = np.zeros(len(data))
        start = 0
        for i in range(len(center_ids)):
            num = len(clusters[i]) + start
            data_[start:num] = data[clusters[i]]
            label_[start:num] = i
            start = num
        label_ = label_.astype("int")
        process.append([data_, label_, new_center, rounds])  # 记录训练过程

    return process[-1] # 最后一次就是我们需要的结果


best_k = []
N = 10 # 最多10类
for n in range(2, N + 1): # 从2-10中寻找最佳k值
    data = f.values
    shuffle_indexes=np.random.permutation(len(data))
    init_centers = shuffle_indexes[:n]  # 对应的是选择的初始中心样本的id(随机选择)
    data_, label_, center, rounds  = kmeans(data, init_centers)  # 得到K-Means聚类的结果
    evaluate_res = metrics.silhouette_score( data_, label_)
    print("共%d簇 Silhouette Coefficient: %0.3f" %(n,  evaluate_res)) # 轮廓系数,越大聚类效果越好
    best_k.append((evaluate_res, n, data_, label_, center))

best_k = sorted(best_k, key=lambda x: x[0])[-1] # 选择聚类效果最好的k作为最终的聚类结果

fig, ax = plt.subplots(1, 1, figsize=(5, 5))
ax.set_xlim(0, 1)
ax.set_ylim(0, 0.6)
ax.set_ylabel('sugar')
ax.set_xlabel('density')
colors = np.array(["red", "gray", "orange", "pink", "blue", "black"])
silhouette_score, n, data_, label_, center = best_k
print("Silhouette Coefficient: %0.3f" % metrics.silhouette_score(data_, label_)) # 轮廓系数,越大聚类效果越好
plt.scatter(data_[:, 0], data_[:, 1], c=colors[label_], s=100)
plt.show()

结果:
在这里插入图片描述

参考

机器学习——周志华
聚类评价指标(轮廓系数 Silhouette coefficient)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/23229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

以前编写好能够正常运行的 SAP UI5 代码,几个月后忽然不能运行了该怎么办?

以笔者本套教材为例&#xff0c;每一步骤的源代码都托管在本人 Github 仓库里&#xff0c;每次上传之前&#xff0c;都确保本地测试通过。 但笔者编写过程中发现&#xff0c;之前测试通过的代码&#xff0c;可能几个月之后再执行&#xff0c;就会遇到白屏现象&#xff0c;即应…

ffplay数据读取线程

从这张图开始&#xff0c;主要介绍ffplay的读取线程部分。 从图中可以看出&#xff0c;解码线程的主要工作内容是将资源包从待解码列队中取出&#xff0c;然后送进解码器&#xff0c;最后将解码出的数据帧放入帧队列中&#xff0c;等待SDL获取播放。 【学习地址】&#xff1a;F…

【开源电路】ST-LINK/V2、ST-LINK/V2-1、DAP-LINK烧录器(已验证)

【开源电路】ST-LINK/V2、ST-LINK/V2-1、DAP-LINK烧录器&#xff08;已验证&#xff09;PCBA实物图 最终的的PCB 3D效果图 效果图和PCBA实物图差异说明 由于设计之初只考虑当ST-LINK V2来用&#xff0c;主要是用来给STM8和stm32烧录程序。没有考虑到会将固件升级到ST-LINK…

可变电阻元件封装

实验目的 掌握原理图封装的绘制操作掌握原理图封装和PCB封装的联系掌握PCB封装的绘制探索逻辑元件的选择 实验原理 采用EDA软件进行电路原理图设计 实验仪器 电脑、Altium Designer软件、相关元器件 实验内容 制作可变电阻元件 1. 创建工作环境2. 管理元件库在左侧面板中打开…

2023年,pmp还值得去考试吗?

为什么不值得呢&#xff1f;PMP的中文翻译过来就是项目管理专业人士&#xff0c;专业人士才考的证难道会差吗&#xff1f;有了它&#xff0c;即使是项目管理小白也能变成PMP专业人士&#xff01; 张嘴就冒那种别人听了就一脸懵但依然觉得你牛逼坏了的专业术语&#xff08;笑&a…

站稳前沿消费趋势,IU酒店持续领跑轻中端品牌

站稳前沿消费趋势&#xff0c;IU凸显品牌影响魅力 在疫情点状散发的背景下&#xff0c;身处一线的酒店行业深受影响&#xff0c;在现今错综复杂的市场环境中&#xff0c;投资者如何谋求机遇?酒店业为何破局重生?另一方面&#xff0c;随着消费升级以及年轻一代消费群体的崛起…

【SpringCloud】02 搭建springcloud微服务项目

文章目录搭建springcloud微服务项目1. 微服务父工程2. 创建子模块-shop-common3. 创建子模块--shop-product4. 创建子模块--shop-order搭建springcloud微服务项目 技术栈: springcloud-alibabamybatis-plus 持久性框架mysql数据库5.7以上springboot来搭建每个微服务。 1. 微服…

艾美捷Immunochemistry MitoPT JC-1试剂盒

艾美捷Immunochemistry MitoPT JC-1测定利用荧光染料JC-1检测线粒体膜去极化。当积聚在带负电的极化线粒体中时&#xff0c;JC-1发出橙色荧光。当线粒体膜电位在凋亡或代谢应激的细胞中崩溃时&#xff0c;JC-1试剂分散在细胞中并发出绿色荧光。使用流式细胞仪、荧光平板读取器或…

【场景化解决方案】慧致造ERP,为企业提供生产全流程数字化管理

方案简介 慧致造ERP以钉钉为基座&#xff0c;借助钉钉待办、工作通知、OA审批、工作台组件、酷应用、定制工作台等开放能力&#xff0c;围绕制造业生产管理场景与钉钉深度融合&#xff0c;为中小制造业打造业财一体化的生产制造解决方案&#xff0c;企业用户只需一个平台&…

Linux企业运维之git的使用

文章目录前言一、git简介以及基础操作二、github或者在gitee上创建项目并且上传本地项目自动化创建&#xff08;触发jenkins&#xff09;前言 一、git简介以及基础操作 git 简单来说就是版本控制系统 但是相对于其他版本控制系统来说&#xff0c;它又具有一些优点&#xff1a;…

集群渲染和渲染农场是什么意思?跟云渲染有什么关系?

嗨咯&#xff0c;大家好&#xff0c;今天后台有同学问集群渲染什么意思&#xff1f;集群渲染怎么做&#xff1f; 集群渲染&#xff08;cluster rendering&#xff09;指的是一组计算机通过通信协议连接在一起的计算机群&#xff0c;它们能够将工作负载从一个超载的计算机迁移到…

20款免费项目管理系统推荐

通过本篇文章您将了解&#xff1a;1、国内外20款最佳项目管理软件&#xff1b;2、使用免费项目管理工具可能面临的风险。一、项目管理软件的重要性 根据 Capterra 的数据研究&#xff0c;项目管理软件即将成为人们最需要的软件。一个项目无论大小&#xff0c;都需要一款高效且…

基于PHP+MySQL游戏视频网站的设计与实现

游戏是茶前饭后一个很好的娱乐方式,但是由于当下网络的高速发展,游戏的模式和种类也丰富多彩,这就导致很多时候人们不能够很快的对游戏上手。 为了改变这一情况很多视频娱乐类网站都出现了游戏视频,但是大多数时候这种网站并不是一个专业的游戏视频网站,跟多的时候是各类电影和…

SpringMVC学习

SpringMVCSpring MVC概述&#xff1a;**什么是Spring MVC &#xff1f;****什么是MVC?**第一个SpringMVC程序具体步骤&#xff1a;具体实现&#xff1a;第一个SpringMVC小程序的完善Spring MVC概述&#xff1a; 什么是Spring MVC &#xff1f; 他是基于MVC开发模式的框架&am…

数学建模英文论文的写作方法和步骤

目录 一、语言技巧 二、论文结构 1.标题写作 2.摘要写作时态​编辑 2.2摘要写作语态 2.3摘要写作人称 2.4摘要写作注意事项 3.问题重述 4. 符号说明​编辑 三线表 ​5.模型假设(以三到七个合理假设为宜 ) 6.模型分析及建立模型 7.模型求解 8.模型检验 9.模型优…

电视剧里的代码真能运行吗?

大家好&#xff0c;欢迎来到 Crossin的编程教室 &#xff01; 前几天&#xff0c;后台老有小伙伴留言“爱心代码”。这不是Crossin很早之前发过的内容嘛&#xff0c;怎么最近突然又被人翻出来了&#xff1f;后来才知道&#xff0c;原来是一部有关程序员的青春偶像剧《点燃我,温…

022_SSS_Novel View Synthesis with Diffusion Models

Novel View Synthesis with Diffusion Models 1. Introduction 本文利用diffusion模型&#xff0c;在给定参考图的条件下&#xff0c;生成指定pose的图像&#xff0c;作者称为3DiM。并且可以在给定一张特定视角的图的条件下&#xff0c;生成其他所有视角的图。 本文的主要贡…

Treap 原理详解和实战

一 点睛 Treap 指 Tree heap&#xff0c;又叫作树堆&#xff0c;同时满足二叉搜索树和堆两种性质。二叉搜索树满足中序有序性&#xff0c;输入序列不同&#xff0c;创建的二叉搜索树也不同&#xff0c;在最坏的情况下&#xff08;只有左子树或只有右子树&#xff09;会退化为…

CMCT-FA修饰阿霉素纳米脂质体/ADR-HAS-MS单抗Hab18偶联阿霉素人血清白蛋白微球的制备方法

瑞禧生物这里整理的内容是CMCT-FA修饰阿霉素纳米脂质体/ADR-HAS-MS单抗Hab18偶联阿霉素人血清白蛋白微球的相关制备方法&#xff0c;来学习&#xff01; MCT-FA修饰阿霉素纳米脂质体的研究&#xff1a; 利用1-乙基-3-(3-二甲基丙基)-碳二亚胺(EDC)介导 反应合成了叶酸偶联的羧甲…

LeetCode刷题---160. 相交链表(双指针-对撞指针)

文章目录一、编程题&#xff1a;160. 相交链表&#xff08;双指针-对撞指针&#xff09;1.题目描述2.示例1&#xff1a;3.示例2&#xff1a;4.示例3&#xff1a;5.提示&#xff1a;6.提示&#xff1a;二、解题思路1.思路2.复杂度分析&#xff1a;3.算法图解三、代码实现总结一、…