zoukankan      html  css  js  c++  java
  • PR曲线、LDA、决策树实例分析

    1. 请阐述监督学习,半监督学习,无监督学习和弱监督学习区别

    • 监督学习:
      给定数据,预测标签。通过已有的一部分输入数据与输出数据之间的对应关系,生成一个函数,将输入映射到合适的输出,例如分类。
    • 半监督学习:
      但是使用的数据,一部分是标记过的,而大部分是没有标记的。综合利用有类标的和没有类标的数据,来生成合适的分类函数。和监督学习相比较,半监督学习的成本较低,但是又能达到较高的准确度。
    • 无监督学习:
      只有特征,没有标签。给定输入数据,寻找隐藏的关系。如在只有特征,没有标签的训练数据集中,通过数据之间的内在联系和相似性将他们分成若干类。
    • 弱监督学习:
      弱监督学习主要可以分为三类:不完全监督,即只有一部分样本有标签;不确切监督,即训练样本只有粗粒度的标签;不准确监督,即给定的标签不一定总是真值。

    2. 请画出以下两个分类器分类 PR 曲线

    在这里插入图片描述

    • 对分类器1按(P(+/X))从大到小排序:
    + + + + - + - -
    P 1/1 2/2 3/3 4/4 4/5 5/6 5/7 5/8
    R 1/5 2/5 3/5 4/5 4/5 5/5 5/5 5/5
    • 对分类器2按(P(+/X))从大到小排序(r若相等则按原顺序):
    + + - + + - - +
    P 1/1 2/2 2/3 3/4 4/5 4/6 4/7 5/8
    R 1/5 2/5 2/5 3/5 4/5 4/5 4/5 5/5

    PR曲线如下:

    PR曲线
    代码如下:

    from fractions import Fraction
    from matplotlib import pyplot as plt
    
    tag = ['+', '-', '-', '+', '+', '-', '+', '+']
    array1 = [0.4, 0.3, 0.5, 0.8, 0.6, 0.3, 0.9, 0.8]
    array2 = [0.8, 0.2, 0.2, 0.6, 0.3, 0.4, 0.1, 0.4]
    classer1 = list(zip(tag, array1))
    classer2 = list(zip(tag, array2))
    classer1.sort(key = lambda x: -x[1])
    classer2.sort(key = lambda x: -x[1])
    print(classer1)
    print(classer2)
    total_1 = tag.count('+')
    p1 = []
    r1 = []
    now_1 = 0
    for i, item in enumerate(classer1):
    	if item[0] == '+':
    		now_1 += 1
    	p1.append(now_1 / (i+1))
    	r1.append(now_1 / total_1)
    
    p2 = []
    r2 = []
    now_1 = 0
    for i, item in enumerate(classer2):
    	if item[0] == '+':
    		now_1 += 1
    	p2.append(now_1 / (i+1))
    	r2.append(now_1 / total_1)
    
    
    plt.title('PR curves')
    plt.xlabel('R')
    plt.ylabel('P')
    plt.plot(r1, p1, color = 'r', label = 'classer1')
    plt.plot(r2, p2, color = 'b', label = 'classer2')
    plt.legend()
    plt.show()
    

    3. 请用表 2 中数据集,计算 LDA 最大化目标

    在这里插入图片描述

    在这里插入图片描述

    [egin{gathered} X = quad egin{bmatrix} 2 & 0.5 & 1\ -1.5 & -2.5 & -1 end{bmatrix} quad X0 = quad egin{bmatrix} 0.5 & 1 \ -2.5 &-1 end{bmatrix} quad X1 = quad egin{bmatrix} 2 \ -1.5 end{bmatrix} quad end{gathered} ]

    [u0 = quad egin{bmatrix} 0.75 \ -1.75 end{bmatrix} quad u1 = quad egin{bmatrix} 2 \ -1.5 end{bmatrix} quad ]

    [S_w = sum_{0} + sum_{1} ]

    [S_w = sum_{xin X0}(x-u0)(x-u0)^T+ sum_{xin X1}(x-u1)(x-u1)^T ]

    [egin{gathered} S_w = quad egin{bmatrix} -0.25 \ -0.75 end{bmatrix} quad quad egin{bmatrix} -0.25 & -0.75 end{bmatrix} quad + quad egin{bmatrix} 0.25 \ 0.75 end{bmatrix} quad quad egin{bmatrix} 0.25 & 0.75 end{bmatrix} quad +0 = quad egin{bmatrix} frac{1}{8} & frac{3}{8} \ frac{3}{8} & frac{9}{8} end{bmatrix} quad end{gathered} ]

    [S_b =(u0-u1)(u0-u1)^T ]

    [egin{gathered} S_b = quad egin{bmatrix} -1.25 \ -0.25 end{bmatrix} quad quad egin{bmatrix} -1.25 & -0.25 end{bmatrix} quad = quad egin{bmatrix} frac{25}{16} & frac{5}{16} \ frac{5}{16} & frac{1}{16} end{bmatrix} quad end{gathered} ]

    [egin{gathered} w = S_w^{-1}(u0-u1)= quad egin{bmatrix} -0.16 \ -0.48 end{bmatrix} quad end{gathered} ]

    [J = frac{W^TS_bW}{W^TS_wW} = 0.32 ]

    代码:

    import numpy as np
    from matplotlib import pyplot as plt
    
    x = np.array([[2, 0.5, 1],[-1.5, -2.5, -1]])
    y = np.array([1, 0, 0]).reshape(1, 3)
    tag0 = y.repeat(repeats = x.shape[0], axis = 0) == 0
    x0 = x[tag0].reshape(tag0.shape[0], np.sum(tag0[0]))
    tag1 = y.repeat(repeats = x.shape[0], axis = 0) == 1
    x1 = x[tag1].reshape(tag1.shape[0], np.sum(tag1[0]))
    u0 = np.mean(x0, axis = 1).reshape(x0.shape[0], 1)
    u1 = np.mean(x1, axis = 1).reshape(x0.shape[0], 1)
    sigma0 = np.zeros((x0.shape[0], x0.shape[0]))
    # print(x0, '
    ', x1, '
    ', u0, '
    ', u1, '
    ', sigma0)
    for i in np.arange(x0.shape[1]):
    	x_t = x0[:, i].reshape(x0.shape[0], 1) - u0
    	print(x_t)
    	sigma0 += np.dot(x_t, x_t.T) 
    print(sigma0)
    
    sigma1 = np.zeros((x1.shape[0], x1.shape[0]))
    for i in np.arange(x1.shape[1]):
    	x_t = x1[:, i].reshape(x1.shape[0], 1) - u1
    	print(x_t)
    	sigma1 += np.dot(x_t, x_t.T)
    print(sigma1)
    
    sw = sigma0 + sigma1
    sw_inv = np.linalg.pinv(sw)
    sb = np.dot(u0-u1, (u0-u1).T)
    
    w = sw_inv.dot(u0-u1)
    j = w.T.dot(sb).dot(w) / w.T.dot(sw).dot(w)
    print(w, '
    ', sw, '
    ', sb, '
    ', j)
    print(w.T.dot(x))
    
    plt.xlabel('X1')
    plt.ylabel('X2')
    x01 = x0[0, :]
    x02 = x0[1, :]
    plt.scatter(x01, x02, color = 'r', marker = 'o', label = '+')
    #plt.plot(x01, x02, 'or')
    x11 = x1[0, :]
    x12 = x1[1, :]
    plt.scatter(x11, x12, color = 'b', marker = '*', label = '-')
    # plt.plot(x11, x12, '+b')
    plt.legend()
    plt.show()
    
    

    4. 请用表 3 中数据集,利用信息增益生成决策树,并写出计算过程。假设属性使用年限阈值设置为 5。

    在这里插入图片描述

    (Ent(D)=-frac{5}{8}log_2frac{5}{8}--frac{3}{8}log_2frac{3}{8}=0.9544)
    若按发动机状态划分:
    (Ent(D^{良好})=-frac{3}{4}log_2frac{3}{4}--frac{1}{4}log_2frac{1}{4}=0.8113)
    (Ent(D^{正常})=-frac{2}{4}log_2frac{2}{4}--frac{2}{4}log_2frac{2}{4}=1)
    (Gain(D, 发动机) = Ent(D) - Ent(D^{良好})- Ent(D^{正常}) = 0.0488)
    若按使用年限划分:
    (Ent(D^{geq5})=-frac{3}{3}log_{2}frac{3}{3}--0log_{2}0=0)
    (Ent(D^{ geq5})=-frac{3}{5}log_{2}frac{3}{5}--frac{2}{5}log_{2}frac{2}{5}=0.9710)
    (Gain(D, 使用年限) = Ent(D) - Ent(D^{geq5})- Ent(D^{ geq5}) = 0.3475)
    (Gain(D,使用年限)>Gain(D,发动机))
    则首先按使用年限作为划分结点,可得如下决策树:
    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    由 container 一词所想到的
    突然间,firebug中不显示用console.log打印的信息了
    学习计划表-快照-2017.2.16
    学习编程让我成功减肥!
    什么是编程?
    计算两个事件之间的时间差
    使用substring和split方法从字符串中抽取一组清单
    js中十进制数转换为16进制
    Definition of success-成功的定义
    如何让老式浏览器支持html5新增的语义元素
  • 原文地址:https://www.cnblogs.com/lzping/p/12605791.html
Copyright © 2011-2022 走看看