Perceptron

本文深入探讨了感知机(Perceptron)的基本原理,它是早期的机器学习模型,属于监督学习中的一种。我们详细解析了其算法、权重更新规则以及在二分类问题中的应用。通过实例,展示了如何训练感知机模型,并讨论了其在面对非线性可分数据时的局限性。
摘要由CSDN通过智能技术生成
#导入包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#读取数据(来源UCI),设置列名,查看
iris_df=pd.read_csv('../data/iris/iris.data')
iris_df.columns=['sepal length','sepal width','petal length','petal width','class']
iris_df.head()
sepal length sepal width petal length petal width class
0 4.9 3.0 1.4 0.2 Iris-setosa
1 4.7 3.2 1.3 0.2 Iris-setosa
2 4.6 3.1 1.5 0.2 Iris-setosa
3 5.0 3.6 1.4 0.2 Iris-setosa
4 5.4 3.9 1.7 0.4 Iris-setosa
#查看数据的结构信息和统计信息
iris_df.info()
iris_df.describe().T
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 149 entries, 0 to 148
Data columns (total 5 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   sepal length  149 non-null    float64
 1   sepal width   149 non-null    float64
 2   petal length  149 non-null    float64
 3   petal width   149 non-null    float64
 4   class         149 non-null    object 
dtypes: float64(4), object(1)
memory usage: 5.9+ KB
count mean std min 25% 50% 75% max
sepal length 149.0 5.848322 0.828594 4.3 5.1 5.8 6.4 7.9
sepal width 149.0 3.051007 0.433499 2.0 2.8 3.0 3.3 4.4
petal length 149.0 3.774497 1.759651 1.0 1.6 4.4 5.1 6.9
petal width 149.0 1.205369 0.761292 0.1 0.3 1.3 1.8 2.5
#截取需要的原始数据(包含两个类别)
y=iris_df.iloc[0:99,4].values
#使用where来进行类标编码,将匹配到的类别替换为-1,其余的类别替换为1
y=np.where(y=='Iris-setosa',-1,1)
#选取花瓣长度和花萼长度来作为x
x=iris_df.iloc[0:99,[0,2]].values
#绘制第一个类别的散点图
plt.scatter(x[:49,0],x[:49,1],color='red',marker='o',label='setosa')
#绘制第二个类别的散点图
plt.scatter(x[49:99,0],x[49:99,1],color='blue',marker='x',label='setosa')
plt.xlabel('length')
plt.ylabel('width')
plt.legend(loc='upper left')
plt.show()

在这里插入图片描述

#感知机实现函数
class Perceptron:
    def __init__(self,eta=0.01,n_iter=10):
        self.eta=eta
        self.n_iter=n_iter
    def net_input(self,x):
        """
        获取净输入
        :param x: DataFrame
        :return matrix:
        """
        return np.dot(x,self.w_[1:])+self.w_[0]


    def predict(self,x):
        """
        获取二分类的预测值,0为分界
        :param x:DataFrame
        :return:
        """
        return np.where(self.net_input(x)>=0.0,1,-1)


    def fit(self,x,y):
        #初始化权重,外加一个w0,也就是阈值
        self.w_=np.zeros(1+x.shape[1])
        #保存累计迭代的错误次数
        self.errors_=[]
        #开始迭代
        for _ in range(self.n_iter):
            errors=0
            for xi,target in zip(x
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值