基于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 保序回归算法举例

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

3. 鸢尾花数据集介绍

包含 3 类分别为山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica),共 150 条数据,每类各 50 个数据,每条记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度,通常可以通过这4个特征预测鸢尾花卉属于哪一品种。

3.1 数据集获取

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

pip install scikit-learn

接着就可以输入下面代码,下载数据集:

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

Iris数据集包含在sklearn库当中,具体在sklearn\datasets\data文件夹下,文件名为iris.csv。其数据格式如下:

4.代码实现

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 下载鸢尾花数据集并输出每个样本特征属性

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

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

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

4.4 实验结果

4.5 完整代码

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

基于Isotonic回归(保序回归算法)的鸢尾花数据集回归问题相关推荐

  1. 1.15. Isotonic regression(保序回归)

    1.15. Isotonic regression(保序回归) 一.描述 保序回归,正如它的名字,是一种对预测值施加了"保序"约束的一种回归分析."保序"的严格 ...

  2. 基于随机森林算法的糖尿病数据集回归

    基于随机森林算法的糖尿病数据集回归 作者介绍 1. 随机森林算法原理 1.1决策树与Bagging 1.2 随机森林算法 2. 实验过程 2.1 糖尿病数据集 2.2 实验过程 2.3 实验结果展示 ...

  3. 逻辑回归算法实现鸢尾花数据集的二分类

    1.介绍 前言   为了更好的理解本章内容,请参考下面的网址,自主学习一些矩阵求导运算. https://zhuanlan.zhihu.com/p/158182135机器学习约定规则: 向量对标量求导 ...

  4. KNN算法实现鸢尾花数据集分类

    KNN算法实现鸢尾花数据集分类 作者介绍 数据集介绍 KNN算法介绍 用KNN实现鸢尾花分类 作者介绍 乔冠华,女,西安工程大学电子信息学院,2020级硕士研究生,张宏伟人工智能课题组. 研究方向:机 ...

  5. 感知机算法在鸢尾花数据集上的实践

    感知机算法在鸢尾花数据集上的实践 1 问题背景 2 数据集的微处理 3 导数据,并进行简单可视化 4 模型算法的训练部分 1 问题背景 感知机作为一个比较经典的处理线性二分类的算法,今天想着实践一下, ...

  6. 数据集特征提取_基于PCA算法实现鸢尾花数据集的特征提取任务

    PCA算法的必要性 多变量大数据集无疑会为研究和应用提供丰富的信息,但是许多变量之间可能存在相关性,从而增加了问题分析的复杂性.如果分别对每个指标进行分析,分析往往是孤立的,不能完全利用数据中的信息, ...

  7. 机器学习与深度学习——通过knn算法分类鸢尾花数据集iris求出错误率并进行可视化

    什么是knn算法? KNN算法是一种基于实例的机器学习算法,其全称为K-最近邻算法(K-Nearest Neighbors Algorithm).它是一种简单但非常有效的分类和回归算法. 该算法的基本 ...

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

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

  9. Python原生代码实现KNN算法(鸢尾花数据集)

    一.作业题目 Python原生代码实现KNN分类算法,使用鸢尾花数据集. KNN算法介绍: K最近邻(k-Nearest Neighbor,KNN)分类算法,是机器学习算法之一. 该方法的思路是:如果 ...

最新文章

  1. hashmap的五种便利方式
  2. 光流 | 基于光流法实现视觉里程计Visual Odometry(源代码)
  3. 高德地图-轨迹回放(二)
  4. C中的危险函数(缓冲区溢出)
  5. 如何处理大流量高并发
  6. python爬取万方数据库,python下载万方数据库文献
  7. CI -持续集成及相关概念
  8. 开源要安全!Linux 基金会、GitHub、GitLab、Google 联合起来了!
  9. 最简单的视音频播放示例5:OpenGL播放RGB/YUV
  10. 算法导论第三版 第1章习题答案
  11. 算法笔记练习 题解合集
  12. MATLAB图像去雾霭算法及其实现
  13. Unity 3D 萌萌哒三消游戏《宝石消消乐》源码
  14. 【毕业设计8】基于STM32的红外测距系统
  15. Chinese-Whisper聚类算法
  16. html中鼠标悬停图片变大,JavaScript通过mouseover()实现图片变大效果的示例
  17. 升余弦和根升余弦滤波器(SRRC,RRC)的单位脉冲响应
  18. 观景台售票情况数据分析【Python】
  19. JAVA学习 11.10
  20. 已知二叉树:先序和中序求后序/后序和中序求先序

热门文章

  1. 57次的表白,还是不及一句“我来晚了”
  2. gauge vacuum_vacuum-gauge
  3. 【基础数据挖掘技术】探索性数据分析
  4. 硬盘分区RAW格式无法访问的解决法
  5. Ubuntu18.04 安装微信
  6. 线性代数——向量究竟是什么?
  7. NVMe固态硬盘安装Windows 7方法
  8. 注意力机制——Non-local Networks(NLNet)
  9. 训练营一期day15
  10. 二级日语词汇——副词