目录
1 感知机简介:
感知机(Perceptron)是一种二分类的线性分类模型,它的输入为实例的特征向量,输出为实例的类别,通常是+1和-1二值。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。
2 感知机模型:
输入空间(特征空间)是,输入空间是
为其输入空间到输出空间的函数。其中
分别为权值向量和偏置.
3 感知机的学习策略:
损失函数:,其中M为误分类的个数。当样本分类正确sign(x)与y同号,而分类错误异号故在舒适函数右侧添加负号来保持损失值为正。
4 感知机的更新策略:
求解最优化问题:
随机梯度下降法求解:
选取误分类点更新:
5 感知机的操作流程图
6 感知机项目实战
数据来源:Simple Rainfall Classification Dataset (kaggle.com)
数据信息展示:
数据处理:类别变量替换:雨变为-1,晴天为+1(excle中处理替换即可),缺失值,重复值,异常值处理。
缺失值:data.fillna(data.mode(),inplace=True)#数据缺失值众数填充数据格式dataframe。
重复值:data.drop_duplicates()# 默认根据所有的列,进行删除(数据结构中,行相同的数据只保留一行)。
异常值处理:方法参照数据处理——异常值处理(箱线图,均值填充)-优快云博客
由图像可知该数据没有异常值。
分类效果(准确率即分类正确的个数比上总个数):
在temperature和humidity上平面绘制结果展示:
7 代码展示
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
import pandas as pd
plt.rcParams["font.sans-serif"] = "SimHei"#汉字乱码的解决方法
class Perceptron:
def __init__(self, lr=0.01, n_iters=10000):
self.lr = lr#学习率
self.n_iters = n_iters#迭代次数
self.weights = None#权重
self.bias = None#偏置
def sign(self, x):
return np.where(x >= 0, 1, -1) # sign函数变换
def fit(self, X, y):
n,m = X.shape#样本特征大小
# 初始化权重和偏置
self.weights = np.zeros(m)
self.bias = 0
# 梯度下降更新权重和偏置
for _ in range(self.n_iters):#迭代次数
for idx, x_i in enumerate(X):#判断次数,enumerate输出位置加数
linear_output = np.dot(x_i, self.weights) + self.bias
y_predicted = self.sign(linear_output)
if y[idx]*y_predicted<0:#误差判断异号
self.weights = self.weights+self.lr*y[idx]*X[idx] # 权重更新
self.bias = self.bias +self.lr*y[idx] # 偏置更新
return self.weights,self.bias
print(self.weights)
print(self.bias)
def predict(self, X):
linear_output = np.dot(X, self.weights) + self.bias
y_predicted = self.sign(linear_output)
return y_predicted
#数据的读取和测试集验证集的分配
data = pd.read_csv(r"C:\Users\86182\Desktop\rainfall.csv")
data.fillna(data.mode(),inplace=True)#数据缺失值众数填充
data.drop_duplicates()# 默认根据所有的列,进行删除(数据结构中,行相同的数据只保留一行)
Data=np.array(data)
Columns=data.columns
X = Data[:-1,1:-1]
X= (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))#X.min(axis=0)输出每列的最小值
y = Data[:-1, -1]
test_size = 0.2
train_size = 1 - test_size
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, train_size=train_size)#划分数据集
#模型的运行
perceptron = Perceptron(lr=0.1, n_iters=100)
perceptron.fit(X_train, y_train)
y_pred_train = perceptron.predict(X_train)
accuracy_train = np.mean(y_pred_train == y_train)
y_pred_test = perceptron.predict(X_test)
accuracy_test = np.mean(y_pred_test == y_test)
print(f"训练集准确率: {accuracy_train:.2f}")
print(f"测试集准确率: {accuracy_test:.2f}")
# # 新样本的特征向量
# x_new = np.array([0.31939469,0.2205987843])
# # 对新样本进行分类
# y_new = perceptron.predict(x_new.reshape(1, -1))
# print(f'New sample belongs to class {y_new[0]}')
#绘图
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(X_train[:, 1], X_train[:, 2], c=y_train, cmap='bwr')
x0_1 = min(X_train[:, 1])
x0_2 = max(X_train[:, 1])
x1_1 = (-perceptron.bias -perceptron.weights[1]*x0_1)/perceptron.weights[2]
x1_2 = (-perceptron.bias -perceptron.weights[1]*x0_2)/perceptron.weights[2]
ax.plot([x0_1, x0_2], [x1_1, x1_2], 'g')
ax.set_xlabel('temperature',fontsize=13) # 设置x轴名称
ax.set_ylabel('humidity',fontsize=13) # 设置y轴名称
ax.set_title("划分结果的平面投影", fontsize=15) # 标题填充,fontisize为字体大小
plt.show()
8 代码中一些函数的理解
8.1 enumerate(输出位置加数)
a = ['one', 'two']
for i, element in enumerate(a):
print(i, element)
输出:1 one 2 two