《统计学习方法》系列(2)

  本篇对应全书第二章,讲的是感知机。感知机(perceptron)是二类分类的线性分类模型,对应于输入空间(特征空间)中将数据进行线性划分的分离超平面,属于判别模型。感知机1957年由Rosenblatt提出,是神经网络与支持向量机的基础。


1、理论讲解

1.1、感知机模型

  假设输入空间(特征空间)是 Rn X ⊆ R n ,输出空间是 ={1,1} Y = { 1 , − 1 } 。输入 x x ∈ X 表示实例的特征向量,对应于输入空间(特征空间)的点;输出 y y ∈ Y 表示实例的类别。由输入空间到输出空间的如下函数

f(x)=sign(wx+b) f ( x ) = s i g n ( w x + b )

称为感知机。其中, w w b为感知机模型参数, wRn w ∈ R n 叫作权值向量(weight vector), bR b ∈ R 叫作偏置(bias),sign是符号函数,即
sign(x)={+1,x01,x<0 s i g n ( x ) = { + 1 , x ≥ 0 − 1 , x < 0

  感知机模型的假设空间是定义在特征空间中的所有线性分类模型(linear classification model)或线性分类器(linear model),即函数集合 {f|f(x)=wx+b} { f | f ( x ) = w x + b }
  感知机有如下几何解释:线性方程
wx+b=0 w x + b = 0

对应于特征空间 Rn R n 中的一个超平面S,其中w是超平面的法向量,b是超平面的截距。这个超平面将特征空间划分为两个部分,位于两部分的点(特征向量)分别被分为正、负两类。因此,超平面S称为分离超平面(seperating hyperplane),如图所示


这里写图片描述

1.2、感知机学习策略

  为了确定感知机模型参数w,b,需要定义(经验)损失函数并将损失函数极小化。这里选择的损失函数是所有误分类点到超平面S的总距离,假设超平面S的误分类点集合为M,那么所有误分类点到超平面S的总距离为

1||w||xiMyi(wxi+b) − 1 | | w | | ∑ x i ∈ M y i ( w x i + b )

不考虑 1||w|| 1 | | w | | ,就得到感知机学习的损失函数
L(w,b)=xiMyi(wxi+b) L ( w , b ) = ∑ x i ∈ M y i ( w x i + b )

至于为什么不考虑 1||w|| 1 | | w | | ,作者没有给出进一步的解释,读者不妨阅读 参考文章1参考文章2
  感知机学习的策略是在假设空间中选取使损失函数最小的模型参数w,b,即感知机模型。

1.3、感知机学习算法

  感知机学习算法是对以下最优化问题的算法

minw,bL(w,b)=xiMyi(wxi+b) m i n w , b L ( w , b ) = ∑ x i ∈ M y i ( w x i + b )

其中,M为误分类点的集合。
  感知机学习算法是误分类驱动的,具体采用 随机梯度下降法(stochastic gradient descent)。假设误分类点集合M是固定的,那么损失函数 L(w,b) L ( w , b ) 的梯度由
wL(w,b)=xiMyixi ∇ w L ( w , b ) = − ∑ x i ∈ M y i x i

bL(w,b)=xiMyi ∇ b L ( w , b ) = − ∑ x i ∈ M y i

给出。

1.3.1、感知机学习算法的原始形式

输入:训练数据集 T={(x1,y1),(x2,y2),,(xN,yN)} T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } ,其中 xi=Rn x i ∈ X = R n yi={1,+1} y i ∈ Y = { − 1 , + 1 } i=1,2,,N i = 1 , 2 , … , N ;学习率 η(0<η1) η ( 0 < η ≤ 1 )
输出:w,b;感知机模型 f(x)=sign(wx+b) f ( x ) = s i g n ( w x + b )
(1)选取初值 w0,b0 w 0 , b 0
(2)在训练集中选取数据 (xi,yi) ( x i , y i )
(3)如果 yi(wxi+b)0 y i ( w x i + b ) ≤ 0

ww+ηyixi w ← w + η y i x i

bb+ηyi b ← b + η y i

(4)转至(2),直至训练集中没有误分类点

  这种学习算法直观上有如下解释:当一个实例点被误分类,即位于分离超平面的错误一侧时,则调整w,b的值,使分离超平面向该误分类点的一侧移动,以减少该误分类点与超平面的距离,直至超平面越过该分类点使其被正确分类。
  感知机学习算法由于采用不同的初值或选取不同的误分类点,解可以不同。

1.3.2、感知机学习算法的对偶形式

输入:训练数据集 T={(x1,y1),(x2,y2),,(xN,yN)} T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } ,其中 xi=Rn x i ∈ X = R n yi={1,+1} y i ∈ Y = { − 1 , + 1 } i=1,2,,N i = 1 , 2 , … , N ;学习率 η(0<η1) η ( 0 < η ≤ 1 )
输出: α,b α , b ;感知机模型 f(x)=sign(Nj=1αjyjxjx+b) f ( x ) = s i g n ( ∑ j = 1 N α j y j x j x + b )
其中, α=(α1,α2,,αN) α = ( α 1 , α 2 , … , α N ) .
(1) α0,b0 α ← 0 , b ← 0
(2)在训练集中选取数据 (xi,yi) ( x i , y i )
(3)如果 yi(Nj=1αjyjxjxi+b)0 y i ( ∑ j = 1 N α j y j x j x i + b ) ≤ 0

αiαi+η α i ← α i + η

bb+ηyi b ← b + η y i

(4)转至(2)直到没有误分类数据

  对偶形式中训练实例仅以内积的形式出现,为了方便,可以预先将训练集中实例间的内积计算出来并以矩阵形式存储,这个矩阵就是所谓的Gram矩阵(Gram matrix)

G=[xixj]N×N G = [ x i x j ] N × N

1.3.3、总结

  当训练数据集线性可分时,感知机学习算法是收敛的;否则,感知机学习算法不收敛,迭代结果会发生震荡。

2、代码实现

2.1、手工实现

from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from random import shuffle
from sklearn.model_selection import train_test_split


class Perceptron:
        def __init__(self, X_train, y_train, lr = 0.1):
                self.X_train = X_train
                self.y_train = y_train
                self.w = np.zeros(self.X_train.shape[1])
                self.b = 0
                self.lr = lr

        def fit(self):
                iter_flag = True
                while iter_flag:
                        train_set = zip(self.X_train, self.y_train)
                        shuffle(train_set)
                        for X_i, y_i in train_set:
                                if y_i * (np.dot(self.w, X_i) + self.b) <= 0:
                                        self.w += self.lr * np.dot(X_i, y_i)
                                        self.b += self.lr * y_i
                                        break
                        else:
                                iter_flag = False

                print "Perceptron OK!"

        def predict(self, X_test):
                label_list = []
                for X in X_test:
                        label = np.sign(np.dot(self.w, X) + self.b)
                        label = label if label else -1
                        label_list.append(label)
                return np.array(label_list)

        def score(self, X_test, y_test):
                total_num = len(X_test)
                pre = (self.predict(X_test) == y_test).sum()
                score = pre/total_num
                return score


if __name__ == "__main__":
        iris = load_iris()
        X = iris.data[:100, :2]
        y = iris.target[:100]
        y[y == 0] = -1
        xlabel = iris.feature_names[0]
        ylabel = iris.feature_names[1]

        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

        X_0 = X_train[y_train == -1]
        X_1 = X_train[y_train == 1]

        plt.figure("perceptron-mine")
        plt.scatter(X_0[:, 0], X_0[:, 1], label = '-1')
        plt.scatter(X_1[:, 0], X_1[:, 1], label = '1')
        plt.xlabel(xlabel)
        plt.ylabel(ylabel)
        plt.legend()

        clf = Perceptron(X, y)
        clf.fit()
        score = clf.score(X_test, y_test)
        print "score : %s" % score

        y_pre = clf.predict(X_test)
        X_test_pre_0 = X_test[y_pre == -1]
        X_test_pre_1 = X_test[y_pre == 1]
        plt.scatter(X_test_pre_0[:, 0], X_test_pre_0[:, 1], color = 'r', label = 'pre -1')
        plt.scatter(X_test_pre_1[:, 0], X_test_pre_1[:, 1], color = 'k', label = 'pre 1')
        plt.legend()


        X_simul = np.arange(4, 8)
        y_simul = -(clf.w[0] * X_simul + clf.b)/clf.w[1]
        plt.plot(X_simul, y_simul, color = 'g', label = 'model')
        plt.legend()
        plt.show()

2.2、sklearn实现

from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.linear_model import Perceptron
from sklearn.model_selection import train_test_split


if __name__ == "__main__":
        iris = load_iris()
        X = iris.data[:100, :2]
        y = iris.target[:100]
        y[y == 0] = -1
        xlabel = iris.feature_names[0]
        ylabel = iris.feature_names[1]

        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

        X_0 = X_train[y_train == -1]
        X_1 = X_train[y_train == 1]

        plt.figure("perceptron-sklearn")
        plt.scatter(X_0[:, 0], X_0[:, 1], label = '-1')
        plt.scatter(X_1[:, 0], X_1[:, 1], label = '1')
        plt.xlabel(xlabel)
        plt.ylabel(ylabel)
        plt.legend()

        clf = Perceptron(max_iter = 1000)
        clf.fit(X, y)
        score = clf.score(X_test, y_test)
        print "score : %s" % score

        y_pre = clf.predict(X_test)
        X_test_pre_0 = X_test[y_pre == -1]
        X_test_pre_1 = X_test[y_pre == 1]
        plt.scatter(X_test_pre_0[:, 0], X_test_pre_0[:, 1], color = 'r', label = 'pre -1')
        plt.scatter(X_test_pre_1[:, 0], X_test_pre_1[:, 1], color = 'k', label = 'pre 1')
        plt.legend()

        X_simul = np.arange(4, 8)
        y_simul = -(clf.coef_[0, 0] * X_simul + clf.intercept_)/clf.coef_[0, 1]
        plt.plot(X_simul, y_simul, color = 'g', label = 'model')
        plt.legend()
        plt.show()

代码已上传至github:https://github.com/xiongzwfire/statistical-learning-method


参考文献

[1] http://blog.csdn.net/lyg1112/article/details/52572405
[2] https://github.com/wzyonggege/statistical-learning-method
以上为本文的全部参考文献,对原作者表示感谢。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Matlab统计学习工具包是一套提供统计学习算法和工具函数的工具包。它集成了许多强大的统计学习算法,如分类、回归、聚类等。通过使用Matlab统计学习工具包,研究者和工程师可以更轻松地进行统计学习领域的研究与应用。 Matlab统计学习工具包提供了丰富的函数接口,使用户可以方便地进行模型建立、参数估计和模型预测等操作。它支持各种经典的统计学习算法,包括支持向量机(SVM)、朴素贝叶斯分类器、决策树、随机森林等。用户可以根据自己的需求选择不同的算法进行模型训练和预测,从而实现针对不同问题的定制化解决方案。 除了统计学习算法,Matlab统计学习工具包还提供了丰富的数据处理和特征工程函数。用户可以使用这些函数对数据进行预处理、特征选择、特征提取等操作,从而提高模型的性能和准确度。此外,Matlab统计学习工具包还支持模型评估和交叉验证功能,用户可以通过交叉验证来评估模型的泛化性能和稳定性。 Matlab统计学习工具包的优点是简单易用和高效性能。它提供了简洁明了的函数接口和丰富的示例代码,使得用户能够快速入门和上手。同时,它还充分利用了Matlab的并行计算和矩阵运算优势,能够在处理大规模数据时保持较高的效率。 总结来说,Matlab统计学习工具包是一款功能强大的统计学习工具,提供了丰富的算法和函数,方便用户进行统计学习模型的建立、训练和预测等操作。它的简单易用和高效性能使得用户能够更好地进行统计学习研究和应用。 ### 回答2: MATLAB统计学习工具包是MATLAB软件中提供的一套用于统计学习的工具集合。它为用户提供了一系列用于数据分析、模型拟合、分类、回归、聚类等任务的函数和算法。统计学习是指利用统计方法和机器学习算法来分析数据并进行预测和推断的过程。 MATLAB统计学习工具包中包含了许多常用的统计学习算法,例如线性回归、逻辑回归、支持向量机、决策树等。用户可以通过调用这些函数和算法来构建自己的模型,并对数据进行分析和预测。这些算法都经过优化和调试,可以提供较高的计算效率和准确性。 与其他统计学习工具相比,MATLAB统计学习工具包具有以下优点。首先,MATLAB是一种功能强大的编程语言,用户可以使用其灵活的脚本语言和图形用户界面来进行数据处理和分析。其次,MATLAB统计学习工具包具有丰富的可视化功能,可以帮助用户更直观地理解数据并分析结果。此外,MATLAB还提供了丰富的文档和示例代码,帮助用户快速上手并进行统计学习的实践。 MATLAB统计学习工具包适用于各种领域的数据分析和建模任务,例如金融、医疗、工程等。可以利用MATLAB的统计学习工具包来解决实际问题,例如预测股票价格、分析疾病风险、识别图像对象等。因此,MATLAB统计学习工具包被广泛应用于学术界和工业界,为研究者和工程师提供了一个强大的工具。 ### 回答3: Matlab统计学习工具包(Matlab Statistics and Machine Learning Toolbox)是MathWorks公司为Matlab用户提供的专业统计学习工具。它包含了一系列强大的函数和工具箱,用于数据处理、统计分析、机器学习和深度学习等领域。 Matlab统计学习工具包提供了丰富的统计学习算法和技术,例如线性回归、逻辑回归、决策树、支持向量机、随机森林、神经网络等。这些算法可以用于许多应用领域,如预测分析、分类、聚类、异常检测、特征选择等。用户可以根据自己的需求选择合适的算法,并灵活地进行参数设置和模型训练。 除了传统的统计学习算法,Matlab统计学习工具包还支持深度学习方法。用户可以使用深度学习网络进行图像处理、语音识别、自然语言处理等任务。工具包提供了现代深度学习框架,如卷积神经网络(CNN)、循环神经网络(RNN)和生成对抗网络(GAN),用户可以构建、训练和评估复杂的深度学习模型。 另外,Matlab统计学习工具包还提供了数据预处理、特征工程、模型评估和可视化等功能。用户可以使用工具包的函数和工具进行数据清洗、转换、缺失值处理等预处理任务。在模型评估方面,用户可以使用交叉验证(cross-validation)和指标评估等方法,评估模型的性能和准确度。此外,工具包还提供了丰富的可视化函数,可以帮助用户直观地理解和展示数据、模型和结果。 总之,Matlab统计学习工具包是一个功能强大、灵活易用的统计学习工具,为用户提供了一站式的解决方案。无论是从事学术研究、工程应用还是数据分析工作,用户都可以利用该工具包实现高效、精确和可视化的统计学习分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值