基于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 保序回归算法举例
问题描述:给定一个无序数字序列,要求不改变每个元素的位置,但可以修改每个元素的值,修改后得到一个非递减序列,问如何使误差(该处取平方差)最小?
保序回归法:从该序列的首元素往后观察,一旦出现乱序现象停止该轮观察,从该乱序元素开始逐个吸收元素组成一个序列,直到该序列所有元素的平均值小于或等于下一个待吸收的元素。
举例:
原始序列:<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.15. Isotonic regression(保序回归)
1.15. Isotonic regression(保序回归) 一.描述 保序回归,正如它的名字,是一种对预测值施加了"保序"约束的一种回归分析."保序"的严格 ...
- 基于随机森林算法的糖尿病数据集回归
基于随机森林算法的糖尿病数据集回归 作者介绍 1. 随机森林算法原理 1.1决策树与Bagging 1.2 随机森林算法 2. 实验过程 2.1 糖尿病数据集 2.2 实验过程 2.3 实验结果展示 ...
- 逻辑回归算法实现鸢尾花数据集的二分类
1.介绍 前言 为了更好的理解本章内容,请参考下面的网址,自主学习一些矩阵求导运算. https://zhuanlan.zhihu.com/p/158182135机器学习约定规则: 向量对标量求导 ...
- KNN算法实现鸢尾花数据集分类
KNN算法实现鸢尾花数据集分类 作者介绍 数据集介绍 KNN算法介绍 用KNN实现鸢尾花分类 作者介绍 乔冠华,女,西安工程大学电子信息学院,2020级硕士研究生,张宏伟人工智能课题组. 研究方向:机 ...
- 感知机算法在鸢尾花数据集上的实践
感知机算法在鸢尾花数据集上的实践 1 问题背景 2 数据集的微处理 3 导数据,并进行简单可视化 4 模型算法的训练部分 1 问题背景 感知机作为一个比较经典的处理线性二分类的算法,今天想着实践一下, ...
- 数据集特征提取_基于PCA算法实现鸢尾花数据集的特征提取任务
PCA算法的必要性 多变量大数据集无疑会为研究和应用提供丰富的信息,但是许多变量之间可能存在相关性,从而增加了问题分析的复杂性.如果分别对每个指标进行分析,分析往往是孤立的,不能完全利用数据中的信息, ...
- 机器学习与深度学习——通过knn算法分类鸢尾花数据集iris求出错误率并进行可视化
什么是knn算法? KNN算法是一种基于实例的机器学习算法,其全称为K-最近邻算法(K-Nearest Neighbors Algorithm).它是一种简单但非常有效的分类和回归算法. 该算法的基本 ...
- 【基础机器学习算法原理与实现】使用感知器算法LDA、最小二乘法LSM、Fisher线性判别分析与KNN算法实现鸢尾花数据集的二分类问题
本文设计并实现了PerceptronLA.PseudoIA.LeastSM.LinearDA.KNN等五个算法类,以及DataProcessor的数据处理类.对感知器算法LDA.最小二乘法LSM的伪逆 ...
- Python原生代码实现KNN算法(鸢尾花数据集)
一.作业题目 Python原生代码实现KNN分类算法,使用鸢尾花数据集. KNN算法介绍: K最近邻(k-Nearest Neighbor,KNN)分类算法,是机器学习算法之一. 该方法的思路是:如果 ...
最新文章
- hashmap的五种便利方式
- 光流 | 基于光流法实现视觉里程计Visual Odometry(源代码)
- 高德地图-轨迹回放(二)
- C中的危险函数(缓冲区溢出)
- 如何处理大流量高并发
- python爬取万方数据库,python下载万方数据库文献
- CI -持续集成及相关概念
- 开源要安全!Linux 基金会、GitHub、GitLab、Google 联合起来了!
- 最简单的视音频播放示例5:OpenGL播放RGB/YUV
- 算法导论第三版 第1章习题答案
- 算法笔记练习 题解合集
- MATLAB图像去雾霭算法及其实现
- Unity 3D 萌萌哒三消游戏《宝石消消乐》源码
- 【毕业设计8】基于STM32的红外测距系统
- Chinese-Whisper聚类算法
- html中鼠标悬停图片变大,JavaScript通过mouseover()实现图片变大效果的示例
- 升余弦和根升余弦滤波器(SRRC,RRC)的单位脉冲响应
- 观景台售票情况数据分析【Python】
- JAVA学习 11.10
- 已知二叉树:先序和中序求后序/后序和中序求先序