FCM作为一种模糊聚类的方法,依靠的是概率来进行聚类的,它的准则函数是:
J=Σj=1CΣi=1N[μj(xi)]b∣∣xi−mj∣∣2st:Σj=1Cμj(xi)=1J=\Sigma_{j=1}^{C}\Sigma_{i=1}^{N}[\mu_j(x_i)]^b||x_i-m_j||^2\\st :\Sigma_{j=1}^{C}\mu_j(x_i) =1J=Σj=1C​Σi=1N​[μj​(xi​)]b∣∣xi​−mj​∣∣2st:Σj=1C​μj​(xi​)=1
之后需要将这个约束条件使用拉格朗日乘子放入到JJJ中,得到的损失函数就是:
J=Σj=1CΣi=1N[μj(xi)]b∣∣xi−mj∣∣2+Σi=1Nλi(Σj=1Cμj(xi)−1)J=\Sigma_{j=1}^{C}\Sigma_{i=1}^{N}[\mu_j(x_i)]^b||x_i-m_j||^2 + \Sigma_{i=1}^{N}\lambda_i(\Sigma_{j=1}^{C}\mu_j(x_i)-1)J=Σj=1C​Σi=1N​[μj​(xi​)]b∣∣xi​−mj​∣∣2+Σi=1N​λi​(Σj=1C​μj​(xi​)−1)

介绍了这个之后,我们基于JJJ分别对μj(xi),mj\mu_j(x_i), m_jμj​(xi​),mj​求偏导等于0:
∂J∂mj=Σi=1Nμj(xi)b(−2(xi−mj))=0解得mj=Σi=1Cμj(xi)bxiΣi=1Cμj(xi)b\frac{\partial{J}}{\partial{m_j}} =\Sigma_{i=1}^{N}\mu_j(x_i)^b(-2(x_i - m_j)) =0\\ 解得m_j=\frac{\Sigma_{i=1}^{C}\mu_j(x_i)^bx_i}{\Sigma_{i=1}^{C}\mu_j(x_i)^b}∂mj​∂J​=Σi=1N​μj​(xi​)b(−2(xi​−mj​))=0解得mj​=Σi=1C​μj​(xi​)bΣi=1C​μj​(xi​)bxi​​
下面是对$\mu_j(x_i)求偏导数:
∂J∂μj(xi)=b(μj(xi)b−1∣∣xi−mj∣∣2)+λi=0解得μj(xi)=(−λib)1b−1∣∣xi−mj∣∣−2(b−1)\frac{\partial{J}}{\partial{\mu_j(x_i)}} =b(\mu_j(x_i)^{b-1}||x_i-m_j||^2) + \lambda_i =0\\ 解得\mu_j(x_i) = (\frac{-\lambda_i}{b})^{\frac{1}{b-1}}||x_i-m_j||^{-\frac{2}{(b-1)}}∂μj​(xi​)∂J​=b(μj​(xi​)b−1∣∣xi​−mj​∣∣2)+λi​=0解得μj​(xi​)=(b−λi​​)b−11​∣∣xi​−mj​∣∣−(b−1)2​
由于λi\lambda_iλi​不知道,但是知道Σj=1Cμj(xi)=1\Sigma_{j=1}^{C}\mu_j(x_i) = 1Σj=1C​μj​(xi​)=1,所以仍可以求解得到:
μj(xi)=(−λib)1b−1∣∣xi−mj∣∣−2(b−1)Σk=1C(−λib)1b−1∣∣xi−mk∣∣−2(b−1)=∣∣xi−mj∣∣−2(b−1)Σk=1C∣∣xi−mk∣∣−2(b−1)\mu_j(x_i) = \frac{(\frac{-\lambda_i}{b})^{\frac{1}{b-1}}||x_i-m_j||^{-\frac{2}{(b-1)}}}{\Sigma_{k=1}^{C}(\frac{-\lambda_i}{b})^{\frac{1}{b-1}}||x_i-m_k||^{-\frac{2}{(b-1)}}}=\frac{||x_i-m_j||^{-\frac{2}{(b-1)}}}{\Sigma_{k=1}^{C}||x_i-m_k||^{-\frac{2}{(b-1)}}}μj​(xi​)=Σk=1C​(b−λi​​)b−11​∣∣xi​−mk​∣∣−(b−1)2​(b−λi​​)b−11​∣∣xi​−mj​∣∣−(b−1)2​​=Σk=1C​∣∣xi​−mk​∣∣−(b−1)2​∣∣xi​−mj​∣∣−(b−1)2​​
有了上面的这些准备工作之后,介绍FCM的整个工作流程:

  1. 初始化参数b,mjb, m_jb,mj​
  2. 使用mjm_jmj​来更新μj(xi)\mu_j(x_i)μj​(xi​)
  3. 使用新的μj(xi)\mu_j(x_i)μj​(xi​)来更新mjm_jmj​
  4. 判断新的mjm_jmj​和旧的mjm_jmj​是否近似相等,若不相等返回step2;否则step5
  5. 将样本根据μj(xi)\mu_j(x_i)μj​(xi​)划分到隶属度最大的一类中
# -*- coding: utf-8 -*-
"""
FCM@author: ASUS
"""
from sklearn import datasets
from sklearn.decomposition import PCA
import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdef FCM(K,X,B):dist = np.array([[np.dot(X[i]- K[j],X[i]- K[j])**(-1/(B-1)) for j in range(len(K))] for i in range(len(X))])dist = np.sum(dist,axis = 1)pro = np.array([[np.dot(X[i]-K[j],X[i]-K[j])**(-1/(B-1))/dist[i] for j in range(len(K))]for i in range(len(X))])return pro.reshape(len(X),-1)def precision(Y,Y_predict):return len(np.where(Y == Y_predict)[0])/len(Y)iris_datas = datasets.load_iris()
Y = iris_datas.target
X_re = iris_datas.data
X = (X_re -np.min(X_re,axis = 0))/ (np.max(X_re,axis = 0)-np.min(X_re,axis = 0))     #归一化
#选取初始中心
K = np.array([np.average(X[50*i:50*(i+1)],axis = 0) for i in range(len(np.unique(Y)))])  #选取初始中心
Y_predict = np.zeros((len(Y),),dtype = np.uint32)                    #产生预测矩阵#开始FCM的程序
B = 2
probility = np.ones((len(Y),len(K))) * 0.5
theta = 1
count = 0
while theta > 0.00001:probility = FCM(K,X,B)new_K = np.array([np.sum((probility[:,i]**(B)).reshape(len(X),-1)*X,axis = 0)/np.sum((probility[:,i])**B) for i in range(len(K))])theta = np.sum((K-new_K)**2)K = new_Kcount += 1Y_predict = np.array([np.argmax(probility[i]) for i in range(len(X))])
print('FCM在iris数据集上的正确率为:'+str(round(precision(Y,Y_predict)*100,2))+'%')#sonar数据集
sonar_datas = pd.read_csv('d:/microsoft/sonar.csv',header= None)
sonar_datas[61] = 0sonar_datas.loc[np.where(sonar_datas[60]=='M')[0],61] = 1Y = np.array(sonar_datas[61])
X = np.array(sonar_datas.iloc[:,:60])
X = (X -np.min(X,axis = 0))/ (np.max(X,axis = 0)-np.min(X,axis = 0))# pca = PCA(0.95)
# X = pca.fit_transform(X)
K = np.array([np.average(X[:97],axis =0),np.average(X[97:],axis =0)])  #选取初始中心
#选取初始中心,用FCM中得到的聚类中心
Y_predict = np.zeros((len(Y),),dtype = np.uint32)
B = 2
probility = np.ones((len(Y),len(K))) * 0.5theta = 1
count = 0
while theta > 0.00001:probility = FCM(K,X,B)new_K = np.array([np.sum((probility[:,i]**(B)).reshape(len(X),-1)*X,axis = 0)/np.sum((probility[:,i])**B) for i in range(len(K))])theta = np.sum((K-new_K)**2)K = new_Kcount += 1Y_predict = np.array([np.argmax(probility[i]) for i in range(len(X))])
print('FCM在sonar数据集上的正确率为:'+str(round(precision(Y,Y_predict)*100,2))+'%')

FCM公式详细推及代码相关推荐

  1. Simpson积分方法计算NURBS曲线弧长,详细原理+代码实现

    Simpson积分方法计算NURBS曲线弧长,详细原理+代码实现 Simpson 积分方法是一种数值积分方法,可以用于计算曲线的弧长.它的基本思想是将曲线分成若干小段,对每一小段采用 Simpson ...

  2. 2020年高教社杯全国大学生数学建模竞赛C题 第一问详细解答+代码

    2020年高教社杯全国大学生数学建模竞赛C题 第一问详细解答+代码 本文摘自小编自己的参赛论文与经历,小编获得了2020年高教社杯国奖,有问题的同学们可私聊博主哦. 1. 问题分析 问题一主要围绕信贷 ...

  3. 数据挖掘领域十大经典算法之—SVM算法(超详细附代码)

    相关文章: 数据挖掘领域十大经典算法之-C4.5算法(超详细附代码) 数据挖掘领域十大经典算法之-K-Means算法(超详细附代码) 数据挖掘领域十大经典算法之-Apriori算法 数据挖掘领域十大经 ...

  4. 数据挖掘领域十大经典算法之—AdaBoost算法(超详细附代码)

    相关文章: 数据挖掘领域十大经典算法之-C4.5算法(超详细附代码) 数据挖掘领域十大经典算法之-K-Means算法(超详细附代码) 数据挖掘领域十大经典算法之-SVM算法(超详细附代码) 数据挖掘领 ...

  5. 视频教程-小白学习课程:梯度下降算法与公式详细推导-深度学习

    小白学习课程:梯度下降算法与公式详细推导 国内"双一流"大学博士研究生,计算机专业,研究方向和兴趣包括人工智能,深度学习,计算机视觉,群体智能算法,元胞自动机等,愿意分享自己的技术 ...

  6. python基础代码事例-推公式到写代码-python基础

    推公式到写代码-python基础 希望你能像看小说看杂文一样的心情看完这一系列,因为学习不总是枯燥的,希望像聊天一样娓娓道来. 专辑系列的阅读对象是那些懂些高等数学和线性代数,但没有经过编码训练的人. ...

  7. DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现)

    DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现) @author:wepon @blog:http://blog.csdn.net/u012162 ...

  8. asp连接mysql视频_asp连接mysql数据库详细实现代码

    ASP 的 asp连接mysql数据库详细实现代码 想要asp能连接mysql数据库需要安装MySQL ODBC 3.51 驱动 我们先看下面这段代码 代码如下: set conn = server. ...

  9. 机器学习之信用卡欺诈检测(零基础,附数据及详细python代码2022年Tensorflow2)

    首先该数据参考:机器学习项目实战之信用卡欺诈检测(零基础,附数据及详细python代码) (4条消息) 机器学习项目实战之信用卡欺诈检测(零基础,附数据及详细python代码)_西南交大-Liu_z的 ...

最新文章

  1. TM:宿主-细菌界面的MicroRNA:宿主防御或细菌攻击
  2. MathType支持64位 WIN 7Office 2013(完美解决)(转载)
  3. 解决go项目报错:fatal: could not read Username for ‘https://gitee.com‘: terminal prompts disabled
  4. [react] 使用ES6的class定义的组件不支持mixins了,那用什么可以替代呢?
  5. ps图片如何实现渐变
  6. linux mysql 6.0.4 启动_CentOS 6.0之MySQL+FreeRadiu实现帐号统一认证
  7. 如何通过三视图判断立方体个数_装机小白看过来:如何通过显卡参数来判断高端低端?...
  8. MongoDB 用户管理
  9. git修改commit注释_【Slog】Git之多人同feature的同分支开发
  10. 你用苹果手机多长时间清理一次内存,怎么清理?
  11. 计算机屏幕总闪烁,教你如何解决电脑屏幕闪烁
  12. Mac OS git多次需要输入用户名密码config解决
  13. Newtonsoft 六个超简单又实用的特性【上下篇】
  14. 数字转成人民币汉字大写(李刚著《疯狂Python讲义》P87,解决小数部分及多个零的问题。学习笔记)
  15. 2021.11.27月赛题解
  16. java计算机毕业设计高校心理测评管理系统源码+mysql数据库+系统+lw文档+部署
  17. 任务栏WPS出现多窗口预览?下载这个注册表就对了
  18. UTF-8编码和UTF-8-BOM编码的区别和处理
  19. Windows远程连接工具有哪些
  20. 学习数据分析,数据分析必备的技能有哪些

热门文章

  1. shell之awk命令详解
  2. 电脑显示器突然变了颜色
  3. 高速信号编码之8B/10B
  4. 计算机体系结构:Chapter 5 :ILP(指令级并行)
  5. 橙色的商务企业网站模板 html整站下载 企业网站模板
  6. Linux操作系统 df命令
  7. SSO单点登录跨域跨服务器
  8. mysql创建数据库并创建表
  9. 计算机efs加密,EFS加密
  10. Ubuntu 安装截图工具 Shutter