当前位置: 首页 >  技术分享 >  快速生成一组环形数据

快速生成一组环形数据

导读:sklearn是一个开源的机器学习库,支持不同种类的机器学习算法,并且提供了许多质量良好的数据集。假如我们想要得到一组环形数据集,借助sklearn的包很轻易就可以实现,不过换个角度思考,我们自己动手是否也可以生成一组数据,使之在散点图上环状分布;借助C++的random头文件以

sklearn是一个开源的机器学习库,支持不同种类的机器学习算法,并且提供了许多质量良好的数据集。假如我们想要得到一组环形数据集,借助sklearn的包很轻易就可以实现,不过换个角度思考,我们自己动手是否也可以生成一组数据,使之在散点图上环状分布;借助C++的random头文件以及一点高中数学知识,我们很快也可以打造属于自己的数据集。

简单回顾一下,ρ与x和y之间的关系,y=ρsin(θ),x=ρcos(θ)。这是第一象限的情况,对于其它象限,只需要注意角度和符号的关系便可。

#include <iostream>
#include <fstream>
#include <random>
#include <string>
#include <utility>
#include <cmath>

std::random_device rd;
std::mt19937 g(rd());
std::uniform_real_distribution dis(0.0, M_PI * 2);

std::pair<double, double> circleData(double radius) {
    double tolerance = radius / (30.0 + dis(g));
    int n;
    double d = dis(g);
    if (d < M_PI)
        n = 1;
    else 
        n = -1;

    double r = radius + n * tolerance * dis(g);
    double x, y;
    double sita = dis(g);
    double mapping = sita / (M_PI / 2);

    if (mapping < 1.0) {
        x = r * cos(sita);
        y = r * sin(sita);
    } else if (mapping < 2.0) {
        x = -r * cos(M_PI - sita);
        y = r * sin(M_PI - sita);
    } else if (mapping < 3.0) {
        x = -r * cos(sita - M_PI);
        y = -r * sin(sita - M_PI);
    } else {
        x = r * cos(2 * M_PI - sita);
        y = -r * sin(2 * M_PI - sita);
    }

    return std::pair<double, double>{x, y};
}

void generateData(const std::string& path, std::size_t n = 1000, double radius = 1000.0) {
    std::ofstream out{path};

    out << "X,Y\n";
    for (std::size_t i{}; i < n; ++i) {
        std::pair<double, double> pii = circleData(radius);
        std::string str = std::to_string(pii.first) + ',' + std::to_string(pii.second) + '\n';
        out << str;
    }
}

int main() {
    std::string str{};
    std::cin >> str;
    generateData(str);
}

需要额外补充几点:1.生成的数据并不必完全呈环状,有稍微的偏差更加符合随机性,所以这里定义了tolerance变量,允许在半径范围内有一定的误差。2.生成的数据会写入csv格式的文件当中,而csv格式下的数据说白了就是一堆以逗号作为分割界限的字符串,后面用借助Python的pandas库便能很容易地对csv格式文件进行解析。3.为了确定随机生成的角度属于哪一象限,只需要除以(pi/2)即可判断,浮点数比较带来的精度丢失可接受。

接下来打开Python的编辑器,只需要写入下列代码:

import pandas as pd
import matplotlib.pyplot as plt


def f():
    file = 'data.csv'
    data = pd.read_csv(file)

    x = data['X']
    y = data['Y']

    plt.scatter(x, y)
    plt.title('Circle Data')
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.show()

if __name__ == '__main__':
    f()

这是在半径为10000时的效果,为了多作几组对比,我们分别选取半径为100,1000的图片进行测试。

总结:效果看上去都还不错,不过并不一定任何时候都能满足需求,可以对代码当中的参数进行一定的调整,生成更符合预期的数据集。

内容
  • Unity 中的存档系统(本地存档)
    Unity 中的存档系统(本地存
    2023-12-09
    思想.在游戏过程中,玩家的背包、登录、人物系统都与数据息息相关,无论是一开始就设定好的默认数据,还是可以动态存取的数据,
  • Mybatis的工作原理
    Mybatis的工作原理
    2023-12-05
    mybatis的工作原理.mybatis基本工作原理.封装sql ->调用JDBC操作数据库 -> 返回数据封装.JDB
  • python实现基于RPC协议的接口自动化测试
    python实现基于RPC协议的
    2023-12-05
    01什么是RPC.RPC(Remote Procedure Call)远程过程调用协议.是一个用于建立适当框架的协议。从
  • 数据分析师如何用SQL解决业务问题?
    数据分析师如何用SQL解决业务问
    2023-12-03
    本文来自问答。.提问:数据分析人员需要掌握sql到什么程度?.请问做一名数据分析人员,在sql方面需要掌握到什么程度呢?
  • 缓存面试解析:穿透、击穿、雪崩,一致性、分布式锁、Redis过期,海量数据查找
    缓存面试解析:穿透、击穿、雪崩,
    2023-12-03
    为什么使用缓存.在程序内部使用缓存,比如使用map等数据结构作为内部缓存,可以快速获取对象。通过将经常使用的数据存储在缓
  • Unity学习笔记--数据持久化Json
    Unity学习笔记--数据持久化
    2023-12-02
    JSON相关.json是国际通用语言,可以跨平台(游戏,软件,网页,不同OS)使用,.json语法较为简单,使用更广泛。
  • 软件定制开发服务
    软件定制开发服务
    2024-01-05
    软件定制开发服务.产品功能.我们的软件定制开发服务为客户提供了一站式的解决方案,包括需求分析、设计开发、**部署和维护支
  • ***安全解决方案
    ***安全解决方案
    2024-01-10
    ***安全解决方案.产品功能.我们的服务器安全解决方案是一款专为企业服务器量身定制的安全软件,旨在保护企业服务器免受恶意
  • 电子元件芯片
    电子元件芯片
    2024-01-20
    电子元件芯片.产品功能.电子元件芯片是一种微型电子元件,其具有高性能、高可*性和低功耗的特点。它广泛应用于手机、电脑、家
  • ***远程监控系*
    ***远程监控系*
    2023-12-16
    ***远程监控系*.产品功能.我们的服务器远程监控系*是一款针对企业服务器管理的智能监控系*。它具有实时监控、远程操作、
  • 电子元件模块
    电子元件模块
    2023-12-21
    电子元件模块.我们的电子元件模块是一款专为电子爱好者和工程师设计的多功能模块。它集成了多种常用的电子元件和功能模块,可以
  • 电子元件连接器
    电子元件连接器
    2023-12-31
    电子元件连接器.产品功能.电子元件连接器是一种用于连接不同电子元件的重要组件。它可以提供可*的电气连接,从而实现各种电子
  • 人工智能应用软件
    人工智能应用软件
    2024-01-15
    人工智能应用软件产品介绍.产品功能.我们的人工智能应用软件集成了多种先进的人工智能技术,包括机器学习、自然语言处理、计算
  • ***数据备份方案
    ***数据备份方案
    2024-01-15
    ***数据备份方案.产品功能.自动化备份:定期自动备份***上的数据,无需人工干预,确保数据的及时、准确备份。.数据恢复
  • ***软件
    ***软件
    2023-12-06
    ***软件产品介绍.产品描述.我们的服务器软件是一款高性能、稳定可靠的服务器管理软件,具有强大的功能和灵活的配置,适用于
  • 移动应用开发
    移动应用开发
    2023-12-01
    移动应用开发.产品描述.移动应用开发是一种专注于为移动设备(如智能手机、平板电脑)开发应用程序的技术和流程。这些应用程序