sklearn实验1——使用感知器对鸢尾花数据分类

本文介绍了使用感知器算法对鸢尾花数据集进行线性分类的方法,包括基于花萼长度和宽度以及花瓣长度和宽度的特征。通过自定义感知器模型和sklearn库进行训练,展示了不同初始权重和学习率对算法收敛及分类效果的影响,并计算了模型精度。
该文章已生成可运行项目,

1、实验原理

  • 感知器算法是最简单的可以学习的机器。感知器算法是很多更复杂算法的基础,如支持向量机和多层感知器人工神经网络。
  • 感知器算法要求样本是线性可分的,通过梯度下降法有限次的迭代后就可以收敛得到一个解。 当样本非线性时,使用感知器算法不会收敛。为了使感知器算法在样本集不是线性可分时仍能得到收敛的解,可以在梯度下降过程中让步长按照一定的规则逐渐缩小,这样就可以强制算法收敛。

2、实验内容:

  1. 读取iris鸢尾花数据集,绘制散点图展示3类鸢尾花。
  2. 使用感知器算法区分山鸢尾(setosa)和维吉尼亚鸢尾(virginica),每次只使用两个特征进行划分,分别如下:
    a: 使用花萼长度和花萼宽度两个特征
    b: 使用花瓣长度和花瓣宽度两个特征
    感知器算法的步长为 0.1,初始权重为 w=[1,1]T,w0=0w=[1,1]^T,w_0=0w=[1,1]T,w0=0
  3. 输出结果并绘制分类器图
  4. 改变步长和初始权重,观察对算法的影响

3、实验代码

  1. 导入实验会用到的相关库
# 导入实验要用到的相关库
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from matplotlib import pyplot as plt
%matplotlib inline
  1. 加载鸢尾花数据集
# 加载数据集
iris_dataset = load_iris()
  1. 使用pandas DataFrame 格式查看数据集
df = pd.DataFrame(iris_dataset.data, columns=iris_dataset.feature_names)
df['label'] = iris_dataset.target
df

在这里插入图片描述

  1. 绘制数据集的散点图矩阵
# 将数据data转换为DataFrame格式
# 利用iris_dataset.feature_names中的字符串对数据列进行标记
iris_dataframe = pd.DataFrame(iris_dataset.data, columns=iris_dataset.feature_names)
# 利用DataFrame创建散点图矩阵,参数c表示按标签target着色
grr = pd.plotting.scatter_matrix(iris_dataframe, c=iris_dataset.target, figsize=(10, 10), marker='o',hist_kwds={
   
   'bins': 50}, s=50, alpha=.8)

在这里插入图片描述
矩阵的主对角线是每个特征的直方图,其他位置为通过两两特征绘制的散点图。

  1. 取出山鸢尾(setosa)和维吉尼亚鸢尾(virginica)的数据和标签

输入:

# 实验要求使用感知器算法区分山鸢尾(Iris-setosa)和维吉尼亚鸢尾(Iris-virginica)
# 取出setosa和virginaica的数据和标签
X = iris_dataset.data[list(range(50))+list(range(100,150))]
y = iris_dataset.target[list(range(50))+list(range(100,150))]
print(X.shape)  # 查看X的形状

输出:

(100, 4)
  1. 选择特征

由于每次划分只是用两个特征,因此还需要对特征进行选择
输入:

X_a = X[:,[0,1]]    # X_a:使用花萼长度和花萼宽度两个特征;
print(X_a.shape)

X_b = X[:,[2,3]]    # X_b:使用花瓣长度和花瓣宽度两个特征。
print(X_b.shape)

输出:

(100, 2)
(100, 2)
  1. 画出数据分布
# 画出使用花萼长度和花萼宽度两个特征的点的数据的分布
plt.subplot(2, 1, 1)
plt.scatter(X_a[:50,0],X_a[:50,1], c='c',label='0')
plt.scatter(X_a[50:100,0],X_a[50:100,1], c='y', label='2')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.title('Iris-setosa and Iris-virginica')
plt.legend()
plt.<
本文章已经生成可运行项目
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值