文章目录

  • 1. 基本思想
  • 2. 算法描述
  • 3. 算法流程
  • 4. 标签传播算法的变形
  • 5. LPA算法的python实现


LPA(Label Propagation Algorithm)由Usha Nandini Raghavan等人于2007年提出。

1. 基本思想

标签传播算法(LPA)是基于图的半监督学习算法,基本思路是从已标记的节点标签信息来预测未标记的节点标签信息,利用样本间的关系,建立完全图模型,适用于无向图
每个节点标签按相似度传播给相邻节点,在节点传播的每一步,每个节点根据相邻节点的标签来更新自己的标签,与该节点相似度越大,其相邻节点对其标注的影响权值越大,相似节点的标签越趋于一致,其标签就越容易传播。在标签传播过程中,保持已标记的数据的标签不变,使其将标签传给未标注的数据。最终当迭代结束时,相似节点的概率分布趋于相似,可以划分到一类中。

2. 算法描述

(1)算法符号介绍
lpa标签传播算法 python实现 标签传播算法社区发现_python:已标注的数据

lpa标签传播算法 python实现 标签传播算法社区发现_人工智能_02:已标注数据的类别。lpa标签传播算法 python实现 标签传播算法社区发现_数据挖掘_03已知,且存在于标签数据中

lpa标签传播算法 python实现 标签传播算法社区发现_python_04:未标注数据

lpa标签传播算法 python实现 标签传播算法社区发现_python_05:没有标签,满足lpa标签传播算法 python实现 标签传播算法社区发现_数据挖掘_06,即有标签的数据数量远小于没有标签的数据数量

lpa标签传播算法 python实现 标签传播算法社区发现_lpa标签传播算法 python实现_07

问题:从lpa标签传播算法 python实现 标签传播算法社区发现_数据分析_08lpa标签传播算法 python实现 标签传播算法社区发现_数据挖掘_09去预测lpa标签传播算法 python实现 标签传播算法社区发现_python_10

(2)全连接图建立
相邻的数据点具有相同的标签,建立一个全连接图,让每一个样本点(有标签的和无标签的)都作为一个节点。用以下权重计算方式来设定两点i, j之间边的权重,所以两点间的距离lpa标签传播算法 python实现 标签传播算法社区发现_人工智能_11越小,权重lpa标签传播算法 python实现 标签传播算法社区发现_数据分析_12越大。
lpa标签传播算法 python实现 标签传播算法社区发现_数据分析_13
然后让每一个带有标签的节点通过边传播到所有的节点,权重大的边的节点更容易影响到相邻的节点。

(3)定义概率传播矩阵
lpa标签传播算法 python实现 标签传播算法社区发现_python_14,元素lpa标签传播算法 python实现 标签传播算法社区发现_lpa标签传播算法 python实现_15为标签j传播到标签i的概率。
lpa标签传播算法 python实现 标签传播算法社区发现_人工智能_16
(4) 定义标签矩阵(也称soft label矩阵)
lpa标签传播算法 python实现 标签传播算法社区发现_数据分析_17,第i行表示节点lpa标签传播算法 python实现 标签传播算法社区发现_数据分析_18的标注概率。lpa标签传播算法 python实现 标签传播算法社区发现_数据分析_19说明节点lpa标签传播算法 python实现 标签传播算法社区发现_数据分析_18的标签为C。通过概率传播,使其概率分布集中于给定类别,然后通过边的权重来传递节点标签。

3. 算法流程

输入lpa标签传播算法 python实现 标签传播算法社区发现_python_21个标记的数据及标签,lpa标签传播算法 python实现 标签传播算法社区发现_python_22个未标记数据;

输出lpa标签传播算法 python实现 标签传播算法社区发现_python_22个未标记数据的标签

第1步:初始化,利用权重公式计算每条边的权重lpa标签传播算法 python实现 标签传播算法社区发现_数据分析_12,得到数据间相似度;

第2步:根据得到的权重lpa标签传播算法 python实现 标签传播算法社区发现_数据分析_12,计算节点lpa标签传播算法 python实现 标签传播算法社区发现_lpa标签传播算法 python实现_26到节点lpa标签传播算法 python实现 标签传播算法社区发现_数据分析_27的传播概率lpa标签传播算法 python实现 标签传播算法社区发现_lpa标签传播算法 python实现_15

第3步:定义矩阵lpa标签传播算法 python实现 标签传播算法社区发现_数据分析_29;

第4步:执行传播,每个节点按传播概率将周围节点传播的标注值按权重相加,并更新到自己的概率分布,lpa标签传播算法 python实现 标签传播算法社区发现_python_30

第5步:重置lpa标签传播算法 python实现 标签传播算法社区发现_数据挖掘_31中已标记样本的标签,限定已标注的数据,把已标注的数据的概率分布重新赋值为初始值;

第6步:重复步骤4和5,直至lpa标签传播算法 python实现 标签传播算法社区发现_数据挖掘_31收敛。

步骤5非常关键,因为已标记数据是事先确定的,不能被带跑,每次传播完都得回归本来的标签。

4. 标签传播算法的变形

每次迭代都要计算标签矩阵lpa标签传播算法 python实现 标签传播算法社区发现_数据挖掘_31,但是lpa标签传播算法 python实现 标签传播算法社区发现_数据挖掘_09是已知的,计算用处不大。在步骤5中,还需重设初始值。可以将矩阵lpa标签传播算法 python实现 标签传播算法社区发现_人工智能_35做以下划分:
lpa标签传播算法 python实现 标签传播算法社区发现_lpa标签传播算法 python实现_36
只需更新运算:
lpa标签传播算法 python实现 标签传播算法社区发现_python_37
迭代至收敛。

5. LPA算法的python实现

实现方式:scikit-learn示例

import numpy as np
import matplotlib.pyplot as plt
from sklearn.semi_supervised import label_propagation
from sklearn.datasets import make_circles

# generate ring with inner box
n_samples = 200
X, y = make_circles(n_samples=n_samples, shuffle=False)
outer, inner = 0, 1
labels = np.full(n_samples, -1.)
labels[0] = outer
labels[-1] = inner
# Learn with LabelSpreading
label_spread = label_propagation.LabelSpreading(kernel='rbf', alpha=0.8)
label_spread.fit(X, labels)

# Plot output labels
output_labels = label_spread.transduction_
plt.figure(figsize=(8.5, 4))
plt.subplot(1, 2, 1)
plt.scatter(X[labels == outer, 0], X[labels == outer, 1], color='navy',
            marker='s', lw=0, label="outer labeled", s=10)
plt.scatter(X[labels == inner, 0], X[labels == inner, 1], color='c',
            marker='s', lw=0, label='inner labeled', s=10)
plt.scatter(X[labels == -1, 0], X[labels == -1, 1], color='darkorange',
            marker='.', label='unlabeled')
plt.legend(scatterpoints=1, shadow=False, loc='upper right')
plt.title("Raw data (2 classes=outer and inner)")

plt.subplot(1, 2, 2)
output_label_array = np.asarray(output_labels)
outer_numbers = np.where(output_label_array == outer)[0]
inner_numbers = np.where(output_label_array == inner)[0]
plt.scatter(X[outer_numbers, 0], X[outer_numbers, 1], color='navy',
            marker='s', lw=0, s=10, label="outer learned")
plt.scatter(X[inner_numbers, 0], X[inner_numbers, 1], color='c',
            marker='s', lw=0, s=10, label="inner learned")
plt.legend(scatterpoints=1, shadow=False, loc='upper right')
plt.title("Labels learned with Label Spreading (KNN)")

plt.subplots_adjust(left=0.07, bottom=0.07, right=0.93, top=0.92)
plt.show()

结果展示:


lpa标签传播算法 python实现 标签传播算法社区发现_lpa标签传播算法 python实现_38