感知机(Perceptron)python代码不调用包

目录

1 感知机简介:

2 感知机模型:

3 感知机的学习策略:

4 感知机的更新策略:

5 感知机的操作流程图

6 感知机项目实战

7 代码展示

8 代码中一些函数的理解

8.1 enumerate(输出位置加数)


1 感知机简介:

        感知机(Perceptron)是一种二分类的线性分类模型,它的输入为实例的特征向量,输出为实例的类别,通常是+1和-1二值。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。

2 感知机模型:

      输入空间(特征空间)是x\subseteq R^{n},输入空间是y=\left (+1 ,-1\right )f(x)=sign(w\cdot x+b)为其输入空间到输出空间的函数。其中w,b分别为权值向量和偏置.

if\; \; \;\; x\geq 0,sign(x)=+1

if\; \; \; \; x< 0,sign(x)=-1

3 感知机的学习策略:

        损失函数:\sum L(w,b)=-\sum_{x_{i}\in M}y_{i}(w\cdot x_{i}+b),其中M为误分类的个数。当样本分类正确sign(x)与y同号,而分类错误异号故在舒适函数右侧添加负号来保持损失值为正。

4 感知机的更新策略:

       求解最优化问题:

\min_{w,b}L(x,b)=-\sum_{x_{i}\in M}y_{i}(w\cdot x_{i}+b)

       随机梯度下降法求解:

\bigtriangledown _{w}=L(w,b)=-\sum_{x\in M}y_{i}x_{i}

\bigtriangledown _{b}=L(w,b)=-\sum_{x\in M}y_{i}

       选取误分类点更新:

w=w+\eta y_{i}x_{i}\; \; \; \; \; \; b=b+\eta y_{i}

5 感知机的操作流程图

6 感知机项目实战

        数据来源:Simple Rainfall Classification Dataset (kaggle.com)

        数据信息展示:

        数据处理:类别变量替换:雨变为-1,晴天为+1(excle中处理替换即可),缺失值,重复值,异常值处理。

        缺失值:data.fillna(data.mode(),inplace=True)#数据缺失值众数填充数据格式dataframe。

        重复值:data.drop_duplicates()# 默认根据所有的列,进行删除(数据结构中,行相同的数据只保留一行)。

        异常值处理:方法参照数据处理——异常值处理(箱线图,均值填充)-CSDN博客

       由图像可知该数据没有异常值。

       分类效果(准确率即分类正确的个数比上总个数):

       在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

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值