文章目录

  • 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, 0while error > max_err and rounds < max_round:rounds += 1clusters = []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.5dist.append(d_ji)near_id = sorted(enumerate(dist), key=lambda x: x[1])[0][0]clusters[near_id].append(j)new_center = [0] * nerror = 0for 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.5if err:init_centers[i] = new_center[i]error += errdata_ = np.zeros(data.shape)label_ = np.zeros(len(data))start = 0for i in range(len(center_ids)):num = len(clusters[i]) + startdata_[start:num] = data[clusters[i]]label_[start:num] = istart = numlabel_ = 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.valuesshuffle_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)

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

  1. 用 Python 手写机器学习最简单的 KNN 算法

    作者 | 苏克1900 责编 | 胡巍巍 说实话,相比爬虫,掌握机器学习更实用竞争力也更强些. 目前网上大多这类教程对新手都不友好,要么直接调用 Sklearn 包,要么满篇抽象枯燥的算法公式文字,看 ...

  2. Python 手写机器学习最简单的 kNN 算法

    https://www.toutiao.com/a6698919092876739079/ Python 手写机器学习最简单的 kNN 算法 苏克1900 Python爬虫与数据挖掘 本文 3000 ...

  3. 【机器学习与算法】python手写算法:Cart树

    [机器学习与算法]python手写算法:Cart树 背景 代码 输出示例 背景 Cart树算法原理即遍历每个变量的每个分裂节点,找到增益(gini或entropy)最大的分裂节点进行二叉分割. 这里只 ...

  4. Python手写实现LDA与QDA算法

    Python手写实现LDA与QDA算法 简略版 LDA QDA 完整版 LDA QDA 对IRIS数据集进行实验 近期实验室在上一门机器学习的讨论班,第一次作业中有一道题要求实现LDA算法与QDA算法 ...

  5. python 手写数字识别 封装GUI,手写板获取鼠标写字轨迹信息

    python 手写数字识别知识不用多说,本文用深度学习Python库Keras实现深度学习入门教程mnist手写数字识别.mnist手写数字识别是机器学习和深度学习领域的"hello wor ...

  6. Python手写线性回归算法

    作者 | 苏南下 来源 | 机器会学习ML(ID:AI_Learning007) 摘要:通俗易懂介绍线性回归算法,并 Python 手写实现. 之前我们介绍了:kNN 算法,主要用于解决分类问题,也可 ...

  7. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  8. 用python手写KNN算法+kd树及其BBF优化(原理与实现)(下篇)

    用python手写KNN算法+kd树及其BBF优化(原理与实现)(下篇) 接上一篇用python手写KNN算法+kd树及其BBF优化(原理与实现)(上篇) 我们使用training2和test2两个数 ...

  9. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

最新文章

  1. php 命令执行crud_如何使用原始JavaScript执行CRUD操作
  2. wait和notify
  3. 用sql从文件中恢复数据库
  4. Dubbo 和 HSF 在阿里巴巴的实践:携手走向下一代云原生微服务
  5. mtk一键usb驱动_三菱MRJEB驱动器报错,导致报错原因37.1参数设置范围异常?
  6. 安装Microsoft Windows SDK 7.1时出现的错误(附解决办法)
  7. 支持向量机: Maximum Margin Classifier
  8. 3-3-ServletContext接口
  9. go web框架_golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web
  10. GoAhead2.5源代码分析之1-用户管理(um.c)
  11. 2018年终盘点:“年度爆款”的区块链真的结束了吗?
  12. Python变量:声明,连接,全局和本地
  13. 安装多个win10系统
  14. 税控盘版开票助手开发
  15. 解决异常:Premature end of chunk coded message body: closing chunk expected
  16. 百度地图 变黑问题 解决方法
  17. 小学计算机教育计划,2021年小学信息技术教学计划
  18. 80C51单片机:4.中断、定时器
  19. 基岩版服务器开启坐标显示,mc基岩版怎么看坐标 mc基岩版如何看坐标
  20. 桌面虚拟化项目的前期规划和测算

热门文章

  1. Invalid attempt to spread non-iterable instance错误
  2. 实现抖音霓虹灯效果---OpenCV-Python开发指南(55)
  3. 基于PHP+MySQL音乐网站的设计与开发
  4. tplink android管理软件,tplink路由器app下载
  5. Presto 在 Pinterest 的实践
  6. 360搜索、UC浏览器等被3·15点名应用已下架;马斯克宣布通过NFT卖歌;美团App再发力社交,内测 “群聊”功能...
  7. JAVA关于集合类小程序--模拟新浪用户注册
  8. 请出中本聪,迎接新世界(1-5)
  9. Windows XP注册表与驱动程序优化全集
  10. css中默认值的灰色rgb_rgb()函数以及CSS中的示例