首页 > 其他分享 >快速生成一组环形数据

快速生成一组环形数据

时间:2023-11-23 16:12:02浏览次数:25  
标签:std include 一组 sita 环形 生成 plt double PI

  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的图片进行测试。

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

标签:std,include,一组,sita,环形,生成,plt,double,PI
From: https://www.cnblogs.com/ChebyshevTST/p/17851788.html

相关文章

  • JWT生成的token——中间部分Payload的坑
     JWT进行token认证应该都用过,标准的加密(Base64编码)后的token是这样的三段式的:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaWQiOiIxMjM0NTY3ODkwIiwiZXhwIjoxNjA1MDAxNzQyLCJpYXQiOjE2MDQ5OTQ1NDIsImp0aSI6IjU5YjI2NDEzLTE4MjMtNDVlZS1iZTI1LTA5M2ZjMjlhMmYzOCJ9.FMpVju......
  • lombok的@Data注解不想为某个字段生成getter/setter方法
    在不想添加getter的实体类字段上添加@Getter(AccessLevel.NONE),setter同理/***通话时长*/@Getter(AccessLevel.NONE)@TableField(exist=false)privateStringduration;publicStringgetDuration(){try{Longdura......
  • P4180 [BJWC2010] 严格次小生成树
    如果有两条在最小生成树上的边被换掉了,那么原树会被分成三个连通块。考虑新加的两条边,保留权值较小的那一条,这样还剩两个连通块。而删除的两条边至少有一条能连通这两个连通块,所以可以保留那条边。并且新加的两条边中权值较大的那一条肯定大于等于我们保留的边,否则与最小生成树......
  • Java开发者的Python快速进修指南:迭代器(Iterator)与生成器
    这一篇内容可能相对较少,但是迭代器在Java中是有用处的。因此,我想介绍一下Python中迭代器的使用方法。除了写法简单之外,Python的迭代器还有一个最大的不同之处,就是无法直接判断是否还有下一个元素。我们只能通过捕获异常或使用for循环来退出迭代,这点让我感到十分惊讶。可迭代对象......
  • 001swagger2--接口文档生成利器
    1.配置在springboot整合swagger21.1引入jar包<dependency><groupId>com.allen.pan</groupId><artifactId>allen-pan-core</artifactId><version>1.0</version></dependency&g......
  • 清华发布LCM-LoRA模型:图像生成速度提升10倍,下载量破20万
    LCMLoRA模型概述LCMLoRA模型是一种创新的深度学习模型,它通过特殊的技术手段,显著提高了图像生成的效率。这种模型特别适用于需要快速生成高质量图像的场景,如艺术创作、实时图像处理等。技术实现LCMLoRA模型的核心在于其独特的LoRA(Low-RankAdaptation)技术。这种技术的基本原理是......
  • python wordcloud生成词云
    #!/usr/bin/envpython#coding:utf-8#pipinstallwordcloud#pipinstallmatplotlibimportwordcloudimportmatplotlib.pyplotaspltimportnumpyasnpfromPILimportImagetext="""给你一瓶魔法药水喝下去就不需要氧气给你一瓶魔法药水喝下去就不怕身体......
  • 【模板】最小度限制生成树 题解
    其他的题解感觉都好高级,分享一种好想且好实现的方法。我们可以先把点\(s\)和与其相连的边都删除,我们发现剩下的部分变成了一些连通块。我们不难发现,当要求与\(s\)点相连的边的个数为\(k\)时,我们的连通块个数显然是\(k\)的。接下来这个问题就转化成了:\(n-1\)个点中生......
  • 陌陌头像留二维码隐藏技术,微信号,双头像生成工具,“codeA”方式开源
    正常情况下我们在陌陌头像留二维码会被系统检测到的,因为它识别到了这是二维码是,就算不封号对账号权重也有营销,但是一些人想在陌陌做一些产品,比如足浴、保健品之类的,想在陌陌引流,那么留二维码头像不封号的实现就非常重要了,我制作的这个工具可以生成干扰码,就是二维码生成干扰码导致......
  • 陌陌头像留微信号二维码不被检测的方法,工具一键生成干扰码,屏蔽系统检测
    正常情况下我们在陌陌头像留二维码会被系统检测到的,因为它识别到了这是二维码是,就算不封号对账号权重也有营销,但是一些人想在陌陌做一些产品,比如足浴、保健品之类的,想在陌陌引流,那么留二维码头像不封号的实现就非常重要了,我制作的这个工具可以生成干扰码,就是二维码生成干扰码导致......