kennard-stone算法实现样本集划分(ks算法)

目录

一、 Kennard-Stone算法原理(KS算法)

二、Kennard-Stone算法作用

三、代码

四、对选出来的train样本使用T-SNE算法进行绘制

五、参考链接


一、 Kennard-Stone算法原理(KS算法)

KS算法原理:把所有的样本都看作训练集候选样本,依次从中挑选样本进训练集。首先选择欧氏距离最远的两个样本进入训练集,其后通过计算剩下的每一个样品到训练集内每一个已知样品的欧式距离,找到距已选样本最远以及最近的两个样本,并将这两个样本选入训练集,重复上述步骤直到样本数量达到要求。

欧式距离计算公式:

Xp,Xq表示两个不同的样本,N代表样本的光谱波点数量

二、Kennard-Stone算法作用

Kennard-Stone算法作用:用于数据集的划分,使用算法,将输入的数据集划分为训练集、测试集,并同时输出训练集和测试集在原样本集中的编号信息,方便样本的查找。

三、代码

版本1、返回样本索引

# select samples using Kennard-Stone algorithm
import numpy as np# --- input ---
# X : dataset of X-variables (samples x variables)
# k : number of samples to be selected
#
# --- output ---
# selected_sample_numbers : selected sample numbers (training data)
# remaining_sample_numbers : remaining sample numbers (test data)def kennardstonealgorithm(x_variables, k):x_variables = np.array(x_variables)original_x = x_variablesdistance_to_average = ((x_variables - np.tile(x_variables.mean(axis=0), (x_variables.shape[0], 1))) ** 2).sum(axis=1)max_distance_sample_number = np.where(distance_to_average == np.max(distance_to_average))max_distance_sample_number = max_distance_sample_number[0][0]selected_sample_numbers = list()selected_sample_numbers.append(max_distance_sample_number)remaining_sample_numbers = np.arange(0, x_variables.shape[0], 1)x_variables = np.delete(x_variables, selected_sample_numbers, 0)remaining_sample_numbers = np.delete(remaining_sample_numbers, selected_sample_numbers, 0)for iteration in range(1, k):selected_samples = original_x[selected_sample_numbers, :]min_distance_to_selected_samples = list()for min_distance_calculation_number in range(0, x_variables.shape[0]):distance_to_selected_samples = ((selected_samples - np.tile(x_variables[min_distance_calculation_number, :],(selected_samples.shape[0], 1))) ** 2).sum(axis=1)min_distance_to_selected_samples.append(np.min(distance_to_selected_samples))max_distance_sample_number = np.where(min_distance_to_selected_samples == np.max(min_distance_to_selected_samples))max_distance_sample_number = max_distance_sample_number[0][0]selected_sample_numbers.append(remaining_sample_numbers[max_distance_sample_number])x_variables = np.delete(x_variables, max_distance_sample_number, 0)remaining_sample_numbers = np.delete(remaining_sample_numbers, max_distance_sample_number, 0)return selected_sample_numbers, remaining_sample_numbersnp.random.seed(0)
a = np.random.random((100,125))
b = np.random.randint(0,5,(100,))
selected_sample_numbers, remaining_sample_numbers = kennardstonealgorithm(a,80)print(remaining_sample_numbers)

版本2、直接返回划分好的训练和测试样本

import numpy as npdef ks(x, y, test_size=0.2):""":param x: shape (n_samples, n_features):param y: shape (n_sample, ):param test_size: the ratio of test_size (float):return: spec_train: (n_samples, n_features)spec_test: (n_samples, n_features)target_train: (n_sample, )target_test: (n_sample, )"""M = x.shape[0]N = round((1 - test_size) * M)samples = np.arange(M)D = np.zeros((M, M))for i in range((M - 1)):xa = x[i, :]for j in range((i + 1), M):xb = x[j, :]D[i, j] = np.linalg.norm(xa - xb)maxD = np.max(D, axis=0)index_row = np.argmax(D, axis=0)index_column = np.argmax(maxD)m = np.zeros(N)m[0] = np.array(index_row[index_column])m[1] = np.array(index_column)m = m.astype(int)dminmax = np.zeros(N)dminmax[1] = D[m[0], m[1]]for i in range(2, N):pool = np.delete(samples, m[:i])dmin = np.zeros((M - i))for j in range((M - i)):indexa = pool[j]d = np.zeros(i)for k in range(i):indexb = m[k]if indexa < indexb:d[k] = D[indexa, indexb]else:d[k] = D[indexb, indexa]dmin[j] = np.min(d)dminmax[i] = np.max(dmin)index = np.argmax(dmin)m[i] = pool[index]m_complement = np.delete(np.arange(x.shape[0]), m)spec_train = x[m, :]target_train = y[m]spec_test = x[m_complement, :]target_test = y[m_complement]return spec_train, spec_test, target_train, target_testnp.random.seed(0)
a = np.random.random((100,125))
b = np.random.randint(0,5,(100,))
print(b)
spec_train, spec_test, target_train, target_test = ks(a,b)
print(spec_train.shape,target_train.shape)
print(spec_test.shape,target_test.shape)

四、对选出来的train样本使用T-SNE算法进行绘制

# -*- coding: utf-8 -*- %reset -f
import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE# --- input ---
# X : dataset of X-variables (samples x variables)
# k : number of samples to be selected
#
# --- output ---
# selected_sample_numbers : selected sample numbers (training data)
# remaining_sample_numbers : remaining sample numbers (test data)def kennardstonealgorithm(x_variables, k):x_variables = np.array(x_variables)original_x = x_variablesdistance_to_average = ((x_variables - np.tile(x_variables.mean(axis=0), (x_variables.shape[0], 1))) ** 2).sum(axis=1)max_distance_sample_number = np.where(distance_to_average == np.max(distance_to_average))max_distance_sample_number = max_distance_sample_number[0][0]selected_sample_numbers = list()selected_sample_numbers.append(max_distance_sample_number)remaining_sample_numbers = np.arange(0, x_variables.shape[0], 1)x_variables = np.delete(x_variables, selected_sample_numbers, 0)remaining_sample_numbers = np.delete(remaining_sample_numbers, selected_sample_numbers, 0)for iteration in range(1, k):selected_samples = original_x[selected_sample_numbers, :]min_distance_to_selected_samples = list()for min_distance_calculation_number in range(0, x_variables.shape[0]):distance_to_selected_samples = ((selected_samples - np.tile(x_variables[min_distance_calculation_number, :],(selected_samples.shape[0], 1))) ** 2).sum(axis=1)min_distance_to_selected_samples.append(np.min(distance_to_selected_samples))max_distance_sample_number = np.where(min_distance_to_selected_samples == np.max(min_distance_to_selected_samples))max_distance_sample_number = max_distance_sample_number[0][0]selected_sample_numbers.append(remaining_sample_numbers[max_distance_sample_number])x_variables = np.delete(x_variables, max_distance_sample_number, 0)remaining_sample_numbers = np.delete(remaining_sample_numbers, max_distance_sample_number, 0)return selected_sample_numbers, remaining_sample_numbers# 对样本进行预处理并画图
def plot_embedding(data, title):""":param data:数据集:param label:样本标签:param title:图像标题:return:图像"""x_min, x_max = np.min(data, 0), np.max(data, 0)data = (data - x_min) / (x_max - x_min)  # 对数据进行归一化处理fig = plt.figure()  # 创建图形实例ax = plt.subplot(111)  # 创建子图# 遍历所有样本for i in range(data.shape[0]):# 在图中为每个数据点画出标签plt.text(data[i, 0], data[i, 1], str(0), color=plt.cm.Set1(0 / 10),fontdict={'weight': 'bold', 'size': 7})plt.xticks()  # 指定坐标的刻度plt.yticks()plt.title(title, fontsize=14)# 返回值return figif __name__ == '__main__':np.random.seed(0)data = np.random.random((100,125))y = np.random.randint(0,5,(100,))number_of_selected_samples = 80idxs_selected_sample, idxs_remaining_sample = kennardstonealgorithm(data, number_of_selected_samples)data_slt = data[idxs_selected_sample]tsne = TSNE(n_components=2, init='pca', random_state=0)reslut = tsne.fit_transform(data_slt)fig = plot_embedding(reslut, 't-SNE Embedding of digits')plt.show()

五、参考链接

GitHub - hkaneko1985/kennardstonealgorithm: Sample selection using Kennard-Stone algorighm

KS算法、样本集划分

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/209410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习实验四:贝叶斯分类器

系列文章目录 机器学习实验一&#xff1a;线性回归机器学习实验二&#xff1a;决策树模型机器学习实验三&#xff1a;支持向量机模型机器学习实验四&#xff1a;贝叶斯分类器机器学习实验五&#xff1a;集成学习机器学习实验六&#xff1a;聚类 文章目录 系列文章目录一、实验…

实用案例 | 用 Binning Explorer 小程序创建评分卡题

这个案例展示如何运用 MATLAB 中自带的 Binning Explorer 小程序来创建信用评级中的评分卡。 用 Binning Explorer 对样本进行分箱操作, 创建图表来展示分箱信息&#xff0c;并将创建的对象”creditscorecard”导出。 然后利用 creditscorecard 对象&#xff0c;结合 Financi…

基于深度学习路径规划RRT*-训练图像预处理

基于深度学习路径规划RRT*-训练图像预处理 图像预处理说明 在基于采样的RRT算法对机器人进行路径规划时&#xff0c;由于采样点的随机性&#xff0c;会增加路径的搜索时间的路径的非最优性&#xff0c;所以基于神经网络的优势&#xff0c;利用深度学习进行RRT的随机采样&…

使用webstrom编写vue开启提示

1.语言服务器选择 2.文件类型–忽略的文件和文件夹&#xff0c;删去&#xff0c;node_modules&#xff0c;就可以点进去库了 3.禁用JSLint、TSLint 4.开启node辅助 5.如果是vite&#xff0c;开启自动读取&#xff0c;或手动指定 6.如果是Webpack&#xff0c;开启自动读取&#…

Git提交代码时出现: ‘LF will be replaced by CRLF the next time Git touches it‘

遇到的问题 windows平台进行 git add 时&#xff0c;控制台打印警告 问题分析 1. Dos/Windows平台默认换行符&#xff1a;回车&#xff08;CR&#xff09;换行&#xff08;LF&#xff09;&#xff0c;即’\r\n’ 2. Mac/Linux平台默认换行符&#xff1a;换行&#xff08;LF&…

小调查:你申请的流量卡,快递员派件时让你激活并充话费了吗?

说到这个问题&#xff0c;就要给大家普及一下流量卡的激活方式了&#xff0c;并不是所有的流量卡快递都需要快递激活并充话费&#xff0c;只有在套餐详情种明确标注快递激活的流量卡才会有这个要求&#xff0c;自主激活的流量卡则不需要的。 如图所示&#xff1a; 接下来&#…

已通过考试和认证注册以及后续计划表

已通过考试和认证注册以及后续计划表 软考 - 计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试信息系统集成及服务项目管理人员工程类考试计划你关注的证书样子 软考 - 计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试 高级 信息系统项目管理师&…

鸿蒙开发组件之Image

Image组件加载图片方式有三种&#xff1a; 1、网络地址加载 直接Image(xxxx),添加上图片的网络地址就可以了。注意&#xff1a;真机、模拟题调试需要申请"ohos.permission.INTERNET"权限 Image(https://xxxxxxx) 2、PixelMap格式加载像素图 Image(PixelMapObjec…

整数在内存中的存储

整数和浮点数在内存中的存储方式是不一样的&#xff0c;今天&#xff0c;我们来具体学习一下 文章目录 整数在内存中的存储浮点数在内存中的存储 整数在内存中的存储 我们在之前就已经了解过了整数有原码&#xff0c;反码&#xff0c;补码的形式&#xff0c;这三种方式都是二进…

php使用vue.js实现省市区三级联动

参考gpt 有问题问gpt 实现效果 现省市区三级联动的方法可以使用PHP结合AJAX异步请求来实现。下面是一个简单的示例代码&#xff1a; HTML部分&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>省市区三级联动…

【vtkWidgetRepresentation】第七期 vtkImplicitPlaneRepresentation

很高兴在雪易的CSDN遇见你 前言 本文分享vtkImplicitPlaneRepresentation源码剖析&#xff0c;及相关的实例&#xff0c;该接口主要用于切割交互&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0c;一起…

亚马逊运营推荐数仓项目实战

亚马逊运营推荐数仓项目实战 项目技术栈 HadoopSpark (Python)Scala SparkSQLSparkStreaming MongoDB Redis Kafka Flume ( SpringMVC vue) 1 项目介绍 1.1 项目系统架构 项目以推荐系统建设领域知名的经过修改过的中文亚马逊电商数据集作为依托&#xff0c;以某电商…

《ReactJS实践入门》:引领JavaScript前端开发的革新之旅

在当今的软件开发世界中&#xff0c;ReactJS无疑是最为引人注目的JavaScript库之一。对于初学者来说&#xff0c;如何深入理解并掌握这一强大的前端工具&#xff0c;进而应用到实际开发中&#xff0c;一直是他们所面临的问题。而《ReactJS实践入门》一书&#xff0c;正是为了解…

单片机双机通信控制跑马灯

实验要求 两个单片机各驱动8个LED灯&#xff0c;构成两个跑马灯&#xff0c;要求甲单片机LED的点亮方式是从上至下&#xff0c;首先是最上面第一个点亮、其次是前两个点亮、其次是前三个点亮……直至8个灯全部点亮&#xff0c;8个灯全部灭&#xff0c;重复这个过程&#xff0c…

如何恢复已删除的 JPG/JPEG 文件的方法深度解析!

您是否意外丢失或删除了 JPG 或 JPEG 照片&#xff1f;幸运的是&#xff0c;您可以使用照片恢复工具将它们恢复。立即获取适用于 PC 的 JPEG 恢复工具 - 照片恢复&#xff1a; 照片是捕捉和重温生活中特殊时刻的最佳方式。因此&#xff0c;当我们由于硬盘崩溃、意外格式化磁盘…

linux Ubuntu下,第一个C++程序访问数据库,遇到的问题,及解决办法

在ubuntu下安装了mysql&#xff0c;mysql以后&#xff0c;编写了第一个访问数据库的程序&#xff1a; #include <iostream> #include <string> #include <cstdlib> //for system #include <mysql.h>using namespace std;int main() {mysqlpp::Connect…

[ROS2] --- param

1 param介绍 类似C编程中的全局变量&#xff0c;可以便于在多个程序中共享某些数据&#xff0c;参数是ROS机器人系统中的全局字典&#xff0c;可以运行多个节点中共享数据。 全局字典 在ROS系统中&#xff0c;参数是以全局字典的形态存在的&#xff0c;什么叫字典&#xff1f;…

keepalived+lvs 对nginx做负载均衡和高可用

LVS_Director KeepAlivedKeepAlived在该项目中的功能&#xff1a; 1. 管理IPVS的路由表&#xff08;包括对RealServer做健康检查&#xff09; 2. 实现调度器的HA http://www.keepalived.orgKeepalived所执行的外部脚本命令建议使用绝对路径实施步骤&#xff1a; 1. 主/备调度器…

深度解析IP应用场景API:提升风险控制与反欺诈能力

前言 在当今数字化时代&#xff0c;网络安全和用户数据保护成为企业日益关注的焦点。IP应用场景API作为一种强大的工具&#xff0c;不仅能够在线调用接口获取IP场景属性&#xff0c;而且具备识别IP真人度的能力&#xff0c;为企业提供了卓越的风险控制和反欺诈业务能力。本文将…

Java数据结构06——树

1.why: 数组&链表&树 2. 大纲 2.1前中后序 public class HeroNode {private int no;private String name;private HeroNode left;//默认为nullprivate HeroNode right;//默认为nullpublic HeroNode(int no, String name) {this.no no;this.name name;}public int …