鸢尾花的分类

首先先导入会使用到的包

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from numpy import random
import numpy as np
import numpy.random as rd
import matplotlib.pyplot as plt
import math

然后对数据进行划分为测试集与训练集

X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target)

然后尝试打印出X_train.shape来查看其有多少特征值

print(X_train.shape)(112, 4)

可知一共有112组数据有4个特征值
再打印y_train来查看有多少中分类

print(y_train)
array([2, 1, 0, 0, 0, 2, 0, 1, 1, 1, 1, 0, 1, 1, 2, 1, 2, 1, 0, 2, 0, 0,2, 2, 1, 1, 0, 1, 2, 0, 1, 2, 2, 2, 2, 1, 0, 0, 1, 0, 1, 2, 2, 2,2, 2, 2, 0, 0, 1, 2, 1, 0, 2, 2, 0, 0, 1, 1, 2, 0, 1, 2, 0, 1, 0,0, 0, 0, 0, 2, 2, 0, 1, 1, 0, 0, 2, 2, 2, 2, 1, 2, 1, 2, 1, 0, 0,0, 0, 1, 1, 2, 2, 1, 2, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 1, 2, 1, 0,1, 0])

可知一共有三种类型 分别为0,1,2
对每一组数据我们可以通过给出对0,1,2三种类型的概率来体现出是哪种类型的鸢尾花的概率大 比如[0.25,0.2,0.55]分别表面有0.25的概率为0型的鸢尾花有0.2的概率为1型的鸢尾花有0.55的概率为2型的鸢尾花,对此我们判定其为2型的鸢尾花。但是其结果并不一定就是2型的鸢尾花,如果不是,那么我们应该是的0.55的概率尽可能的减小让正确的那个概率尽可能的变大。
我们可以使用y=kx+b y为预测的值 x为训练集 k与b为系数
y应该是112乘3的矩阵 已知x为112乘4的矩阵 b为0
y可以变化为x
k+b
所以k为4*3的矩阵
因为一开始我们并不能确定k的值的大小 所以我们可以随机生成

k,b =  np.random.rand(4,3), 0
print(k)
array([[0.31635924, 0.2329209 , 0.22559666],[0.73691415, 0.86794294, 0.37659187],[0.27317436, 0.9867018 , 0.09955569],[0.6701651 , 0.69010967, 0.78548111]])

因为y中的值表示的意思为其对应的类型的概率所以可知其>=0 且这三个值应该相加为1.但是有x*k+b所得到的y有极大的可能不满足这要求,但是我们可以通过softmax()函数来达到这要求
Sofmax()介绍:
softmax函数,又称归一化指数函数。它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。下图展示了softmax的计算方法:

softmax直白来说就是将原来输出是3,1,-3通过softmax函数一作用,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标!
以下为softmax函数的定义
def softmax(x):
return np.exp(x) / np.tile(np.sum(np.exp(x), axis=1).reshape(112, 1), 3)
有上面打印出来的y_train可知y_train的值为0,1,2 而我们输出的预测值为[?,?,?]所以我们需要将其改为1*3的形式

y_train_1=[]
for i in range(len(y_train)):if y_train[i]==0:y_train_1.append([1,0,0])if y_train[i]==1:y_train_1.append([0,1,0])if y_train[i]==2:y_train_1.append([0,0,1])

y=x*k+b得出的值是随机的 而我们应该使其变得有意义,那么就要改变k与b的值而这应该通过y与y_train_1来改变。交叉熵函数表示预测值y与y_train_1的区别的大小,即我们需要改变k,b是的交叉熵函数的值变小。其值的变小意味着误差的减小 而交叉熵函数我们将其的定义为

def Loss(y,yhat):#y与测试集 yhat 为预测值return np.mean(-1*np.sum(y*np.log(yhat)))
yhat=x*k+b 对其中的k与b分别求导得
def Loss_k(yhat,X_train,y):return np.dot(X_train.T,(yhat-y))def Loss_b(yhat,y):return np.mean(yhat-y)
而k,b通过下述公式改变:k = k + (-1) * k1 * learning_rate#k1为Loss对k求导的值b = b + (-1) * b1 * learning_rate#b1为Loss对k求导的值

接下来我们可以通过对训练集的不断尝试来使得交叉熵减少得出合适的k与b的值

learning_rate = 0.0001
epoch = 10000
min_loss = float('inf')
for e in range(epoch):yhat=softmax(np.dot(X_train,k)+b)loss = Loss(y_train_1,yhat)  b1=Loss_b(yhat,y_train_1)k1 = np.dot(X_train.T, yhat-y_train_1)    k = k + (-1) * k1 * learning_rateb = b + (-1) * b1 * learning_rate    if loss < min_loss:min_loss = lossbest_W, best_b = k, bprint("Loss updated to {} at the {}th epoch.".format(loss, e))

可以发现最开始时因为是随机的k、b所以Loss很大 而经过不断的训练Loss不断的减小。

通过一下代码打印出测试集

def maxk(y):yy=[]for i in range(len(y)):x=y[i][0]xx=0for ii in range(3):if x<y[i][ii]:x=y[i][ii]xx=iiyy.append(xx)return yy
yy=maxk(yhat)
xx=np.linspace(1,38,num=38)
plt.scatter(xx,yy)

通过以下代码打印出我们的预测值

y_test_1=[]
for i in range(len(y_test)):if y_test[i]==0:y_test_1.append([1,0,0])if y_test[i]==1:y_test_1.append([0,1,0])if y_test[i]==2:y_test_1.append([0,0,1])
y_test_1=np.array(y_test_1)
plt.scatter(xx,y_test,color='red')

通过以下代码查看两次的结果

plt.scatter(xx,y_test,color='red')
plt.scatter(xx,yy)

可以发现在38个测试中只有一个出现了错误。正确率达到了37/38

代码:`在这里插入代码片

## 标题from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from numpy import random
import numpy as np
import numpy.random as rd
import matplotlib.pyplot as plt
import math
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target)
def softmax(x):return np.exp(x) / np.tile(np.sum(np.exp(x), axis=1).reshape(112, 1), 3)
y_train_1=[]
for i in range(len(y_train)):if y_train[i]==0:y_train_1.append([1,0,0])if y_train[i]==1:y_train_1.append([0,1,0])if y_train[i]==2:y_train_1.append([0,0,1])
def Loss(y,yhat):return np.mean(-1*np.sum(y*np.log(yhat)))
def Loss_k(yhat,X_train,y):return np.dot(X_train.T,(yhat-y))
def Loss_b(yhat,y):return np.mean(yhat-y)
k,b =  np.random.rand(4,3), 0
learning_rate = 0.0001
epoch = 10000
min_loss = float('inf')
for e in range(epoch):yhat=softmax(np.dot(X_train,k)+b)#yhat=softmax(yhat)#y=np.matmul(X_train,k)+b#y1=np.argmax(y,axis=1)#print("y_hat = {} * x + {}".format(w1, w0))loss = Loss(y_train_1,yhat)  b1=Loss_b(yhat,y_train_1)k1 = np.dot(X_train.T, yhat-y_train_1)k = k + (-1) * k1 * learning_rateb = b + (-1) * b1 * learning_rateif loss < min_loss:min_loss = lossbest_W, best_b = k, bprint("Loss updated to {} at the {}th epoch.".format(loss, e))
def maxk(y):yy=[]for i in range(len(y)):x=y[i][0]xx=0for ii in range(3):if x<y[i][ii]:x=y[i][ii]xx=iiyy.append(xx)return yy
yy=maxk(yhat)   xx=np.linspace(1,38,num=38)
y_test_1=[]
for i in range(len(y_test)):if y_test[i]==0:y_test_1.append([1,0,0])if y_test[i]==1:y_test_1.append([0,1,0])if y_test[i]==2:y_test_1.append([0,0,1])
y_test_1=np.array(y_test_1)
plt.scatter(xx,y_test,color='red')
plt.scatter(xx,yy)

鸢尾花的分类三分类问题相关推荐

  1. 【基础机器学习算法原理与实现】使用感知器算法LDA、最小二乘法LSM、Fisher线性判别分析与KNN算法实现鸢尾花数据集的二分类问题

    本文设计并实现了PerceptronLA.PseudoIA.LeastSM.LinearDA.KNN等五个算法类,以及DataProcessor的数据处理类.对感知器算法LDA.最小二乘法LSM的伪逆 ...

  2. 实例:【基于逻辑回归的鸢尾花二分类和三分类问题】

    基于逻辑回归的鸢尾花二分类和三分类问题 一.问题描述及数据集获取 二.逻辑回归 1.概述 2.应用 3. LogisticRegression回归算法 4. sklearn逻辑回归API 三.代码实现 ...

  3. 【神经网络】(3) 卷积神经网络(CNN),案例:动物三分类,附python完整代码

    各位同学好,今天和大家分享一下TensorFlow2.0深度学习中卷积神经网络的案例.现在有猫.狗.熊猫图片一千张,构建卷积神经网络实现图像的分类预测. 1. 数据加载 将训练测试数据划分好后放在同一 ...

  4. 神经网络为什么可以实现分类?---三分类网络0,1,2与弹性振子力学系统

    本文制作了一个三分类的网络来分类mnist数据集的0,1,2.并同时制作了一个力学模型,用来模拟这个三分类的过程,并用这个模型解释分类的原理. 上图可以用下列方程描述 只要ωx0,ωx1,ωx2,ωx ...

  5. Atitit 图像处理和计算机视觉的分类 三部分 图像处理 图像分析 计算机视觉...

    Atitit 图像处理和计算机视觉的分类 三部分 图像处理 图像分析 计算机视觉 1.1. 按照当前流行的分类方法,可以分为以下三部分:三部分 图像处理 图像分析 计算机视觉1 1.2. 图像处理需要 ...

  6. 基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种

    基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种 ,含数据集可直接运行 完整代码下载地址:基于LSTM三分类的文本情感分 ...

  7. 机器学习——概率分类(三)高斯概率密度与混合高斯模型

    机器学习--概率分类(三)高斯概率密度与混合高斯模型 在之前的文章机器学习--概率分类(一)朴素贝叶斯模型一文中,我们主要介绍了机器学习中的概率分类问题.我们提出了简单的朴素贝叶斯模型来进行概率密度的 ...

  8. 【图像分类案例】(10) Vision Transformer 动物图像三分类,附Pytorch完整代码

    大家好,今天和各位分享一下如何使用 Pytorch 构建 Vision Transformer 网络模型,并使用 权重迁移学习方法 训练模型并预测. Vision Transformer 的原理和 T ...

  9. 三分类、五分类、CRP\SAA、六分类

    1 三分类 (1)说明简介 将白细胞分成三大类,小细胞群(淋巴细胞).中间细胞群(嗜酸细胞.嗜碱细胞及单核细胞).大细胞群(中性粒细胞). (2)检测方法        基于库尔特计数原理,以细胞体积 ...

最新文章

  1. 设计模式(19)-Observer Pattern
  2. python3.5安装教程-linux下安装python3.5.3的方式
  3. 步入DevExpress的使用(VS)
  4. asp.net2.0导出pdf文件完美解决方案
  5. Jquery中使用SweetAlert使弹窗更漂亮
  6. nginx系列之六:cache服务
  7. 1009 产生数 2002年NOIP全国联赛普及组
  8. 设计模式学习笔记(六:责任链模式)
  9. ThinkPHP 数据库操作,插入,更新,删除,查询
  10. winform DevComponents.DotNetBar2 添加到工具栏方法
  11. 【最全】latex与word之间的各种转化方法和软件汇总
  12. Swift REPL
  13. 万物皆可傅里叶|傅里叶分析之掐死教程(完整版)
  14. 正则表达式:回车和换行的区别
  15. 高等代数教材及学习指导书的推荐
  16. 【 rbx1翻译 第七章、控制移动基座】第八节、使用里程计进行往返运动
  17. 节气丨大雪至,人间至此雪盛时,岁暮天寒,顺问冬安
  18. 4、关于step的设置
  19. 【Java】JDK安装在D盘,环境变量如何配置?
  20. matlab提取车牌字符程序,如何用matlab提取和识别车牌数?

热门文章

  1. Python连接MySQL数据库(简单便捷)
  2. 精通 Pandas:6~11
  3. 实战:利用pytorch搭建VGG-16实现从数据获取到模型训练的猫狗分类网络
  4. AI绘画生成器推荐AI绘画自动生成器有哪些?
  5. 快速删除txt文本数据中的某一列
  6. 深入JVM 原理(三)JVM 垃圾收集
  7. 修改搜狗输入法的软键盘快捷键
  8. HTML5游戏开发(十)
  9. 干货分享:如何创造完整的核心游戏体验
  10. Java程序设计课程练习题(题目+答案)