sklearn-半监督学习-标签传播算法

一、算法思路:(这里主要关注两种)

  1. 生成模型:先计算样本特征的总体的联合分布,将所有有标注的样本计算出一个分布,然后把没有标注的样本放入这个分布中,看根据这个分布它该如何被标注,这个过程可能是迭代的
  2. 物以类聚:将有标注和没有标注的样本进行相似的比较,相似度高的,就将无标注样本按照临近的有标注样本进行标注,类似迭代过程。

二、标签传播算法的两种计算方式

  1. rbf:距离离的越近越接近于1,距离离的越远越接近于0
  2. knn:找一个无标注的数据,然后取附近k个有标注的数据,无标注数据附近哪种标注的数据最多就取哪一个(以未标注的数据为圆心做knn,在指定范围内找到了有标注的数据,然后对未标注的数据进行打标,然后进行打标传播,直到未标注的数据全都标注以后,算法结束)

三、代码实现:
这里用Iris数据集进行实现,以下为Iris数据集相关信息:
1、花尊长度;
2、花尊宽度;
3、花瓣长度;
4、花瓣宽度;
5、种类:Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾)、Iris Virginica(维吉尼亚鸢尾)

import numpy as np
from sklearn import datasets
iris = datasets.load_iris()
labels = np.copy(iris.target)
# 标签传播算法中,未标注的数据的label必须是-1,随机选一些,标注为-1
random_unlabeled_points = np.random.rand(len(iris.target))
random_unlabeled_points = random_unlabeled_points<0.7 # 0-1的随机数,小于0.7返回1,大于等于0.7返回0
Y=labels[random_unlabeled_points] # label转换之前的
labels[random_unlabeled_points]=-1 # 标签重置,将标签为1的变为-1
print('Unlabeled Number:',list(labels).count(-1))
from sklearn.semi_supervised import LabelPropagation
laber_prop_model = LabelPropagation()
laber_prop_model.fit(iris.data,labels)
Y_pred = laber_prop_model.predict(iris.data)
Y_pred = Y_pred[random_unlabeled_points] # -1的那部分重新预测
from sklearn.metrics import accuracy_score,recall_score,f1_score
print('ACC',accuracy_score(Y,Y_pred))
print('REC',recall_score(Y,Y_pred,average='micro'))
print('F-Score',f1_score(Y,Y_pred,average='micro'))

你可能感兴趣的:(sklearn-半监督学习-标签传播算法)