zoukankan      html  css  js  c++  java
  • python大战机器学习——半监督学习

      半监督学习:综合利用有类标的数据和没有类标的数据,来生成合适的分类函数。它是一类可以自动地利用未标记的数据来提升学习性能的算法

    1、生成式半监督学习

      优点:方法简单,容易实现。通常在有标记数据极少时,生成式半监督学习方法比其他方法性能更好

      缺点:假设的生成式模型必须与真实数据分布吻合。如果不吻合则可能效果很差。而如何给出与真实数据分布吻合的生成式模型,这就需要对问题领域的充分了解

    2、图半监督学习

    (1)标记传播算法:

      优点:概念清晰

      缺点:存储开销大,难以直接处理大规模数据;而且对于新的样本加入,需要对原图重构并进行标记传播

    (2)迭代式标记传播算法:

      输入:有标记样本集Dl,未标记样本集Du,构图参数δ,折中参数α

      输出:未标记样本的预测结果y

      步骤:

        1)计算W

        2)基于W构造标记传播矩阵S

        3)根据公式初始化F<0>

        4)t=0

        5)迭代,迭代终止条件是F收敛至F*

          F<t+1>=αSF<t>+(1-α)Y

          t=t+1

        6)构造未标记样本的预测结果yi

        7)输出结果y

      LabelPropagation实验代码:

     1 import numpy as np
     2 import matplotlib.pyplot as plt
     3 from sklearn import metrics
     4 from sklearn import datasets
     5 from sklearn.semi_supervised import LabelPropagation
     6 
     7 def load_data():
     8     digits=datasets.load_digits()
     9     rng=np.random.RandomState(0)
    10     index=np.arange(len(digits.data))
    11     rng.shuffle(index)
    12     X=digits.data[index]
    13     Y=digits.target[index]
    14     n_labeled_points=int(len(Y)/10)
    15     unlabeled_index=np.arange(len(Y))[n_labeled_points:]
    16 
    17     return X,Y,unlabeled_index
    18 
    19 def test_LabelPropagation(*data):
    20     X,Y,unlabeled_index=data
    21     Y_train=np.copy(Y)
    22     Y_train[unlabeled_index]=-1
    23     cls=LabelPropagation(max_iter=100,kernel='rbf',gamma=0.1)
    24     cls.fit(X,Y_train)
    25     print("Accuracy:%f"%cls.score(X[unlabeled_index],Y[unlabeled_index]))
    26 
    27 X,Y,unlabeled_index=load_data()
    28 test_LabelPropagation(X,Y,unlabeled_index)
    View Code

      实验结果:

    可见预测的准确率还是挺高的

      LabelSpreading实验代码:

     1 import numpy as np
     2 import matplotlib.pyplot as plt
     3 from sklearn import metrics
     4 from sklearn import datasets
     5 from sklearn.semi_supervised import LabelPropagation,LabelSpreading
     6 
     7 def load_data():
     8     digits=datasets.load_digits()
     9     rng=np.random.RandomState(0)
    10     index=np.arange(len(digits.data))
    11     rng.shuffle(index)
    12     X=digits.data[index]
    13     Y=digits.target[index]
    14     n_labeled_points=int(len(Y)/10)
    15     unlabeled_index=np.arange(len(Y))[n_labeled_points:]
    16 
    17     return X,Y,unlabeled_index
    18 
    19 def test_LabelPropagation(*data):
    20     X,Y,unlabeled_index=data
    21     Y_train=np.copy(Y)
    22     Y_train[unlabeled_index]=-1
    23     cls=LabelPropagation(max_iter=100,kernel='rbf',gamma=0.1)
    24     cls.fit(X,Y_train)
    25     print("Accuracy:%f"%cls.score(X[unlabeled_index],Y[unlabeled_index]))
    26 
    27 def test_LabelSpreading(*data):
    28     X,Y,unlabeled_index=data
    29     Y_train=np.copy(Y)
    30     Y_train[unlabeled_index]=-1
    31     cls=LabelSpreading(max_iter=100,kernel='rbf',gamma=0.1)
    32     cls.fit(X,Y_train)
    33     predicted_labels=cls.transduction_[unlabeled_index]
    34     true_labels=Y[unlabeled_index]
    35     print("Accuracy:%f"%metrics.accuracy_score(true_labels,predicted_labels))
    36 
    37 X,Y,unlabeled_index=load_data()
    38 #test_LabelPropagation(X,Y,unlabeled_index)
    39 test_LabelSpreading(X,Y,unlabeled_index)
    View Code

      注:LabelSpreading类似于LabelPropagation,但是使用基于normalized graph Laplacian and soft clamping的距离矩阵

      实验结果:

       预测效果也很不错

    3、总结

      半监督学习在利用未标记样本后并非必然提升泛化性能,在有些情况下甚至会导致性能下降。对生成式方法,原因通常是模型假设不准确。因此需要依赖充分可靠的领域知识来设计模型。更一般的安全半监督学习仍然是未加解决的难题。安全是指:利用未标记样本后,能确保返回性能至少不差于仅利用有标记样本

  • 相关阅读:
    [转]C# ReportViewer报表 详解
    [转]Java NIO原理图文分析及代码实现
    [转]C#泛型编程
    [转]ASP.NET页面基本对象
    [转]C#中抽象类和接口的异同
    [转]Android进程间通信消息机制及IPC机制实现
    [转]左连接和右连接的区别
    [转]C# 4.0 新特性
    [转]UML类图java代码实现
    [转]Using The Entity Framework With WCF
  • 原文地址:https://www.cnblogs.com/acm-jing/p/7582520.html
Copyright © 2011-2022 走看看