FCM公式详细推及代码
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的整个工作流程:
- 初始化参数b,mjb, m_jb,mj
- 使用mjm_jmj来更新μj(xi)\mu_j(x_i)μj(xi)
- 使用新的μj(xi)\mu_j(x_i)μj(xi)来更新mjm_jmj
- 判断新的mjm_jmj和旧的mjm_jmj是否近似相等,若不相等返回step2;否则step5
- 将样本根据μ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公式详细推及代码相关推荐
- Simpson积分方法计算NURBS曲线弧长,详细原理+代码实现
Simpson积分方法计算NURBS曲线弧长,详细原理+代码实现 Simpson 积分方法是一种数值积分方法,可以用于计算曲线的弧长.它的基本思想是将曲线分成若干小段,对每一小段采用 Simpson ...
- 2020年高教社杯全国大学生数学建模竞赛C题 第一问详细解答+代码
2020年高教社杯全国大学生数学建模竞赛C题 第一问详细解答+代码 本文摘自小编自己的参赛论文与经历,小编获得了2020年高教社杯国奖,有问题的同学们可私聊博主哦. 1. 问题分析 问题一主要围绕信贷 ...
- 数据挖掘领域十大经典算法之—SVM算法(超详细附代码)
相关文章: 数据挖掘领域十大经典算法之-C4.5算法(超详细附代码) 数据挖掘领域十大经典算法之-K-Means算法(超详细附代码) 数据挖掘领域十大经典算法之-Apriori算法 数据挖掘领域十大经 ...
- 数据挖掘领域十大经典算法之—AdaBoost算法(超详细附代码)
相关文章: 数据挖掘领域十大经典算法之-C4.5算法(超详细附代码) 数据挖掘领域十大经典算法之-K-Means算法(超详细附代码) 数据挖掘领域十大经典算法之-SVM算法(超详细附代码) 数据挖掘领 ...
- 视频教程-小白学习课程:梯度下降算法与公式详细推导-深度学习
小白学习课程:梯度下降算法与公式详细推导 国内"双一流"大学博士研究生,计算机专业,研究方向和兴趣包括人工智能,深度学习,计算机视觉,群体智能算法,元胞自动机等,愿意分享自己的技术 ...
- python基础代码事例-推公式到写代码-python基础
推公式到写代码-python基础 希望你能像看小说看杂文一样的心情看完这一系列,因为学习不总是枯燥的,希望像聊天一样娓娓道来. 专辑系列的阅读对象是那些懂些高等数学和线性代数,但没有经过编码训练的人. ...
- DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现)
DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现) @author:wepon @blog:http://blog.csdn.net/u012162 ...
- asp连接mysql视频_asp连接mysql数据库详细实现代码
ASP 的 asp连接mysql数据库详细实现代码 想要asp能连接mysql数据库需要安装MySQL ODBC 3.51 驱动 我们先看下面这段代码 代码如下: set conn = server. ...
- 机器学习之信用卡欺诈检测(零基础,附数据及详细python代码2022年Tensorflow2)
首先该数据参考:机器学习项目实战之信用卡欺诈检测(零基础,附数据及详细python代码) (4条消息) 机器学习项目实战之信用卡欺诈检测(零基础,附数据及详细python代码)_西南交大-Liu_z的 ...
最新文章
- TM:宿主-细菌界面的MicroRNA:宿主防御或细菌攻击
- MathType支持64位 WIN 7Office 2013(完美解决)(转载)
- 解决go项目报错:fatal: could not read Username for ‘https://gitee.com‘: terminal prompts disabled
- [react] 使用ES6的class定义的组件不支持mixins了,那用什么可以替代呢?
- ps图片如何实现渐变
- linux mysql 6.0.4 启动_CentOS 6.0之MySQL+FreeRadiu实现帐号统一认证
- 如何通过三视图判断立方体个数_装机小白看过来:如何通过显卡参数来判断高端低端?...
- MongoDB 用户管理
- git修改commit注释_【Slog】Git之多人同feature的同分支开发
- 你用苹果手机多长时间清理一次内存,怎么清理?
- 计算机屏幕总闪烁,教你如何解决电脑屏幕闪烁
- Mac OS git多次需要输入用户名密码config解决
- Newtonsoft 六个超简单又实用的特性【上下篇】
- 数字转成人民币汉字大写(李刚著《疯狂Python讲义》P87,解决小数部分及多个零的问题。学习笔记)
- 2021.11.27月赛题解
- java计算机毕业设计高校心理测评管理系统源码+mysql数据库+系统+lw文档+部署
- 任务栏WPS出现多窗口预览?下载这个注册表就对了
- UTF-8编码和UTF-8-BOM编码的区别和处理
- Windows远程连接工具有哪些
- 学习数据分析,数据分析必备的技能有哪些