感知器
感知器堪称最简单的神经网络,其特点如下
- 不需要学习率
- 不需要正则化
- 仅根据误差更新模型
sklearn的linear_model中提供了感知器模型,其构造函数如下
Perceptron(*, penalty=None, alpha=0.0001, l1_ratio=0.15, fit_intercept=True, max_iter=1000, tol=0.001, shuffle=True, verbose=0, eta0=1.0, n_jobs=None, random_state=0, early_stopping=False, validation_fraction=0.1, n_iter_no_change=5, class_weight=None, warm_start=False)
参数含义为
- penalty 可选 l 2 l2 l2, l 1 l1 l1, elasticnet
- alpha 当使用正则化时的正则化系数
- l1_ratio Elastic Net的混合参数。
- fit_intercept 如果为False,则假定数据已经中心化。
- max_iter 最大迭代次数
- tol 当损失小于tol时,就会停止迭代。
- shuffle 为True时,在每个epoch训练之后打乱顺序。
- verbose 为0时,为不在标准输出流输出日志信息;为1时,为输出进度条记录;为2时,为每个epoch输出一行记录
- eta0 学习率,决定梯度下降时每次参数变化的幅度
- n_jobs 调用的CPU数目
- random_state 随机数种子
- n_iter_no_change, validation_fraction, early_stopping用于控制是否提前终止训练,简单起见,这三个参数分别记作 n n n_n nn, v f v_f vf和 e s e_s es。当 e s e_s es为True时,若连续 n n n_n nn次得分不再提高,且已经完成了所有epoch的 v f v_f vf,则提前终止训练。
- class_weight 可输入balanced或者如下格式的字典:{class_label: weight},用于预设类的拟合参数。
- warm_start 暖启动,当设为True时,将使用上一次优化的结果。
测试
为了验证Perceptron的分类能力,下面生成生成1000组样本,每个样本有两个特征数,无冗余信息,且信息特征个数为1,每个类别由一组聚类组成。并且从生成样本中分别抽取一些数据,作为训练集和测试集。
from sklearn.datasets import make_classification
x,y = make_classification(n_samples=1000, n_features=2,n_redundant=0,n_informative=1,n_clusters_per_class=1)
xTrain, xTest = x[:800,:], x[800:,:]
yTrain, yTest = y[:800], y[800:]
接下来构造Perceptron,并且进行训练
from sklearn.linear_model import Perceptron
clf = Perceptron(fit_intercept=False,shuffle=False)
clf.fit(xTrain,yTrain) # 训练
print(clf.coef_) #得到训练结果,权重矩阵
print(clf.intercept_) #超平面的截距,此处输出为:[0.]
acc = clf.score(xTest,yTest) # 利用测试集进行验证
print(acc) # 得到的输出结果为0.955
最后,绘图验证分割结果
from matplotlib import pyplot as plt
import numpy as np
plt.scatter(x[:,0], x[:,1], c=y)
#画出超平面
X = np.arange(-4,4)
k = -clf.coef_[0][0] / clf.coef_[0][1]
Y = k*X - clf.intercept_
plt.plot(X,Y)
plt.show()
效果如下