感知机

类似最小二乘法的问题,感知机这里是利用误分类点来更新参数,这一点又和 SVM 类似,更新过程使用梯度下降优化算法

感知机的模型策略(损失函数)?

  • 假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练集正实例点和负实例点完全正确分开的分离超平面
  • 为了找出这样的超平面,即确定感知机模型参数 w,b ,需要确定一个学习策略,即定义(经验)损失函数并将损失函数极小化

感知机的收敛性?

  • 训练数据集线性可分时,感知机学习算法原始形式迭代是收敛的
  • 训练集线性不可分时,感知机学习算法不收敛,迭代结果会发生震荡
  • 感知机学习算法存在许多解,这些解既依赖于初值的选择,也依赖于迭代过程中误分类点的选择顺序

感知机的定义?

  • 感知机( perceptron )是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取 +1 和–1 二值
    1
    2
    3
    4
    5
    6
    7
    8
     >>> from sklearn.datasets import load_digits
    >>> from sklearn.linear_model import Perceptron
    >>> X, y = load_digits(return_X_y=True)
    >>> clf = Perceptron(tol=1e-3, random_state=0)
    >>> clf.fit(X, y)
    Perceptron()
    >>> clf.score(X, y)
    0.939...

感知机的假设空间及模型?

  • 假设空间:定义在特征空间中的所有线性分类模型或线性分类器,即函数集合 {f|f (x) = w・x+b}
  • 模型:f (x) =sign (w・x+b)

感知机的 “对偶” 学习策略?

  • 相对于感知机的 “原始” 学习策略,通过分解模型参数,学习每个样本的误分类次数来达到求解感知机的目的

感知机的 “原始” 学习(优化)算法?

  • 感知机学习算法是误分类驱动的,具体采用随机梯度下降法。首先,任意选取一个超平面,w0,b0 ,然后用梯度下降法不断地极小化目标函数(损失函数)
  • 当一个实例点被误分类,即位于分离超平面的错误一侧时,则调整 w,b 的值,使分离超平面向该误分类点的一侧移动,以减少该误分类点与超平面间的距离,直至超平面越过该误分类点使其被正确分类

在 sklearn 中,多层感知器如何应用于分类任务?

  • MLP 在两个数组上进行训练:大小为 (n_samples, n_features) 的数组 X,用于存放以浮点特征向量表示的训练样本;大小为 (n_samples, ) 的数组 y,用于存放训练样本的目标值(类标签)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     >>> from sklearn.neural_network import MLPClassifier
    >>> X = [[0., 0.], [1., 1.]]
    >>> y = [0, 1]
    >>> clf = MLPClassifier(solver='lbfgs', alpha=1e-5,
    ... hidden_layer_sizes=(5, 2), random_state=1)
    ...
    >>> clf.fit(X, y)
    MLPClassifier(alpha=1e-05, hidden_layer_sizes=(5, 2), random_state=1,
    solver='lbfgs')

    >>> clf.predict([[2., 2.], [-1., -2.]])
    array([1, 0])

    >>> [coef.shape for coef in clf.coefs_]
    [(2, 5), (5, 2), (2, 1)]

    >>> clf.predict_proba([[2., 2.], [1., 2.]])
    array([[1.967...e-04, 9.998...-01],
    [1.967...e-04, 9.998...-01]])

在 sklearn 中,多层感知器如何应用于回归任务?

  • 类 MLPRegressor 实现了一个多层感知器(MLP),它使用反向传播进行训练,输出层没有激活函数,这也可以看作是使用身份函数作为激活函数。因此,它使用平方误差作为损失函数,输出是一组连续值
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     >>> from sklearn.neural_network import MLPRegressor
    >>> from sklearn.datasets import make_regression
    >>> from sklearn.model_selection import train_test_split
    >>> X, y = make_regression(n_samples=200, random_state=1)
    >>> X_train, X_test, y_train, y_test = train_test_split(X, y,
    ... random_state=1)
    >>> regr = MLPRegressor(random_state=1, max_iter=500).fit(X_train, y_train)
    >>> regr.predict(X_test[:2])
    array([-0.9..., -7.1...])
    >>> regr.score(X_test, y_test)
    0.4...