skfuzzy.cmeans与sklearn.KMeans聚类效果对比以及使用方法

2023-05-16

因为实验中要用到聚类效果的对比,没有时间自己来实现算法,所以Kmeans就用到了sklearn中的Kmeans类,FCM用到了skfuzzy.cmeans。

 

几个概念

1、Kmeans

Kmeans是聚类算法中较为经典的算法之一,由于其效率高,所以一般大规模的数据进行聚类的时候都会被广泛应用。

算法的目的是,先指定聚类的数目c,然后将输入的数据划分为c类,值簇内的数据之间具有较高的相似程度,而簇之间的相似程度较低。

下面简单介绍下Kmeans算法的实现,具体的网上都可以找到。

Kmeans的目标函数是:

c是聚类的中心,目的就是让每个点到它所属于的中心的距离之和最小。

因此对目标函数求偏导可以得到如下,其中Nj是第j类中数据点的个数。

然后就是对所有数据进行repeat直到中心点不再发生变化或者达到了最大的遍历次数

2、FCM

FCM是一种基于模糊集合为基础的聚类方法,它是以隶属度来确定每个数据点从属于某个中心。像Kmeans这类算法称为硬聚类,而FCM则称为软聚类,是传统硬聚类的一种改进。为什么叫软跟硬,因为FCM在聚类的时候,会计算每个样本点到中心的隶属度,这个隶属度是一个0~100%的数值,而硬聚类则只有0%和100%,FCM通过这个隶属度可以使我们更加直观的了解一个数据点到中心的可信度。

因而这里就要提到一个隶属度矩阵了,为了对比Kmeans,也给Kmeans设置了一个隶属度的矩阵:

通过上面的对比就可看出关于这个隶属度矩阵的作用了。

下面说一下关于FCM算法的思路:

FCM的目标函数如下:

其中m是加权指数,一般的应用区间是[1.5,2.5]。网上也有很多研究是关于FCM中这个m的优化的。

可以看出,FCM目标函数就是在Kmeans中目标函数的基础中加入了一个隶属度矩阵。

算法训练的过程就是求目标函数的极小值以及此时的隶属度函数,最终的聚类中心就通过最后的隶属度函数来确定。

 

前提准备

 

没有安装skfuzzy的话,可以先pip install -U scikit-fuzzy。其中skfuzzy是python中用于研究模糊推理、模糊神经网络的模块,其中有很多实现好的算法和函数。

 

sklearn.KMeans

先看一下Kmeans这个类的参数:

    def __init__(self, n_clusters=8, init='k-means++', n_init=10, max_iter=300,
                 tol=1e-4, precompute_distances='auto',
                 verbose=0, random_state=None, copy_x=True, n_jobs=1):

1、n_clusters就是k值,一般需要通过测试来选择最好的聚类数目。

2、max_iter最大迭代数目,如果是凸函数的话,求导可以得到极值,因而可以不用管,但是如果是非凸函数的话,可能会不收敛,此时可以指定最大的迭代次数。

3、init即初始值选择的方式,可以是radom随机选择,或者优化过的k-means++,或者自己指定的初始化的质心。

创建了Kmeans对象之后,接着调用fit()函数来训练模型,然后通过predict()可以得到每个数据对应的label。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from skfuzzy.cluster import cmeans


cp = np.random.uniform(1, 100, (100, 2))

train = cp[:50]
test = cp[50:]
km = KMeans(n_clusters=3)
km.fit(train)
result = km.predict(train)
for i in range(50):
    if result[i] == 0:
        plt.scatter(train[i,0],train[i,1], c='r')
    elif result[i] == 1:
        plt.scatter(train[i, 0],train[i,1], c='g')
    elif result[i] == 2:
        plt.scatter(train[i, 0],train[i,1], c='b')
plt.show()

 

 

skfuzzy.cmeans

 

先看一下这个函数的参数跟返回值:

def cmeans(data, c, m, error, maxiter, init=None, seed=None):
data : 2d array, size (S, N)
        Data to be clustered.  N is the number of data sets; S is the number
        of features within each sample vector.
    c : int
        Desired number of clusters or classes.
    m : float
        Array exponentiation applied to the membership function u_old at each
        iteration, where U_new = u_old ** m.
    error : float
        Stopping criterion; stop early if the norm of (u[p] - u[p-1]) < error.
    maxiter : int
        Maximum number of iterations allowed.
    init : 2d array, size (S, N)
        Initial fuzzy c-partitioned matrix. If none provided, algorithm is
        randomly initialized.
    seed : int
        If provided, sets random seed of init. No effect if init is
        provided. Mainly for debug/testing purposes.

 

1、data就是训练的数据。这里需要注意data的数据格式,shape是类似(特征数目,数据个数),与很多训练数据的shape正好是相反的。

 

2、c是需要指定的聚类个数。

3、m也就是上面提到的隶属度的指数,是一个加权指数。

4、error就是当隶属度的变化小于此的时候提前结束迭代。

5、maxiter最大迭代次数。

 

Returns
    -------
    cntr : 2d array, size (S, c)
        Cluster centers.  Data for each center along each feature provided
        for every cluster (of the `c` requested clusters).
    u : 2d array, (S, N)
        Final fuzzy c-partitioned matrix.
    u0 : 2d array, (S, N)
        Initial guess at fuzzy c-partitioned matrix (either provided init or
        random guess used if init was not provided).
    d : 2d array, (S, N)
        Final Euclidian distance matrix.
    jm : 1d array, length P
        Objective function history.
    p : int
        Number of iterations run.
    fpc : float
        Final fuzzy partition coefficient.

返回值:

1、cntr聚类的中心。

2、u是最后的的隶属度矩阵。

3、u0是初始化的隶属度矩阵。

4、d是最终的每个数据点到各个中心的欧式距离矩阵。

5、jm是目标函数优化的历史。

6、p是迭代的次数。

7、fpc全称是fuzzy partition coefficient,是一个评价分类好坏的指标。它的范围是0到1,1是效果最好。后面可以通过它来选择聚类的个数。

 

代码如下:

train = train.T
center, u, u0, d, jm, p, fpc = cmeans(train, m=2, c=3, error=0.005, maxiter=1000)

for i in u:
    label = np.argmax(u, axis=0)
print(label)

for i in range(50):
    if label[i] == 0:
        plt.scatter(train[0][i], train[1][i], c='r')
    elif label[i] == 1:
        plt.scatter(train[0][i], train[1][i], c='g')
    elif label[i] == 2:
        plt.scatter(train[0][i], train[1][i], c='b')

plt.show()

 

 

 

 

 

还有一个问题就是关于如何选择最好的聚类个数,篇幅的原因,这个打算有时间再写一篇来好好整理下。

 

 

 

 

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

skfuzzy.cmeans与sklearn.KMeans聚类效果对比以及使用方法 的相关文章

  • 外设驱动库开发笔记21:BME680环境传感器驱动

    环境传感器是一类我们很常用的传感器 它可以方便我们获取压力 温度 湿度以及空气质量等数据 在这一篇中 xff0c 我们将分析 BME680 环境传感器的功能 xff0c 并设计和实现 BME680 环境传感器的驱动 1 功能概述 BME68

随机推荐

  • 外设驱动库开发笔记45:MS4515DO压力传感器驱动

    很多时候我们需要检测流量和压力这些参数 xff0c 比如我们要检测大气压 xff0c 或者通过测量差压来获得输送流体的流量等 xff0c 都需要用到压力传感器 这一篇我们就来讨论MS4515DO压力传感器的数据获取 1 功能概述 MS451
  • 一个好看的CSS样式表格

    一个好看的CSS样式表格 自动换整行颜色的CSS样式表格 xff08 需要用到JS xff09 自动换整行颜色的CSS样式表格源代码 自动换整行颜色的CSS样式表格 xff08 需要用到JS xff09 这个CSS表格会自动切换每一行的颜色
  • docker删除镜像

    docker要删除镜像 xff0c 先要删除依赖它的容器 1 删除容器 docker ps 查看正在运行的容器 docker ps a 查看所有容器 docker rm container id 删除容器 2 删除镜像 docker ima
  • FreeRTOS如何结束和重新启动调度程序

    大多数主机或桌面系统 xff08 比如Linux xff0c Mac或Windows xff09 都有一个正常的用例 xff0c 你可以在早上启动操作系统 xff0c 然后在晚上关闭它 xff0c 然后你就离开机器 嵌入式系统是不同的 xf
  • [显存被占满,程序无法运行问题]ResourceExhaustedError (see above for traceback): OOM when allocating tensor

    最近在实验室的服务器上跑tensorflow程序 xff0c 一直都没有报错 xff0c 但是今天却突然报错 xff0c 而且出错提示显示的内容从未见到过 xff0c 错误提示如下 xff1a 错误提示资源耗尽 xff0c 无法分配tens
  • 解读神经网络十大误解,再也不会弄错它的工作原理(转载自机器之心)

    神经网络是机器学习算法中最流行和最强大的一类 在计量金融中 xff0c 神经网络常被用于时间序列预测 构建专用指标 算法交易 证券分类和信用风险建模 它们也被用于构建随机过程模型和价格衍生品 尽管神经网络有这些用处 xff0c 但它们却往往
  • 树莓派 Raspberry Pi VNC屏幕无法显示、软键盘、摄像头实时图传、固定IP等环境配置

    目录 1 VNC屏幕无法显示 2 树莓派软键盘安装 3 摄像头实时图传配置 xff0c 可用于图像监控系统 4 安装VIM与固定IP 1 VNC屏幕无法显示 在树莓派终端 xff0c 输入 sudo raspi config 选择接口配置
  • 在Jetson上配置RealSense相机驱动

    1 下载源码 https github com IntelRealSense librealsense span class token builtin class name cd span librealsense scripts set
  • aruco marker使用笔记

    在英伟达Jetson Xaiver开发板上配置 SDK环境 opencv 4 1 1 CUDA 10 2 1 git clone https github com pal robotics aruco ros 2 复制到catkin ws
  • catkin_make命令

    catkin make是在catkin工作区中构建代码的便捷工具 catkin make遵循catkin工作区的标准布局 xff0c 如REP 128中所述 用法 假设您的catkin工作区位于 catkin ws中 xff0c 则应始终在
  • docker容器中运行界面程序

    Docker比较常用的场景是 运行无界面的后台服务 或者 运行Web服务 不过有时出于个人的喜好或特定的需求 xff0c 我们会希望在Docker中运行带图形界面的应用程序 将容器中的图形界面展示到外部的一般性思路 xff1a 目前Unix
  • linux录屏

    Linux下好用的录屏软件是kazam录屏后视频处理软件kdenlive根据剪辑好的视频撰写解说词 xff0c 使用讯飞配音app将解说词文字转换为语音mp3将语音与视频通过kdenlive软件合成在一起 xff0c 完美的演示视频诞生了
  • 【python】conda和pip安装库之间的区别

    conda 首先 xff0c conda是一个通用的包管理器 xff0c 意思是什么语言的包都可以用其进行管理 xff0c 自然也就包括Python了 在安装Anaconda或者Miniconda时 xff0c 会对conda进行一同安装
  • OpenHarmony-Overview_zh

    OpenHarmony开源项目 项目介绍 OpenHarmony是开放原子开源基金会 xff08 OpenAtom Foundation xff09 旗下开源项目 xff0c 定位是一款面向全场景的开源分布式操作系统 OpenHarmony
  • 【python量化】用时间卷积神经网络(TCN)进行股价预测

    写在前面 下面这篇文章首先主要简单介绍了目前较为先进的时间序列预测方法 时间卷积神经网络 xff08 TCN xff09 的基本原理 xff0c 然后基于TCN的开源代码 xff0c 手把手教你如何通过时间卷积神经网络来进行股价预测 xff
  • 【python量化】将Transformer模型用于股票价格预测

    写在前面 下面的这篇文章主要教大家如何搭建一个基于Transformer的简单预测模型 xff0c 并将其用于股票价格预测当中 原代码在文末进行获取 1 Transformer模型 Transformer 是 Google 的团队在 201
  • 解读:基于GCN的股票预测模型

    前言 xff1a 自ICLR2017首次提出图卷积神经网络 xff08 GCN xff09 的概念 xff0c 该模型在节点分类 边预测等任务上表现出了出色的性能 在传统因子选股模型中 xff0c 常常将股票视为独立的个体 xff0c 但事
  • 【python量化】基于backtrader的深度学习模型量化回测框架

    写在前面 在本文中 xff0c 我们将介绍使用PyTorch构建一个深度学习模型 xff0c 并将其集成到backtrader回测框架中 具体地 xff0c 我们将使用PyTorch来实现一个长短期记忆神经网络 xff08 LSTM xff
  • 【量化交易】股票价格前复权与后复权的区别以及注意事项

    时不时就会看到到底是用股票前复权还是后复权价格的讨论 xff0c 比如下面就是一个很经典的问法 xff1a 我用前复权价格计算指标的时候 xff0c 发现会出现负价格 xff0c 就没法取log了 xff0c 应该是分红太多导致的 xff0
  • skfuzzy.cmeans与sklearn.KMeans聚类效果对比以及使用方法

    因为实验中要用到聚类效果的对比 xff0c 没有时间自己来实现算法 xff0c 所以Kmeans就用到了sklearn中的Kmeans类 xff0c FCM用到了skfuzzy cmeans 几个概念 1 Kmeans Kmeans是聚类算