#返回目录
感知机
- 目录
- 模型介绍
- 梯度下降法原理和代码
- sklearn实现
模型介绍
随机梯度下降算法
作用 : 求解 w, b .
- 原理

- 代码
#进行iter次迭代计算
for k in range(iter):
#对于每一个样本进行梯度下降
#李航书中在2.3.1开头部分使用的梯度下降,是全部样本都算一遍以后,统一
#进行一次梯度下降
#在2.3.1的后半部分可以看到(例如公式2.6 2.7),求和符号没有了,此时用
#的是随机梯度下降,即计算一个样本就针对该样本进行一次梯度下降。
#两者的差异各有千秋,但较为常用的是随机梯度下降。
for i in range(m):
#获取当前样本的向量
xi = dataMat[i]
#获取当前样本所对应的标签
yi = labelMat[i]
#判断是否是误分类样本
#误分类样本特诊为: -yi(w*xi+b)>=0,详细可参考书中2.2.2小节
#在书的公式中写的是>0,实际上如果=0,说明改点在超平面上,也是不正确的
if -1 * yi * (w * xi.T + b) >= 0:
#对于误分类样本,进行梯度下降,更新w和b
w = w + h * yi * xi
b = b + h * yi
#打印训练进度
print('Round %d:%d training' % (k, iter))
sklearn实现
clf = classifier的缩写
- 官方代码
在页面中间部分, Examples 部分
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)
a = clf.score(X, y)
print(a)
- 自写代码
信息特征数,冗余特征数,参考矩阵的秩
from sklearn.datasets import make_classification
from sklearn.linear_model import Perceptron
from sklearn.model_selection import train_test_split
from matplotlib import pyplot as plt
import numpy as np
n_samples = 1000
n_features = 2
random_state = 0
x,y = make_classification(n_samples=n_samples, n_features=n_features,
n_redundant=0,n_informative=1,n_clusters_per_class=1,
random_state=random_state)
#n_samples:生成样本的数量
#n_features=2:生成样本的特征数,特征数=n_informative() + n_redundant + n_repeated
#n_informative:多信息特征的个数
#n_redundant:冗余信息,informative特征的随机线性组合
#n_clusters_per_class :某一个类别是由几个cluster构成的
#训练数据和测试数据
X_train,X_test, y_train, y_test = train_test_split(x,y,test_size=0.2, random_state=0)
#正例和反例
positive_x1 = [x[i,0] for i in range(1000) if y[i] == 1]
positive_x2 = [x[i,1] for i in range(1000) if y[i] == 1]
negetive_x1 = [x[i,0] for i in range(1000) if y[i] == 0]
negetive_x2 = [x[i,1] for i in range(1000) if y[i] == 0]
#定义感知机
clf = Perceptron(fit_intercept=False,shuffle=False)
#使用训练数据进行训练
clf.fit(X_train,y_train)
#得到训练结果,权重矩阵
print(clf.coef_)
#输出为:[[1.71768691 3.53606653]]
#超平面的截距,此处输出为:[0.]
print(clf.intercept_)
#利用测试数据进行验证
acc = clf.score(X_test,y_test)
print(acc)
#画出正例和反例的散点图
plt.scatter(positive_x1,positive_x2,c='red')
plt.scatter(negetive_x1,negetive_x2,c='blue')
#画出超平面(在本例中即是一条直线)
line_x = np.arange(-4,4)
line_y = line_x * (-clf.coef_[0][0] / clf.coef_[0][1]) - clf.intercept_
plt.plot(line_x,line_y)
plt.show()
