聚类算法 距离矩阵_模糊聚类算法

模糊聚类算法

1.如何理解模糊聚类

事物间的界线,有些是明确的,有些则是模糊的。当聚类涉及到事物之间的模糊界线时,需要运用模糊聚类分析方法。

如何理解模糊聚类的“模糊”呢:假设有两个集合分别是A、B,有一成员a,传统的分类概念a要么属于A要么属于B,在模糊聚类的概念中a可以0.3属于A,0.7属于B,这就是其中的“模糊”概念。

模糊聚类分析有两种基本方法:系统聚类法和逐步聚类法。

系统聚类法个人理解类似于密度聚类算法,逐步聚类法类是中心点聚类法。(这里有不对的地方请指正)

逐步聚类法是一种基于模糊划分的模糊聚类分析法。它是预先确定好待分类的样本应分成几类,然后按照最优原则进行在分类,经多次迭代直到分类比较合理为止。在分类过程中可认为某个样本以某一隶属度隶属某一类,又以某一隶属度隶属于另一类。这样,样本就不是明确的属于或不属于某一类。若样本集有n个样本要分成c类,则他的模糊划分矩阵为c×n。

该矩阵有如下特性:

  1. . 每一样本属于各类的隶属度之和为1。
  2. . 每一类模糊子集都不是空集。

2. 模糊C-means聚类算法

模糊c-均值聚类算法fuzzy c-means (FCM)。在众多模糊聚类算法中,模糊C-均值(FCM)算法应用最广泛且成功,它通过优化目标函数得到每个样本点对所有类中心的隶属度,从而对样本进行自动分类。

2.1 FCM算法原理

假定我们有数据集X,我们要对X中的数据进行分类,如果把这些数据划分成c个类的话,那么对应的就有c个类中心为Ci,每个样本Xj属于某一类Ci的隶属度定为Uij,那么定义一个FCM目标函数及其约束条件如下:

65fa1d54d6d52f8596a0d832fb2ee660.png

10f32d5ef4bda5b5079d061d02698308.png

目标函数(式1)由相应样本的隶属度与该样本到各类中心的距离相乘组成的,式2为约束条件,也就是一个样本属于所有类的隶属度之和要为 1 。式1中的m是一个隶属度的因子,一般为2 ,||Xj - Ci|| 表示Xj到中心点Ci的欧式距离。目标函数J越小越好,说以我们要求得目标函数J的极小值,这里如何求极小值就不推导了。

Uij的迭代公式:

617501088c652f018dff3e338505f33d.png

Ci的迭代公式:

7fd5796b34f2ee6b5fa222f38b162583.png

我们发现Uij和Ci是相互关联的,彼此包含对方,那么问题来了,fcm算法开始的时候既没有Uij也没有Ci,那么如何求解呢?很简单,程序一开始的时候我们会随机生成一个Uij,只要数值满足条件即可,然后开始迭代,通过Uij计算出Ci,有了Ci又可以计算出Uij,反反复复,这个过程中目标函数J一直在变化,逐渐绉向稳定。那么当J不在变化时就认为算法收敛到一个较好的结果了。

2.2 FCM算法实现(python)

(1)算法流程

  1. 随机初始化模糊矩阵U(描述每个点在不同类的隶属度)
  2. 有了模糊矩阵U通过下面公式计算类中心

711c4083bda07a88568d4c64b75ffe28.png
  1. 通过下面公式根据计算出的类中心,更新模糊矩阵U

89494d7f97c343bcf7bb7b389c19e8bb.png
  1. 当U的变化不大时结束迭代,否则回到第二步

(2)代码实现

import numpy as np

from sklearn import datasets

iris = datasets.load_iris()

print(iris.data.shape)

def FCM(X, c_clusters=3, m=2, eps=10):

membership_mat = np.random.random((len(X), c_clusters)) # 生成随机二维数组shape(150,3),随机初始化隶属矩阵

# 这一步的操作是为了使Xi的隶属度总和为1

membership_mat = np.divide(membership_mat, np.sum(membership_mat, axis=1)[:, np.newaxis])

while True:

working_membership_mat = membership_mat ** m # shape->(150,3)

# 根据公式计算聚类中心点Centroids.shape->(3,4)

Centroids = np.divide(np.dot(working_membership_mat.T, X), np.sum(working_membership_mat.T, axis=1)[:, np.newaxis])

# 该矩阵保存所有实点到每个聚类中心的欧式距离

n_c_distance_mat = np.zeros((len(X), c_clusters)) # shape->(150,3)

for i, x in enumerate(X):

for j, c in enumerate(Centroids):

n_c_distance_mat[i][j] = np.linalg.norm(x-c, 2) # 计算l2范数(欧氏距离)

new_membership_mat = np.zeros((len(X), c_clusters))

# 根据公式计算模糊矩阵U

for i, x in enumerate(X):

for j, c in enumerate(Centroids):

new_membership_mat[i][j] = 1. / np.sum((n_c_distance_mat[i][j] / n_c_distance_mat[i]) ** (2 / (m-1)))

if np.sum(abs(new_membership_mat - membership_mat)) < eps:

break

membership_mat = new_membership_mat

return np.argmax(new_membership_mat, axis=1)

print(FCM(iris.data))

代码完全是根据上述流程和公式实现的,理解起来也很简单,迭代退出条件可以优化一下,其他的可以不用改动。

(3)FCM的缺点

FCM是对J目标函数求极小值,也就是说我们得到的结果可能是目标函数的局部极值点或者是鞍点。

《来源于科技文献,经本人分析整理,以技术会友,广交天下朋友》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值