0%

统计学习方法-感知机(Perceptron)笔记

感知机(perceptron)是二类分类的线性分类模型,属于判别模型,是支持向量机(SVM)的基础,两者都是属于监督学习的一种分类器,而后者在生物信息学处理分类问题中应用非常广泛(尤其是在生物标记物biomarker研究以及癌症预后等研究中) 感知机的学习策略是使基于误分类点到分离超平面的距离(损失函数)极小化,使用的是基于梯度下降法(理解梯度下降法)对损失函数的最优化算法(有些使用标准梯度下降来实现);因为使用的是随机梯度下降法,所以极小化过程中随机选择一个误分类点使其梯度下降;当训练数据集是线性可分时,其学习算法是收敛的,但是由于迭代随机选取误分类点而导致存在无穷多个解

为了解决存在多解的情况,使得存在唯一解,需要对分离超平面增加约束条件,从而改进为支持向量机,后者不是使用梯度下降法,而是由约束条件构造的拉格朗日函数,求偏导为0求极值点

但感知机学习算法具有简单而易于实现的优点,但容易造成过拟合,分为原始形式和对偶形式两种,两者都能求解出相同的结果

感知机的损失函数中点到超平面的距离公式的推导(自己高数忘光了,推导不出,只好看别人的了~)可看点到超平面距离公式 推导

原始形式算法步骤: * 用0(或者一个较小的输)来初始化权值w0和偏置b0 * 从训练集中选取数据(xi, yi),计算其公式判断每个点是否被正确分类 * 通过感知器学习规则来更新权值w和偏置b,迭代至所有点都被正确分类,最终获得更新的权重w和偏置b

以<统计学习方法>例2.1数据为例,代码实现如下:

import numpy as np

X = np.array([[3,3],[4,3],[1,1]])
y = np.array([[1],[1],[-1]])

class Perceptron():
    def __init__(self):
        self.weight = np.zeros((2,1))
        self.bias = 0
        self.learning_rate = 1

    def fit(self, X, y):
        a = np.dot(X, self.weight) + self.bias
        p = np.where(a <= 0)[0]

        while len(p) > 0:
            # 随机取误分类点
            # index = np.random.choice(p) 
            # 取第一个误分类点(按照书中例子)
            index = p[0]
            print(index + 1)
            self.weight += y[index] * X[index].reshape(2,1)
            self.bias += y[index]
            a = y * (np.dot(X, self.weight) + self.bias)
            p = np.where(a <= 0)[0]

        return self.weight, self.bias

p = Perceptron()
trained_w, trained_b = p.fit(X=X, y=y)

如果除了训练集外还有测试集,那么可以根据训练集获得的w和b来预测测试集从而进行分类

另外在查找R中感知机的函数时,见识到了一种搜索R函数的方法:

library(sos)
findFn("perceptron")

参考资料:
感知机和SVM的区别
理解梯度下降法
统计学习方法(感知机)

本文出自于http://www.bioinfo-scrounger.com转载请注明出处