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

因为实验中要用到聚类效果的对比,没有时间自己来实现算法,所以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()

 

 

 

 

 

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

 

 

 

 

  • 12
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
### 回答1: 可以使用matplotlib库来进行可视化,示例代码如下:from sklearn.cluster import KMeans import matplotlib.pyplot as plt # 调用KMeans进行聚类 kmeans = KMeans(n_clusters=5) kmeans.fit(X) # 获取聚类标签 labels = kmeans.labels_ # 绘制样本的聚类结果 plt.scatter(X[:,0], X[:,1], c=labels) plt.show() ### 回答2: 使用sklearn库实现K-means聚类的结果可通过可视化工具来展示。下面是一个使用matplotlib库展示聚类结果的代码示例: ```python import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans # 生成随机数据 np.random.seed(0) X = np.random.randn(100, 2) # 创建K-means模型 kmeans = KMeans(n_clusters=3) kmeans.fit(X) # 获得聚类标签和中心点 labels = kmeans.labels_ centers = kmeans.cluster_centers_ # 绘制样本点和中心点 plt.scatter(X[:, 0], X[:, 1], c=labels) plt.scatter(centers[:, 0], centers[:, 1], c='r', marker='x') plt.xlabel('X') plt.ylabel('Y') plt.title('K-means Clustering') plt.show() ``` 代码中首先生成了一个随机的二维数据集X,然后使用KMeans函数创建K-means模型,并通过fit函数对数据进行聚类。接下来,使用labels变量获取每个样本点的聚类标签,使用centers变量获取聚类的中心点。最后,使用scatter函数绘制样本点,并使用另一种颜色的散点图标示出聚类的中心点。 要使用该代码,请确保已经安装了必要的库,如numpy、matplotlib和sklearn。可以根据自己的需求调整随机数据集的大小、K-means中的k值以及绘制的图像样式等内容。 ### 回答3: 在使用sklearn库实现k-means聚类后,我们可以使用可视化工具matplotlib来展示聚类的结果。 下面是一个使用sklearn和matplotlib实现k-means聚类结果可视化的简单示例代码: ```python import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs from sklearn.cluster import KMeans # 生成随机数据 n_samples = 100 n_clusters = 3 X, y = make_blobs(n_samples=n_samples, centers=n_clusters, random_state=0) # 使用k-means进行聚类 kmeans = KMeans(n_clusters=n_clusters) kmeans.fit(X) # 可视化聚类结果 plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_, cmap='viridis') plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='x', s=100, c='red') plt.title('K-means Clustering') plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.show() ``` 这段代码首先使用make_blobs生成随机数据,然后使用KMeans类进行聚类,得到每个样本的聚类标签。最后使用plt.scatter函数指定聚类标签作为颜色,绘制散点图,使用红色的X标记表示聚类中心。最后使用plt.title、plt.xlabel和plt.ylabel函数添加图表标题和轴标签,并通过plt.show函数显示可视化结果。 运行该代码,即可看到产生的数据点按照聚类结果以不同颜色进行可视化,并且聚类中心以红色的X标记进行表示。根据不同的数据分布和聚类数目,会得到不同的聚类结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值