标签传播算法(label propagation)是典型的半监督聚类算法。半监督是指训练数据集中小部分样本点已知标签,大部分样本点未知标签。

核心思想

相似性较大的样本点间应该具有相同的标签,将已知标签通过相似性矩阵传播到未知的标签。

算法简介

基本概念

转化矩阵:用来更新标签,实质就是度量样本点间相似性程度的矩阵(图的边的权重)。

Yi+1←TYi Y i + 1 ← T Y i

Y_{i+1}\gets TY_i
通常使用高斯径向基以及k近邻方法度量。
高斯径向基计算两样本点间权重:

wij=e−(xi−xj)2σ2 w i j = e − ( x i − x j ) 2 σ 2

w_{ij}= e^{-\frac{{(x_i-x_j)}^2}{\sigma^2}}采用径向基时, σ σ \sigma的影响非常大,且不好设置。一种启发式的方法就是找到距离最近( d0 d 0 d_0)的两个不同标签的样本点(具体怎么找可以使用Kruskal最小生成树算法),设置 σ>3d0/2–√ σ > 3 d 0 / 2 \sigma > 3d_0/\sqrt2.因为这样满足 3σ 3 σ 3\sigma准则,不同标签样本点间权重几乎为0。
k近邻方法计算两样本点间权重:

wij={1K0j∈Nij∉Ni(1) (1) w i j = { 1 K j ∈ N i 0 j ∉ N i

\begin{equation} w_{ij}= \begin{cases}\frac{1}{K}&\\0&\end{cases} \end{equation}其中, Ni N i N_i为样本i的K近邻节点集合。
clamp:标签矩阵更新过程中,原数据集中已知标签样本点的标签不能改变,故需要将其”夹住”不让其改变。

算法流程

  • Input: 训练数据集X_data,y_data(未知标签的设为-1), 阈值epsilon, 最大迭代次数maxstep, 权值计算函数即相应参数
  • Output: 样本标签数组
  • Step1: 计算转换矩阵T。
  • Step2: 更新标签,然后clamp。若标签矩阵更新前后差异小于epsilon或超出迭代超出maxstep则终止。

代码

"""
标签传播聚类算法, 典型的半监督学习算法
核心思想:相似的数据应该具有相同的标签,构建节点间的相似性矩阵(边的权重)
"""
import numpy as npclass LablePropagation:def __init__(self, epsilon=1e-3, maxstep=500, kernel_option='rbf', sigma=1.0, k=10):self.epsilon = epsilonself.maxstep = maxstepself.kernel_option = kernel_optionself.sigma = sigma  # rbf 核函数的参数self.k = k  # knn 核函数参数self.T = None  # 未标记点间的转换矩阵self.Y = None  # 标签数矩阵self.Y_clamp = None  # 已知标签数据点的标签矩阵self.N = Noneself.labeled_inds = None  # 已知标签样本的索引self.labels = Nonedef init_param(self, X_data, y_data):# 初始化参数self.N = X_data.shape[0]self.labeled_inds = np.where(y_data >= 0)[0]  # 未知标签设为-1n_class = len(np.unique(y_data[self.labeled_inds]))self.Y = np.zeros((self.N, n_class))for i in self.labeled_inds:self.Y[i][int(y_data[i])] = 1.0   # 哑编码,对应标签设为1self.Y_clamp = self.Y[self.labeled_inds]  # n*lself.T = self.cal_tran_mat(X_data)  # n*nreturndef cal_dis2(self, node1, node2):# 计算节点间的欧式距离平方return (node1 - node2) @ (node1 - node2)def cal_tran_mat(self, data):# 计算转换矩阵, 即构建图dis_mat = np.zeros((self.N, self.N))for i in range(self.N):for j in range(i + 1, self.N):dis_mat[i, j] = self.cal_dis2(data[i], data[j])dis_mat[j, i] = dis_mat[i, j]if self.kernel_option == 'rbf':assert (self.sigma is not None)T = np.exp(-dis_mat / self.sigma ** 2)normalizer = T.sum(axis=0)T = T / normalizerelif self.kernel_option == 'knn':assert (self.k is not None)T = np.zeros((self.N, self.N))for i in range(self.N):inds = np.argpartition(dis_mat[i], self.k + 1)[:self.k + 1]T[i][inds] = 1.0 / self.k  # 最近的k个拥有相同的权重T[i][i] = 0else:raise ValueError('kernel is not supported')return Tdef fit(self, X_data, y_data):# 训练主函数self.init_param(X_data, y_data)step = 0while step < self.maxstep:step += 1new_Y = self.T @ self.Y  # 更新标签矩阵new_Y[self.labeled_inds] = self.Y_clamp  # clampif np.abs(new_Y - self.Y).sum() < self.epsilon:breakself.Y = new_Yself.labels = np.argmax(self.Y, axis=1)returnif __name__ == '__main__':from sklearn.datasets import make_circlesn_samples = 100X, y = make_circles(n_samples=n_samples, shuffle=False)outer, inner = 0, 1labels = -np.ones(n_samples)labels[0] = outerlabels[-1] = innerLPA = LablePropagation(maxstep=1000, kernel_option='knn', k=2, sigma=0.07)LPA.fit(X, labels)labels = LPA.labelsimport matplotlib.pyplot as pltdef visualize(data, labels):color = 'bg'unique_label = np.unique(labels)for col, label in zip(color, unique_label):partial_data = data[np.where(labels == label)]plt.scatter(partial_data[:, 0], partial_data[:, 1], color=col, alpha=1)plt.scatter(data[0, 0], data[0, 1], color='b', marker='*', s=200, alpha=0.5)  # outerplt.scatter(data[-1, 0], data[-1, 1], color='g', marker='*', s=200, alpha=0.5)  # innerplt.show()returnvisualize(X, labels)

我的GitHub
注:如有不当之处,请指正。

聚类——标签传播算法以及Python实现相关推荐

  1. 标签传播算法(Label Propagation)及Python实现

    众所周知,机器学习可以大体分为三大类:监督学习.非监督学习和半监督学习.监督学习可以认为是我们有非常多的labeled标注数据来train一个模型,期待这个模型能学习到数据的分布,以期对未来没有见到的 ...

  2. 【知识图谱】两种 Python 方法实现社区发现之标签传播算法(LPA)

    在Graph领域,社区发现(Community detection)是一个非常热门且广泛的话题,后面会写一个系列,该问题实际上是从子图分割的问题演变而来,在真实的社交网络中,有些用户之间连接非常紧密, ...

  3. 【社团检测】社团检测之标签传播算法Python实现

    转载自:http://blog.csdn.net/DreamHome_S/article/details/78662197 主要优点:时间复杂度近似线性,不需要事先知道社区数量. 主要算法流程:首先为 ...

  4. 浅谈标签传播算法:LPA

    标签传播算法:LPA 1.半监督学习 让学习器不依赖外界交互,自动的利用未标记样本来提升学习性能,这种就是半监督学习,主要用来处理现实中有标记数据少.未标记数据多的问题,要利用未标记的数据,必须要做一 ...

  5. 什么是标签传播算法?为什么要使用标签传播算法?如何使用?

    什么是标签传播算法?为什么要使用标签传播算法?如何使用? 标签传播在半监督学习中很有用,在半监督学习中,我们有很少的标记点和大量的未标记实例,我们希望将标签从标记样本传播到未标记样本,这样我们就可以扩 ...

  6. 社区发现(三):LPA算法(标签传播算法)

    引用:https://blog.csdn.net/itplus/article/details/9286905 引用:https://www.jianshu.com/p/0c66b2717972 文章 ...

  7. 社区发现之标签传播算法(LPA)

    在Graph领域,社区发现(Community detection)是一个非常热门且广泛的话题,后面会写一个系列,该问题实际上是从子图分割的问题演变而来,在真实的社交网络中,有些用户之间连接非常紧密, ...

  8. 附源码|复杂网络社区发现——标签传播算法(LPA)

    本文通过Python 3.7实现了标签传播算法的两个代码(1.自己写的,2.调包实现),并通过空手道俱乐部的例子进行可视化显示. 标签传播是一种半监督机器学习算法,它将标签分配给以前未标记的数据点.在 ...

  9. 网络算法系列之社区发现(一):标签传播算法

    社区发现简介   社区发现问题实际上是从子图分割的问题演变而来.在社交网络中,有些用户连接非常紧密,有些用户连接较为稀疏,这些连接紧密的用户可以看做一个社区,而社区之间连接较为稀疏.下图就展示了一个社 ...

最新文章

  1. 相机夜视原理——红外补光
  2. python编程输入标准-Python练习题,,T1.编写程序,输入
  3. python去除中文停用词_删除停止词Python
  4. CSS3 box-sizing(content-box:width指内容 border-box:width指border+padding+content)
  5. linux git中央仓库地址,如何在Linux上搭建一个Git中央仓库
  6. 这份1307页Android面试全套真题解析,源码+原理+手写框架
  7. html.parser python_python模块之HTMLParser
  8. 数学建模学习笔记(十二)——奇异值分解
  9. 一个抓取豆瓣图书的开源爬虫的详细步骤
  10. Android 8.0学习 (36)---Android 8.0 WebView 拍照、简易预览、二维码扫描 各种问题解决
  11. Linux学习技巧分享
  12. LFW人脸数据集测试协议及编程实现
  13. matlab 系统辨识,系统辨识的Matlab实现方法(手把手)..docx
  14. 【第一天】【ROS操作系统】【2】ROS安装教程
  15. UE4 讯飞语音识别插件
  16. VMware虚拟机克隆
  17. 教你制作挂件头像 | 小程序七十二变之 canvas 绘制国旗头像
  18. Burpsuite配置抓apk流量代理设置脚本
  19. 关于linux中socket阻塞与非阻塞
  20. VB打开工程时出现不能加载MSCOMCTL.OCX的解决方法

热门文章

  1. win10打印机脱机(win10打印机脱机怎么处理)
  2. Zoom停止中国个人用户注册,不再提供免费服务
  3. 目标检测之YOLO_v1解读
  4. We~ˇsay~~ˇ
  5. base64二进制计算机,base64
  6. java计算机毕业设计口腔医院网站源码+数据库+lw文档+系统
  7. ORA-00205: error in identifying control file, check alert log for more info
  8. GDT与LDT的区别
  9. dedecms常用标签调用大全
  10. 常见的ES6转码(编译)工具——Babel转码器、Traceur转码器