python实现的基于NMF的多图聚类算法的封装

代码均由论文复现


文章目录

  • python实现的基于NMF的多图聚类算法的封装
  • 前言
  • 参考论文
  • 一、NMF
  • 二、Mjnmf
  • 总结

前言

怕忘记干了这个事,后面再来补充说明


参考论文

  • Identification of multi-layer networks community by fusing nonnegative matrix factorization and topological structural information
  • Graph Learning for Multiview Clustering

一、NMF

代码

# -*- coding: utf-8 -*-import os
import sys
import numpy as np
import networkx as nx
import sklearn.preprocessing as nordef graphsToMatrix(graphs):"""## 返回图的临接矩阵表示"""if isinstance(graphs, list):return [np.asarray(nx.adjacency_matrix(g,weight='weight').todense(),dtype='float32') for g in graphs]else:return np.asarray(nx.adjacency_matrix(graphs,weight='weight').todense(),dtype='float32')def getRandomData(xNum,yNum):"""# 获取随机的数据"""return np.random.rand(xNum,yNum)class NMF(object):# 最小分母minTrueNum = 10 ** -8maxIterNum = 1000alpha = 10 ** -2# 聚类的数量k = 4# 节点的数量nodesNum = 0layerNum = 0# 图数据的存储graphs = []# 图的临接矩阵表示wItems = []#相似度矩阵sItems = []# 左侧的综合矩阵B = []# 右侧的系数矩阵fItems = []# 错误的分数j = [100 ** 4]def __init__(self, graphs, k):self.graphs = graphsself.wItems = graphsToMatrix(graphs)self.sItems = [self.simplify(matrix) for matrix in self.wItems]# self.wItems = self.sItemsself.k = kself.nodesNum  = graphs[0].number_of_nodes()self.layerNum = len(graphs)self.__initialize()def __initialize(self):self.B = getRandomData(self.nodesNum, self.k)self.fItems = [getRandomData(self.k,self.nodesNum) for i in range(self.layerNum)]def calCulateErr(self):"""## 计算本轮的误差值"""itemErr = sum([np.sum((w - self.B @k) ** 2) for w,k in zip(self.wItems,self.fItems)])self.j.append(itemErr)return itemErrdef updateB(self):"""## 迭代更新B矩阵"""molecule = sum([w @ f.T for w,f in zip(self.wItems,self.fItems)])denominator = self.B @ sum([f @ f.T for f in self.fItems])self.B = self.B * (molecule / np.maximum(denominator, self.minTrueNum))def updateK(self):"""## 更新右侧的系数矩阵"""molecules = [self.B.T @ w for w in self.wItems]denominators = [self.B.T @ self.B @ f for f in self.fItems]self.fItems = [f * (k1 / np.maximum(k2, self.minTrueNum)) for k1,k2,f in zip(molecules, denominators,self.fItems)]# self.fItems = [f * ((self.B.T @ w) / np.maximum(self.B.T @ self.B @ f , self.minTrueNum)) #               for f,w in zip(self.fItems, self.wItems)]def simplify(self, w):"""# 计算获得相似度矩阵"""cs = nor.normalize(w,axis=0,norm="l2")re = cs.T @csnp.fill_diagonal(re, 1)return redef fit(self):"""## 运行进行迭代更新"""for i in range(self.maxIterNum):self.updateB()self.updateK()errRate = self.calCulateErr()# print(f"iter:: {i} err -> {errRate}")if errRate < self.alpha:print(f"end iter in {i} 轮 -> errRate::{errRate}")def getClusterLabel(self):"""## 获得得到的分类标签"""labels = np.argmax(self.B, 1)return labels.tolist()# from tools import getGraphData# def runTest():
#   graphs = getGraphData("CELE")
#   m = NMF(graphs, 5)#   m.fit()
#   print(m.getClusterLabel())if __name__ == '__main__':# runTest()pass

二、Mjnmf

代码

# -*- coding: utf-8 -*-from logging import error
from numpy.linalg import inv
import pandas as pd
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
from sklearn import metrics
import scipy.sparse as sp
import sklearn.preprocessing as nor
from copy import deepcopy
from scipy.io import loadmat
from munkres import  Munkres
from sklearn.cluster import KMeans
import networkx as nx
# import loadDatadef getRandomData(xNum,yNum):"""# 获取随机的数据"""return np.random.rand(xNum,yNum)def read_adj(filename):"""读取txt文件获取每一重图中的信息return :``graphs`` -> 代表每重图对应的邻接矩阵的表示 ``nodes`` -> 每一重图中的点``layers`` -> 不同的layer对应的id"""df = pd.read_csv(filename, header=None, sep=' ', names=['layerID', 'source', 'target', 'weight'], dtype='int32')layers = list(set(df['layerID'].tolist()))graphs = []nodes = []for i in layers:g = nx.from_pandas_edgelist(df[df['layerID'] == i], source='source', target='target',edge_attr='weight')nodelist=sorted(g.nodes())L = np.asarray(nx.adjacency_matrix(g, nodelist=nodelist,weight='weight').todense(),dtype='float32')graphs.append(L)nodes.append(nodelist)return graphs, nodes,layersclass Mjnmf(object):"""# Mjnmf 方法的封装"""lower_control = 10 ** -10nodeNum = 0layerNum = 3l = 4theta = 0.1beta = 0.1alpha = 1lamda = 10iterNum = 700errorradio = 10 ** -6k = 4dataSet = []WItems =[]fItems = []h = []b = []wGroups = []uItems = []sItems = []errItems = []e = [10 **7] def __init__(self,dataSet, k = 4, layerNum =None , nodeNum = None):"""# 设置初始化的数据"""self.dataSet = dataSetif layerNum == None: self.layerNum = dataSet.shape[0]else : self.layerNum = layerNumif nodeNum == None: self.nodeNum = dataSet[0].shape[1]else :self.nodeNum = nodeNumprint(f"初始化 layerNum{self.layerNum} :: nodeNum{self.nodeNum}")self.k = kself.WItems = [self.constructkernal(item) for item in dataSet ]self.__runInitial()def __runInitial(self):self.fItems = [getRandomData(self.nodeNum,self.k) for i in range(self.nodeNum)  ]self.h = getRandomData(self.nodeNum,self.k)self.b = getRandomData(self.nodeNum,self.k)self.wGroups = [self.high_order(WItem) for WItem in self.WItems]self.sItems = [self.similarity(adj) for adj in self.dataSet]for index,item in enumerate(self.sItems):np.fill_diagonal(self.sItems[index],1)self.uItems = [self.cal_sim(sItem) for sItem in self.sItems]self.wGroups = [self.cal_sim(wItem) for wItem in self.wGroups]def caldistance(self,adj):"""## 计算获得距离矩阵"""'''numberoffeature = (adj.shape)[0]'''pingfanghe = np.sum(adj ** 2,0)jiaocha = adj.T @ adjdistance = np.sqrt(pingfanghe.reshape(self.nodeNum,1) + pingfanghe.reshape(1,self.nodeNum)- 2 * jiaocha)return distancedef constructkernal(self,adjcency):"""初始化得到 W 对应的矩阵"""dis = self.caldistance(adjcency)sig = np.median(dis)'''sig = 1'''fenzi = dis ** 2fenmu = max(2 *(sig ** 2), self.lower_control)wkernal = np.exp(-fenzi / fenmu)np.fill_diagonal(wkernal,0)return wkernaldef high_order(self,W):P = np.zeros((self.nodeNum,self.nodeNum))temp = 1for i in range(self.l):if i == 0:A = deepcopy(W)else:A = A @ Wtemp *= (i+1)P += ((A * (self.theta ** i)) / temp)return Pdef similarity(self,W):cs = nor.normalize(W,axis=0,norm="l2")re = cs.T @csreturn redef cal_sim(self,s):"""对矩阵进行归一化处理"""re = nor.normalize(s,axis=1,norm="l1")return redef b_update(self,B):fenzi = sum([w @ f for w,f in zip(self.wGroups, self.fItems)])fenmu = B @ sum([f.T @ f for f in self.fItems])B = B * (fenzi / np.maximum(fenmu, self.lower_control))return Bdef f_update(self,w,u,f):fenzi = w.T @ self.b + self.beta * (u @ self.h)    fenmu = f @ (self.b.T @ self.b) + self.beta * f'''f = f * np.sqrt(fenzi / np.maximum(fenmu, lower_control))'''f = f * (fenzi / np.maximum(fenmu, self.lower_control))return fdef h_update(self,H):uuh = 2 * self.beta * sum([u.T@(u @ H) for u in self.uItems])sh = 4 * self.alpha * sum([s.T@ H for s in self.sItems])uf = 2 * self.beta * sum([u.T @ f for u,f in zip(self.uItems,self.fItems)])hhh = 8 * (self.layerNum * self.alpha + self.lamda) * (H @ (H.T @ H))fenzi = -uuh + np.sqrt((uuh * uuh) + (2*hhh)* (sh + uf + 4 * self.lamda * H))    H = H * np.sqrt(fenzi / np.maximum(hhh, self.lower_control))return Hdef u_update(self,u,f):fenzi = f @ (self.h.T)fenmu = u @ self.h @ (self.h.T)u = u * (fenzi / np.maximum(fenmu, self.lower_control))return udef error(self,w,f,s,u):e1 =  np.sum((w - self.b @ f.T)**2) e2 =  self.alpha * np.sum((s - self.h @ self.h.T) ** 2) e3 =  self.beta * np.sum((f - u @ self.h)**2)'''e4 =  lamda * np.linalg.norm(h.T @ h - np.eye(k),2)'''err = e1 + e2 + e3 return errdef runIter(self):"""# 运行进行迭代"""for i in range(self.iterNum):self.b= self.b_update(self.b)self.fItems = [ self.f_update(w,u,f) for w,u,f in zip(self.wGroups,self.uItems, self.fItems)]self.uItems = [self.u_update(u,f) for u,f in zip(self.uItems,self.fItems)]self.h = self.h_update(self.h)self.errItems = [self.error(w,f,s,u) for w,f,s,u in zip(self.wGroups,self.fItems, self.sItems, self.uItems)]self.e.append(sum(self.errItems))# print(f"iter::{i} -> {self.e[-1]}")if abs(self.e[-1] - self.e[-2]) / self.e[-1] <= self.errorradio:print(f"结束于 {i}")breakdef getRes(self):"""# 获得聚类的结果"""ans = np.argmax(self.h, 1)return ansdef dataTrans(fileName):graphs_adj, nodesF, _ = read_adj('./DataSet/' + fileName + '.txt')return graphs_adj, nodesFdef main(fileName:str,clusterNum:int):""":params:``fileName`` 对应的文件名:``clusterNum`` 对应的文件名"""data, nodes = dataTrans(fileName)d = np.array(data)m = Mjnmf(d, k = clusterNum)m.runIter()return m.getRes().tolist(), nodes[0]if __name__ == '__main__':print(main("CELE"))

数据

网盘
提取码: es4o

总结

有时间来补充非负矩阵分解的知识

python实现的基于NMF的多图聚类算法相关推荐

  1. 【聚类算法】基于matlab划分法k-means聚类算法【含Matlab源码 1941期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[聚类算法]基于matlab划分法k-means聚类算法[含Matlab源码 1941期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  2. 论文学习——一种基于DTW的符号化时间序列聚类算法

    文章目录 1 摘要 2 引言 2.1 类似的工作 SAX 2.2 本文成果 3 相关知识 3.1 极值点EP 成为关键点KP 的条件 3.2 DTW距离 3.3 基于Normal矩阵的谱平分法 4 本 ...

  3. [Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-Means、BIRCH、树状聚类、MeanShift)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  4. 超详细!构建基于客户细分的 K-Means 聚类算法

    客群细分对于企业了解目标受众非常重要.根据受众群体的不同,我们可以给采取不同的营销策略.目前有许多无监督的机器学习算法可以帮助公司识别他们的用户群并创建消费群体. 在本文中,我将分享一种目前比较流行的 ...

  5. 基于经典的机器学习k-means聚类算法实现对三通道图片的压缩操作

    https://www.toutiao.com/a6573221465104056846/ 压缩图片的原理 k-means算法实现图像的压缩是k-means聚类算法的一个经典的应用,它把一个彩色图压缩 ...

  6. 打开深度神经网络黑箱:竟是模块化的?图聚类算法解密权重结构 | ICML 2020

    十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 深度神经网络这个黑箱子,似乎有了更清晰的轮廓. 我们都知道深度神经网络性能十分强大,但具体效果为什么这么好,权重为什么要这么分配,可能连&q ...

  7. 聚类算法(四)—— 基于词语相似度的聚类算法(含代码)

    转载请注明出处 简单了解了下目前的一些聚类算法, 聚类算法(一)--DBSCAN 聚类算法(二)-- 优缺点对比 聚类算法(三)-- 评测方法1 聚类算法(三)-- 评测方法2 聚类算法(三)-- 评 ...

  8. 基于FCM模糊C均值聚类算法的MATLAB仿真

    目录 1.算法仿真效果 2.MATLAB源码 3.算法概述 4.部分参考文献 1.算法仿真效果 matlab2022a仿真结果如下: 2.MATLAB源码 %*********************

  9. python最优调配问题_Python实现的基于优先等级分配糖果问题算法示例

    Python实现的基于优先等级分配糖果问题算法示例 本文实例讲述了Python实现的基于优先等级分配糖果问题算法.分享给大家供大家参考,具体如下: 问题: 有n个人,每个人有一定的优先等级,等级高的人 ...

最新文章

  1. 许可证无效_未取得预售许可证所签买房合同是否一概无效?
  2. 【计算理论】计算复杂性 ( 两个带子的图灵机的时间复杂度 )
  3. 2017年前端工作小结,个人踩坑之旅,前端学习者的杂谈
  4. 《终身成长》读书笔记(part2)--失败从一种行为,转变为一种身份
  5. HTTP协议工作原理(与HTTPS的区别)
  6. 启动mysql5.7异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
  7. split(v1,v2)用于把一个字符串分割成字符串数组
  8. cmake 常见问题及解决
  9. ‘utf-8‘ codec can‘t decode byte 0xc8 in position 0: invalid continuation byte
  10. 凯立德导航android历史版本,凯立德导航升级2020版
  11. Mysq底层数据结构和优化整理
  12. (转)日期插件layDate的使用
  13. Unity3d C#解决transform.LookAt朝向前后翻转问题(含源码)
  14. 【叶子函数分享五十四】汉字转拼音函数
  15. 2022年全球与中国环己胺市场现状及未来发展趋势
  16. 数据类型扩展及面试题讲解
  17. 领导力培训课程鱼龙混杂,还不如看这本经典领导力书籍来得实在!
  18. Network Experiance - Cisco IP 电话 通过防火墙后无法注册
  19. 将键盘上数字与对应的符号互换
  20. 计算机求职个人简历,计算机求职工作简历

热门文章

  1. 数据分析一定要懂的分析模型——波士顿矩阵
  2. linux中安装Windows虚拟机(使用VMware player)
  3. sharepoint 培训笔记和相关学习链接
  4. VMware虚拟机与主机之间文件共享配置
  5. 计算机音乐monster,monster
  6. VVC/H.266 项目文件的生成及有用网址
  7. win7共享虚拟wifi
  8. Gen2-UHF-RFID-Reader学习(六)reader
  9. EXCEL自定义函数学习与分享(持续更新)
  10. 【雷达】脉冲体制雷达基础知识