热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

运用Isotonic回归算法解决鸢尾花数据集中的回归挑战

本文探讨了利用Isotonic回归算法解决鸢尾花数据集中的回归问题。首先介绍了Isotonic回归的基本原理及其在保持单调性方面的优势,并通过具体示例说明其应用方法。随后详细描述了鸢尾花数据集的特征和获取途径,最后展示了如何将Isotonic回归应用于该数据集,以实现更准确的预测结果。

基于Isotonic回归的鸢尾花数据集回归问题

  • 1. 作者介绍
  • 2.保序回归算法
    • 2.1 算法原理
    • 2.2 保序回归算法举例
  • 3. 鸢尾花数据集介绍
    • 3.1 数据集获取
  • 4.代码实现
      • 4.1 导入需要的包
      • 4.2 下载鸢尾花数据集并输出每个样本特征属性
      • 4.3 利用PCA降维并调用保序回归
      • 4.4 实验结果
      • 4.5 完整代码


1. 作者介绍

刘静,女,西安工程大学电子信息学院,2021级硕士研究生
研究方向:机器视觉与人工智能
电子邮件:2350588223@qq.com

孟莉苹,女,西安工程大学电子信息学院,2021级硕士研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:2425613875@qq.com

2.保序回归算法

2.1 算法原理

保序回归是回归算法的一种。保序回归给定一个有限的实数集合 Y=y1,y2,……yn代表观察到的响应,以及X=x1,x2,……xn代表未知的响应值,训练一个模型来最小化下列方程:

在这里插入图片描述

其中x1≤x2≤⋯≤xn ,wi为权重是正值。其结果方程称为保序回归,而且其解是唯一的。它可以被视为有顺序约束下的最小二乘法问题。实际上保序回归在拟合原始数据点时是一个单调函数。我们实现池旁者算法,它使用并行保序回归。训练数据是DataFrame格式,包含标签、特征值以及权重三列。另外保序算法还有一个参数名为isotonic,其默认值为真,它指定保序回归为保序(单调递增)或者反序(单调递减)。

2.2 保序回归算法举例

问题描述:给定一个无序数字序列,要求不改变每个元素的位置,但可以修改每个元素的值,修改后得到一个非递减序列,问如何使误差(该处取平方差)最小?
保序回归法:从该序列的首元素往后观察,一旦出现乱序现象停止该轮观察,从该乱序元素开始逐个吸收元素组成一个序列,直到该序列所有元素的平均值小于或等于下一个待吸收的元素。
举例:
原始序列&#xff1a;<9, 10, 14>
结果序列&#xff1a;<9, 10, 14>
分析&#xff1a;从9往后观察&#xff0c;到最后的元素14都未发现乱序情况&#xff0c;不用处理。
原始序列&#xff1a;<9, 14, 10>
结果序列&#xff1a;<9, 12, 12>
分析&#xff1a;从9往后观察&#xff0c;观察到14时发生乱序&#xff08;14>10&#xff09;&#xff0c;停止该轮观察转入吸收元素处理&#xff0c;吸收元素10后子序列为<14, 10>&#xff0c;取该序列所有元素的平均值得12&#xff0c;故用序列<12, 12>替代<14, 10>。吸收10后已经到了最后的元素&#xff0c;处理操作完成。
原始序列&#xff1a;<14, 9, 10, 15>
结果序列&#xff1a;<11, 11, 11, 15>
分析&#xff1a;从14往后观察&#xff0c;观察到9时发生乱序&#xff08;14>9&#xff09;&#xff0c;停止该轮观察转入吸收元素处理&#xff0c;吸收元素9后子序列为<14, 9>。求该序列所有元素的平均值得12.5&#xff0c;由于12.5大于下个带吸收的元素10&#xff0c;所以再吸收10&#xff0c;得序列<14, 9, 10>。求该序列所有元素的平均值得11&#xff0c;由于11小于下个带吸收的元素15&#xff0c;所以停止吸收操作&#xff0c;用序列<11, 11, 11>替代<14, 9, 10>。

3. 鸢尾花数据集介绍

包含 3 类分别为山鸢尾&#xff08;Iris-setosa&#xff09;、变色鸢尾&#xff08;Iris-versicolor&#xff09;和维吉尼亚鸢尾&#xff08;Iris-virginica&#xff09;&#xff0c;共 150 条数据&#xff0c;每类各 50 个数据&#xff0c;每条记录都有 4 项特征&#xff1a;花萼长度、花萼宽度、花瓣长度、花瓣宽度&#xff0c;通常可以通过这4个特征预测鸢尾花卉属于哪一品种。
在这里插入图片描述

3.1 数据集获取

首先要在自己的Python环境中下载sklearn(进入个人虚拟环境并输入):

pip install scikit-learn

接着就可以输入下面代码&#xff0c;下载数据集&#xff1a;

from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

Iris数据集包含在sklearn库当中&#xff0c;具体在sklearn\datasets\data文件夹下&#xff0c;文件名为iris.csv。其数据格式如下&#xff1a;
在这里插入图片描述

4&#xff0e;代码实现

4.1 导入需要的包

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from sklearn.linear_model import LinearRegression
from sklearn.isotonic import IsotonicRegression
import pandas as pd
from sklearn.utils import check_random_state

4.2 下载鸢尾花数据集并输出每个样本特征属性

#然后以字典的形式加载鸢尾花数据集&#xff0c;使用y表示数据集中的标签&#xff0c;使用x表示数据集中的属性数据。
data &#61; load_iris()
y &#61; data.target
x &#61; data.data
np.random.seed(5)
centers &#61; [[1, 1], [-1, -1], [1, -1]] #鸢尾花数据集输出每个样本的特征属性值
tt &#61; pd.DataFrame(data&#61;data.data, columns&#61;data.feature_names) #将数据集数据转换成panda
tt[&#39;species&#39;] &#61; data.target #把鸢尾花类型加入到数据集中
data &#61; tt
data.rename(columns&#61;{&#39;sepal length (cm)&#39;:"萼片长","sepal width (cm)":"萼片宽","petal length (cm)":"花瓣长","petal width (cm)":"花瓣宽","species":"种类"},inplace&#61;True)
kind_dict &#61; {0:"Setosa",1:"Versicolour",2:"Virginica"
}
data["种类"] &#61; data["种类"].map(kind_dict)
data.head()
print(data.head(150))

在这里插入图片描述

4.3 利用PCA降维并调用保序回归

#调用PCA算法进行降维主成分分析
#指定主成分个数&#xff0c;即降维后数据维度&#xff0c;降维后的数据保存在reduced_x中。
pca &#61; PCA(n_components&#61;1)
reduced_x &#61; pca.fit_transform(x)
x &#61; reduced_x.flatten()#Fit IsotonicRegression and LinearRegression models
ir &#61; IsotonicRegression()
y_ &#61; ir.fit_transform(x, y)
lr &#61; LinearRegression()
lr.fit(x[:, np.newaxis], y) # x needs to be 2d for LinearRegression
#Plot result
segments &#61; [[[i, y[i]], [i, y_[i]]] for i in range(150)]
lc &#61; LineCollection(segments, zorder&#61;0)
lc.set_array(np.ones(len(y)))
lc.set_linewidths(np.full(150, 0.5))
fig, (ax0, ax1) &#61; plt.subplots(ncols&#61;2, figsize&#61;(10, 6))
ax0.plot(x, y, &#39;r.&#39;, markersize&#61;12)
ax0.plot(x, y_, &#39;b.-&#39;, markersize&#61;12)
ax0.plot(x, lr.predict(x[:, np.newaxis]), &#39;c-&#39;)
ax0.add_collection(lc)
ax0.legend((&#39;Data&#39;,&#39;Isotonic Fit&#39;,&#39;Linear fit&#39;), loc&#61;&#39;lower right&#39;)
ax0.set_title(&#39;Isotonic regression&#39;)x_test&#61;np.linspace(-10,100,1000)
ax1.plot(x_test,ir.predict(x_test),&#39;b-&#39;)
ax1.plot(ir.X_thresholds_, ir.y_thresholds_, &#39;b.&#39;, markersize&#61;12)
ax1.set_title("Prediction function (%d thresholds)" % len(ir.X_thresholds_))
plt.show()
correct &#61; 0
for i in range(150):if y_[i] < 2 and y_[i] > 1:y[i] &#61; 3if y[i] &#61;&#61; int(y_[i]):correct &#61; correct&#43;1
print(correct/150*100,"%")

4.4 实验结果

在这里插入图片描述

4.5 完整代码

#导入鸢尾花数据集&#xff0c;调用matplotlib包用于数据的可视化&#xff0c;并加载PCA算法包。
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_irisimport numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from sklearn.linear_model import LinearRegression
from sklearn.isotonic import IsotonicRegression
import pandas as pd
from sklearn.utils import check_random_state#然后以字典的形式加载鸢尾花数据集&#xff0c;使用y表示数据集中的标签&#xff0c;使用x表示数据集中的属性数据。
data &#61; load_iris()
y &#61; data.target
x &#61; data.data
np.random.seed(5)
centers &#61; [[1, 1], [-1, -1], [1, -1]] #鸢尾花数据集输出每个样本的特征属性值
tt &#61; pd.DataFrame(data&#61;data.data, columns&#61;data.feature_names) #将数据集数据转换成panda
tt[&#39;species&#39;] &#61; data.target #把鸢尾花类型加入到数据集中
data &#61; tt
data.rename(columns&#61;{&#39;sepal length (cm)&#39;:"萼片长","sepal width (cm)":"萼片宽","petal length (cm)":"花瓣长","petal width (cm)":"花瓣宽","species":"种类"},inplace&#61;True)
kind_dict &#61; {0:"Setosa",1:"Versicolour",2:"Virginica"
}
data["种类"] &#61; data["种类"].map(kind_dict)
data.head()
print(data.head(150))#调用PCA算法进行降维主成分分析
#指定主成分个数&#xff0c;即降维后数据维度&#xff0c;降维后的数据保存在reduced_x中。
pca &#61; PCA(n_components&#61;1)
reduced_x &#61; pca.fit_transform(x)
x &#61; reduced_x.flatten()#Fit IsotonicRegression and LinearRegression models
ir &#61; IsotonicRegression()
y_ &#61; ir.fit_transform(x, y)
lr &#61; LinearRegression()
lr.fit(x[:, np.newaxis], y) # x needs to be 2d for LinearRegression
#Plot result
segments &#61; [[[i, y[i]], [i, y_[i]]] for i in range(150)]
lc &#61; LineCollection(segments, zorder&#61;0)
lc.set_array(np.ones(len(y)))
lc.set_linewidths(np.full(150, 0.5))
fig, (ax0, ax1) &#61; plt.subplots(ncols&#61;2, figsize&#61;(10, 6))
ax0.plot(x, y, &#39;r.&#39;, markersize&#61;12)
ax0.plot(x, y_, &#39;b.-&#39;, markersize&#61;12)
ax0.plot(x, lr.predict(x[:, np.newaxis]), &#39;c-&#39;)
ax0.add_collection(lc)
ax0.legend((&#39;Data&#39;,&#39;Isotonic Fit&#39;,&#39;Linear fit&#39;), loc&#61;&#39;lower right&#39;)
ax0.set_title(&#39;Isotonic regression&#39;)x_test&#61;np.linspace(-10,100,1000)
ax1.plot(x_test,ir.predict(x_test),&#39;b-&#39;)
ax1.plot(ir.X_thresholds_, ir.y_thresholds_, &#39;b.&#39;, markersize&#61;12)
ax1.set_title("Prediction function (%d thresholds)" % len(ir.X_thresholds_))
plt.show()
correct &#61; 0
for i in range(150):if y_[i] < 2 and y_[i] > 1:y[i] &#61; 3if y[i] &#61;&#61; int(y_[i]):correct &#61; correct&#43;1
print(correct/150*100,"%")


推荐阅读
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文介绍了在安装或运行 Python 项目时遇到的 'ModuleNotFoundError: No module named setuptools_rust' 错误,并提供了解决方案。 ... [详细]
  • 离线环境下的Python及其第三方库安装指南
    在项目开发中,有时会遇到电脑只能连接内网或完全无法联网的情况。本文将详细介绍如何在这种环境下安装Python及其所需的第三方库,确保开发工作的顺利进行。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 在学习网页爬虫时,使用Selenium进行自动化操作。初次安装selenium模块后,第二天运行代码时遇到了ImportError:无法从'selenium'导入名称'webdriver'。本文将详细解释该问题的原因及解决方案。 ... [详细]
  • 本文详细介绍了如何使用Python编写爬虫程序,从豆瓣电影Top250页面抓取电影信息。文章涵盖了从基础的网页请求到处理反爬虫机制,再到多页数据抓取的全过程,并提供了完整的代码示例。 ... [详细]
  • 本文介绍如何使用 Python 编写程序,检查给定列表中的元素是否形成交替峰值模式。我们将探讨两种不同的方法来实现这一目标,并提供详细的代码示例。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 本文详细解析了如何使用Python语言在STM32硬件平台上实现高效的编程和快速的应用开发。通过具体的代码示例,展示了Python简洁而强大的特性。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 在Python开发过程中,随着项目数量的增加,不同项目依赖于不同版本的库,容易引发依赖冲突。为了避免这些问题,并保持开发环境的整洁,可以使用Virtualenv和Virtualenvwrapper来创建和管理多个隔离的Python虚拟环境。 ... [详细]
author-avatar
锦瑟刻下两段缠绵
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有