感知器算法

import numpy as np
import pandas as pd
data = pd.read_csv("iris.csv")
data.head()
#删除不需要的列和重复数据
data.drop("id",axis = 1,inplace=True)
data.drop_duplicates(inplace=True)
#之所以映射为1与-1,而不是之前的0,1,2,是因为感知器的预测结果为-1 和 1
data['Species'] = data['Species'].map({'Iris-versicolor':0,'Iris-virginica':1,'Iris-setosa':-1})
#只保留值为-1和1的级别
data = data[data['Species'] != 0]
class Perception:
    """使用Python实现感知器算法,实现二分类"""
    def __init__(self,alpha,times):
        """初始化方法
        Parameters:
        ----
        alpha: float
            学习率
        times:int
            最大迭代次数
        """
        self.alpha = alpha
        self.times = times
    def step(self,z):
        """阶跃函数
        Parameters
        ----
        z:数组类型(或者标量类型)
            阶跃函数的参数。根据z的值,返回1或-1(这样可以实现二分类)
        Returns
        ----
        result:int
            如果z>=0,返回1,否则返回-1
        """
        return np.where(z >= 0,1,-1)
    
    def fit(self,X,y):
        """根据提供的训练数据,对模型进行训练
        Parameters
        ----
        X:类数组类型,形状[样本数量,特征数量]
            待训练的样本数据
        y:类数组类型,形状[样本数量]
            每个样本的目标值(分类)
        """
        X = np.asarray(X)
        y = np.asarray(y)
        #创建权重的向量,初始值为0,长度比特征值多1,多出来的为解决
        self.w_ = np.zeros(1 + X.shape[1])
        #创建损失列表,用来保存每次迭代后的损失值
        self.loss_ = []
        #循环指定的次数
        for i in range(self.times):
            #感知器与逻辑回归的区别,逻辑回归中,使用所有样本计算梯度,然后更新权重,
            #而感知器中,是使用单个样本依次计算梯度,更新权重
            loss = 0
            for x,target in zip(X,y):
                y_hat =self.step(np.dot(x,self.w_[1:]) + self.w_[0])
                #当y_hat == target是,loss + 1 ,否则 loss += 0
                loss += y_hat != target
                #更新权重,更新公式:w(j) = w(j) + 学习率 * (真实值 - 预测值) * x(j)
                self.w_[0] += self.alpha * (target - y_hat)
                self.w_[1:] += self.alpha * (target - y_hat) * x
                #将循环中累计的误差值增加到误差列表中
                self.loss_.append(loss)
    def predict(self,X):
        """根据参数传递的样本,对样本数据进行预测。(1 或 -1)
        Parameters
        ----
        X:类数组类型,形状为[样本数量,特征数量]
            带预测的样本特征
        
        Returns
        ----
        result : 数组类型
            预测的结果值(分类值 1 或 -1)
        """
#         X = np.asarray(X)
        return self.step(np.dot(X,self.w_[1:]) + self.w_[0])
t1 = data[data['Species'] == 1]
t2 = data[data['Species'] == -1]

t1 = t1.sample(len(t1),random_state = 0)
t2 = t2.sample(len(t2),random_state = 0)

train_X = pd.concat([t1.iloc[:40,:-1],t2.iloc[:40,:-1]],axis = 0)
train_y = pd.concat([t1.iloc[:40,-1],t2.iloc[:40,-1]],axis = 0)
test_X = pd.concat([t1.iloc[40:,:-1],t2.iloc[40:,:-1]],axis = 0)
test_y = pd.concat([t1.iloc[40:,-1],t2.iloc[40:,-1]],axis = 0)

pe = Perception(alpha=0.1,times = 10)
pe.fit(train_X,train_y)
result = pe.predict(test_X)
display(result)
display(test_y.values)
display(pe.loss_)
#对计算结果进行可视化展示
import matplotlib as mpl
import matplotlib.pyplot as plt
#设置matplotlib 支持中文显示
mpl.rcParams['font.family'] = 'SimHei' #设置字体为黑体
mpl.rcParams['axes.unicode_minus'] = False #设置在中文字体是能够正常显示负号(“-”)

#设置画布大小
plt.figure(figsize=(8,8))
#绘制预测值
plt.plot(result,"ro",ms = 15,label="预测值")
plt.plot(test_y.values,"go",label="真实值")
plt.title("逻辑回归")
plt.xlabel("样本序号")
plt.ylabel("类别")
plt.legend()
plt.show()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值