美文网首页机器学习
统计学习方法

统计学习方法

作者: freshchen | 来源:发表于2018-11-27 10:57 被阅读27次

    1.统计学习笔记

    久闻李航老师的这本统计学习方法的大名,苦于数学基础停留在本科期末考试70分的水平,战战兢兢,最近种草人工智能,多方研究从这本书开始再好不过了,于是硬着头皮上了,发现概念并没有非常晦涩难懂,详细的笔记没有来得及记录,下面给出两个不错的笔记的链接。

    有一定引申的笔记

    比较遵循原著的笔记

    2.算法Python实现

    实现前只作简单介绍,理解不到位的地方,求大神指点,此外入门语言是JAVA,python只知道一些基础语法,写的比较丑陋,勿喷。

    2.1感知机

    感知机(二类分类)根据已有的输入和输出(输出只有1或-1),计算得到分离超平面S(wx+b),其中w是S的法向量,b是S的截距。然后通过S对位置的输入给出预测的输出分类结果。

    2.1.1原始感知机算法

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.lines import Line2D
    
    
    def loadData():
        """
            加载数据
            eg:
            1   1   -1
            0   1   -1
            3   3   1
            4   3   1
            2   0.5 -1
            3   2   1
            4   4   1
            1   2   -1
            3   3   1
            3   4   1
            3   1   -1
            0.5 3   1
            2   2   -1
            3   1.8 -1
            1   3.5 1
            0.5 2.5 -1
        """
        data = np.loadtxt('testSet.txt')
        dataMat = data[:, 0:2]
        labelMat = data[:, 2]
        return dataMat, labelMat
    
    
    def sign(val):
        if val >= 0:
            return 1
        else:
            return -1
    
    
    def trainPerceptron(dataMat, labelMat, eta):
        """
            训练模型
            eta: learning rate(可选步)
        """
        m, n = dataMat.shape
        weight = np.zeros(n)
        bias = 0
    
        flag = True
        while flag:
            for i in range(m):
                if np.any(labelMat[i] * (np.dot(weight, dataMat[i]) + bias) <= 0):
                    weight = weight + eta * labelMat[i] * dataMat[i].T
                    bias = bias + eta * labelMat[i]
                    print("weight, bias: ", end="")
                    print(weight, end="  ")
                    print(bias)
                    flag = True
                    break
                else:
                    flag = False
    
        return weight, bias
    
    
    # 可视化展示分类结果
    def plotResult(dataMat, labelMat, weight, bias):
        fig = plt.figure()
        axes = fig.add_subplot(111)
    
        type1_x = []
        type1_y = []
        type2_x = []
        type2_y = []
        for i in range(len(labelMat)):
            if (labelMat[i] == -1):
                type1_x.append(dataMat[i][0])
                type1_y.append(dataMat[i][1])
    
            if (labelMat[i] == 1):
                type2_x.append(dataMat[i][0])
                type2_y.append(dataMat[i][1])
    
        type1 = axes.scatter(type1_x, type1_y, marker='x', s=20, c='red')
        type2 = axes.scatter(type2_x, type2_y, marker='o', s=20, c='blue')
    
        y = (0.1 * -weight[0] / weight[1] + -bias / weight[1], 4.0 * -weight[0] / weight[1] + -bias / weight[1])
        axes.add_line(Line2D((0.1, 4.0), y, linewidth=1, color='blue'))
    
        plt.xlabel('X')
        plt.ylabel('Y')
    
        plt.show()
    
    
    def _init_():
        dataMat, labelMat = loadData()
        weight, bias = trainPerceptron(dataMat, labelMat, 1)
        plotResult(dataMat, labelMat, weight, bias)
        return weight, bias
    
    

    2.1.2运行结果

    结果图

    2.2k近邻法

    k近邻法(基本分类或回归法),根据训练数据输入的对应输出,将数据进行分类。输入新的向量X时,找出已有数据的k个最靠近X的点,判断这些点中最多的类型为T,则新输入预测的对应类型为T。求最近距离时一般会用到kd树,优化检索。kd树的创建和检索过程请查看相关资料。

    2.2.1k邻近算法

    由于导入训练数据和可视化代码类似这里省略

    import numpy as np
    import matplotlib.pyplot as plt
    import operator
    
    # 根据输入测试实例进行k-近邻分类
    def classify(in_x, data_set, labels, k):
        data_set_size = data_set.shape[0]
        diff_mat = np.tile(in_x, (data_set_size, 1)) - data_set
        sq_diff_mat = diff_mat ** 2
        sq_distances = sq_diff_mat.sum(axis=1)
        distances = sq_distances ** 0.5
        sorted_dist_indicies = distances.argsort()
        class_count = {}
        for i in range(k):
            vote_ilabel = labels[sorted_dist_indicies[i]]
            class_count[vote_ilabel] = class_count.get(vote_ilabel, 0) + 1
        sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)
        return sorted_class_count[0][0]
    
    def _init_(x, k):
        dataMat, labelMat = loadData('testSet.txt')
        in_x = x
        plotResult(dataMat, labelMat, in_x)
        result = int(classify(in_x, dataMat, labelMat, k))
        return result
    
    

    2.2.2运行结果

    类别1黑色,类别2绿色,类别3黄色,新数据是红色叉叉

    结果图

    简单的测试结果如下:

    训练数据:[3,5] k值:1 结果:3

    训练数据:[3,5] k值:5 结果:2

    训练数据:[3,5] k值:15 结果:1

    相关文章

      网友评论

        本文标题:统计学习方法

        本文链接:https://www.haomeiwen.com/subject/qozwqqtx.html