k-means算法Python实现--机器学习ML

2023-11-09

k-means algorithm

一些概念

partial clustering:每一簇的数据不重叠,至少一簇一个数据;

hieraichical clustering:通过构建层次结构来确定聚类分配;

density-based clustering:根据密度分配,在被低密度区域分隔的高密度数据点的地方分配集群;

import packages

import matplotlib.pyplot as plt
from kneed import KneeLocator
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler

generate data

features,true_labels = make_blobs(n_samples = 200,
                                  centers = 3,
                                  cluster_std = 2.75,
                                  random_state = 42)
功能:生成各向同性的高斯斑点以进行聚类(产生数据集和相应的标签)
参数:
  • n_samples-int(在簇之间平均分配的点总数)或数组(每个元素表示每个簇的样本数)
  • n_features-int,每个样本的特征数量
  • centers-要生成的中心数或者固定的中心位置,如果n_samples是一个int且center为None,则生成3个中心;如果n_samples是数组,则中心必须为None或者长度等于n_samples长度的数组
  • cluster_std-浮点数或浮点数序列,聚类的标准偏差
  • center_box-一对浮点数,随机生成中心时每个聚类中心的边界框
  • shuffle-样本洗牌
  • random_state-用于创建数据集的随机数生成
返回值
  • 形状为[n_samples,n_features]的X数组
  • 形状为[n_samples]的y数组

standarization

目的

  • 对数据进行标准化处理,可以加快梯度下降求最优解的速度,还有可能提高精度(防止结果被过大的特征值主导)

方法

  • zero-mean normalized: X = ( x − μ ) s i g m a X=(x-\mu)^{sigma} X=(xμ)sigma,通常用于一些通过距离得出相似度的聚类算法中
  • min-max normalized: ( x − X m i n ) / ( x − X m a x ) (x-X_{min})/(x-X_{max}) (xXmin)/(xXmax),线性的归一化手段,特点是不会对数据分布产生影响,在图像处理上常用
  • non-linear normalized:包括log,exp,arctan,sigmoid等
  • length-one normalized: x = x ∥ x ∥ x=\frac{x}{\left\|x\right\|} x=xx,把特征转为单位向量的形式,可以剔除特征的强度影响,用在不考虑向量大小而考虑向量方向的问题中,如文本情感的分类
scaler = StandardScaler()
scaled_features = scaler.fit_transform(features)

clustering

参数

  • n_clusters:聚类中心数量
  • max_iter:最大迭代次数
  • tol:容忍度最小误差,误差小于tol就会退出迭代
  • n_init:随机运行的次数,最终的结果将是最好的一个聚类结果
  • init:聚类中心的初始化方案,有{‘k-means++’,‘random’,an ndarray},ndarray则矩阵的每一行作为聚类中心
  • algorithm:可选的距离计算算法{‘auto’,‘full’,‘elkan’}
  • precompute_distances : 是否将数据全部放入内存计算,可选{‘auto’, True, False},开启时速度更快但是更耗内存
  • random_state : 用于随机产生中心的随机序列
  • verbose : 是否输出详细信息,默认为0,bush
  • copy_x : 是否直接在原矩阵上进行计算。默认为True,会copy一份进行计算。
kmeans = KMeans(
        init = 'random',
        n_clusters = 3,
        max_iter = 300,
        random_state = 42
)

对数据执行kmeans算法

kmeans.fit(scaled_features)
KMeans(algorithm='auto', copy_x=True, init='random', max_iter=300, n_clusters=3,
       n_init=10, n_jobs=None, precompute_distances='auto', random_state=42,
       tol=0.0001, verbose=0)

lowest SSE

kmeans.inertia_
74.57960106819854

final locations of the centroid

kmeans.cluster_centers_
array([[-0.25813925,  1.05589975],
       [-0.91941183, -1.18551732],
       [ 1.19539276,  0.13158148]])

choose the appropriate number of clusters

elbow method
kmeans_kwargs = {
    'init':'random',
    'n_init':10,
    'max_iter':300,
    'random_state':42,
}
sse = []
for k in range(1,11):
    kmeans = KMeans(n_clusters = k,**kmeans_kwargs)
    kmeans.fit(scaled_features)
    sse.append(kmeans.inertia_)
 plt.style.use("fivethirtyeight")
 plt.plot(range(1, 11), sse)
 plt.xticks(range(1, 11))
 plt.xlabel("Number of Clusters")
 plt.ylabel("SSE")
 plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tuoOCJo3-1626317442243)(output_22_0.png)]

  • 发现sse的大小随着聚类数量的增加在逐渐减小
  • 使用函数来找到‘肘点’
kl = KneeLocator(
    range(1,11),sse,
    curve = 'convex',direction = 'decreasing'
)
kl.elbow
3

silhouette coefficient

  • 是一个对集群内聚和分离的量度,基于两个参数:
    • 数据点与集群内其他点的距离有多近
    • 数据点与其他集群内的点的距离有多远
  • 越大表示数据点更接近于他们的集群而不是其他集群
silhouette_coefficients = []

for k in range(2,11):
    kmeans = KMeans(n_clusters = k,**kmeans_kwargs)
    kmeans.fit(scaled_features)
    score = silhouette_score(scaled_features,kmeans.labels_)
    silhouette_coefficients.append(score)
                    
plt.style.use("fivethirtyeight")
plt.plot(range(2, 11), silhouette_coefficients)
plt.xticks(range(2, 11))
plt.xlabel("Number of Clusters")
plt.ylabel("Silhouette Coefficient")
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jseiCZU6-1626317442246)(output_28_0.png)]

evaluating

When comparing k-means against a density-based approach on nonspherical clusters, the results from the elbow method and silhouette coefficient rarely match human intuition

from sklearn.cluster import DBSCAN
from sklearn.datasets import make_moons
from sklearn.metrics import adjusted_rand_score
features,true_labels = make_moons(
        n_samples = 250,noise = 0.05,random_state = 42
)
scaled_features = scaler.fit_transform(features)

make_moons函数

功能:用于生成数据集和对应的标签
参数:
  • n_samples:总共生成的点数
  • noise:加在数据上的高斯白噪声的标准差
  • random_state:随机数生成

assess the performance of k-means && DBSCAN

DBSCAN聚类算法
  • 参数
    • eps: ϵ \epsilon ϵ-邻域的距离阈值
    • min_samples:样本点要成为核心对象所需要的 ϵ \epsilon ϵ-邻域的样本数阈值
    • metric:使用的距离度量方法
    • algorithm:最近邻搜索算法参数,有蛮力实现(brute)、KD树实现(kd_tree)、球树实现(ball_tree)三种
    • leaf_size:为使用KD树或者球树的时候停止建子树的叶子节点数量的阈值
    • p:最近距离度量参数,p=1为曼哈顿距离,p=2为欧氏距离
  • 基于密度的噪声空间聚类算法:主要是将特征空间中足够密集的点划分为同一个簇,簇的形状任意,且数据点中有噪声点的话,不会将这些点划分给某个簇
DBSCAN v s vs vs kmeans
kmeans聚类算法的缺点
  • 对簇的数量k的选择困难

  • Kmeans 算法会把所有的数据点都进行分类,但是很多情况下,会有一些离群点,这些点应该被剔除的,但是 Kmeans 算法还是会把它们归为某一类

  • kmeans主要适用于球形分布的数据,对其他分布的数据分类可能不好

DBSCAN的优点
  • 不需要指定簇的个数

  • 可用于各种形状复杂的数据集

  • 可以识别出不属于任何簇的离群点,非常适合用来检测离群点

DBSCAN的缺点
  • 运行速度 O ( m 2 ) O(m^2) O(m2)比kmeans O ( m ) O(m) O(m)

  • eps和min_samples两个参数需要进行多次尝试

  • 对于不同密度的簇,两个算法效果可能都不是很好

其他区别
  • DBSCAN多次运行产生相同的结果,而kmeans通常使用随机初始化质心,不会产生相同的结果

  • kmeans会发现不是明显分离的簇,即使簇有重叠也可以发现;DBSCAN会合并有重叠的簇

  • kmeans可用于稀疏的高维数据,如文档数据,而DBSCAN不能很好处理

kmeans = KMeans(n_clusters = 2)
dbscan = DBSCAN(eps = 0.3)

#fit the algorithm to the features
kmeans.fit(scaled_features)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k-means算法Python实现--机器学习ML 的相关文章

随机推荐

  • 开发人 学习资源

    非常优秀的资源 请珍惜 基础 游戏编程高级进阶书籍推荐 http www douban com doulist 522861 Amit游戏编程 http www cs students stanford edu amitp gameprog
  • Leetcode 刷题笔记(四) —— 数组类型解题方法四:模拟

    文章目录 系列文章目录 模拟 54 螺旋矩阵 59 螺旋矩阵 II 总结 系列文章目录 一 数组类型解题方法一 二分法 二 数组类型解题方法二 双指针法 三 数组类型解题方法三 滑动窗口 四 数组类型解题方法四 模拟 五 链表篇之链表的基础
  • pycharm中导入rospy包

    在pycharm中 问题描述 import rospy 显示有错误 在终端中import rospy 能通过 这种问题说明rospy已经安装成功 但是没有导入到pycharm中 解决办法 1 依次点击File gt settings gt
  • qt学习笔记11:QFile文件读写操作、QFileInfo文件信息提取

    QFile文件读写操作 需求 实现一个可以选择文件的对话框 在ui中 分别line edit push button 在widget中水平对齐 再整体和一个TextEdit对齐 界面上就得到一个大概的选取文件的窗口 点击选取文件窗口 左边会
  • PAT Basic 1008. 数组元素循环右移问题 (20)

    一个数组A中存有N N gt 0 个整数 在不允许使用另外数组的前提下 将每个整数循环向右移M M gt 0 个位置 即将A中的数据由 A0A1 AN 1 变换为 AN M AN 1 A0 A1 AN M 1 最后M个数循环移至最前面的M个
  • SLOT专业术语

    slot专业术语 要学习slot的知识首先要了解slot的一些专业术语 下面我们就列举一些slot的专业术语并给大家一一详细说明 现在大多数slot是三行五列的 我们就以三行五列 243lines的slot距离说明各种slot术语 上图出自
  • Wireshark网络抓包工具

    Wireshark工具 1 Wireshark软件简介 2 Wireshark下载 3 Wireshark安装 4 页面介绍 5 常用功能介绍 5 1 网络接口选择 5 2 抓包规则设定 5 3 查找目标数据包 5 4 快速选择过滤数据包
  • TP6的服务在自定义composer包中如何使用

    官方关于Service的说明文档 https www kancloud cn manual thinkphp6 0 1037490 做下概念说明 Service和Provider在TP6中扮演着不同的角色 Service是用于封装特定功能的
  • web 前端学习线路图

    web 前端学习线路图 一 HTML 教程 HTML教程 HTML简介 HTML编辑器 HTML基础 HTML元素 HTML属性 HTML标题 HTML段落 HTML样式 HTML格式化 HTML引用元素 HTML计算机代码元素 HTML注
  • 人工智能学习历程数学篇-概率论(1)

    人工智能学习历程数学篇 概率论 1 概率论基础 随机变量 概率论的一切定义的基础都来源于随机变量 那么何为随机变量呢 所谓的随机变量变量 X 并不代表一个具体的数字 而是一种概率分布 我们可以这样理解随机变量X 当你每次去看随机变量数据的具
  • java stringbuffer 赋值_Java常用类(String, StringBuffer, StringBuilder)

    一 String类 String的实例化方式 通过字面量定义的方式 String str hello world 通过new 构造器的方式 String str new String hello world 面试题 String s new
  • python读取excel某一区域单元格的内容

    sheet1 row values 0 6 10 取第1行 第6 10列 不含第10表 sheet1 col values 0 0 5 取第1列 第0 5行 不含第5行 sheet1 row slice 2 0 2 获取单元格值类型和内容
  • 【链表】循环链表知识点-内含代码基本操作及其说明

    目录 一 概念 二 循环链表基本操作 初始化 头插 插在最前面 尾插 查找数据 获取val的前驱 获得后继 删除数据 删除某位置的值 输出数据 判断plist是否为空链表 没有数据节点 获取plist长度 数据节点的个数 插入数据 获取pl
  • 最短路径算法 迪杰斯特拉、佛洛依德和贝尔曼

    最短路径算法 迪杰斯特拉算法 佛洛依德算法 迪杰斯特拉算法 迪杰斯特拉算法用来解决在有向有权图中某一个点到任意一点的最短路径问题 注意 只能用来解决权为非零的情况 不能够解决权为负数的情况 思想 我是一个搬运工 思想就不讲了 主要是代码 d
  • Vue基础入门---Vue-router

    简介 由于Vue在开发时对路由支持的不足 后来官方补充了vue router插件 它在Vue的生态环境中非常重要 在实际开发中只要编写一个页面就会操作vue router 要学习vue router就要先知道这里的路由是什么 这里的路由并不
  • vps用途

    VPS用途 1 虚拟主机空间 VPS主机非常适合为中小企业 小型门户网站 个人工作室 SOHO一族提供网站空间 较大独享资源 安全可靠的隔离保证了用户对于资源的使用和数据的安全 2 电子商务平台 VPS主机与独立服务器的运行完全相同 中小型
  • STL教程5-STL基本概念及String和vector使用

    活动地址 毕业季 进击的技术er 夏日炎炎 热浪中我们迎来毕业季 这是告别 也是迈向新起点的开始 CSDN诚邀各毕业生 在校生 职场人讲述自己的毕业季故事 分享自己的经验 技术er的进击之路 等你来书写 你可以选择适合自己的对应身份从以下相
  • Calendar根据当前(指定)日期取出指定时间

    以下为亲测 持续更新 一 Calendar根据当前 指定 日期取出本周一本周日和下周一下周日时间 根据Calendar java中定义的DAY OF WEEK来看 Field number for code get code and cod
  • 【LeetCode104】二叉树的最大深度(递归+迭代)

    题目描述 首刷自解 int maxDepth TreeNode root if root nullptr return 0 return max maxDepth root gt left maxDepth root gt right 1
  • k-means算法Python实现--机器学习ML

    k means algorithm 一些概念 partial clustering 每一簇的数据不重叠 至少一簇一个数据 hieraichical clustering 通过构建层次结构来确定聚类分配 density based clust