当前位置: 首页 > news >正文

Python多语双峰分布

双峰分布 是一种概率分布,其概率密度函数有两个峰值。相比于常见的单峰分布(如正态分布),双峰分布意味着数据集中存在两个相对独立的子群体,每个子群体都围绕着一个不同的中心值聚集。
在这里插入图片描述

Python双峰

在 Python 中,我们可以通过合并两个正态分布来生成一个双峰分布。这样做可以模拟一个数据集,它在不同的区域有两个高峰。下面是如何用 numpymatplotlib 来实现这个过程的示例代码:

  1. 生成数据:创建两个具有不同均值和方差的正态分布。
  2. 合并数据:将这两个数据集合并,形成一个双峰分布。
  3. 可视化:绘制直方图以显示双峰分布。

以下是代码示例:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns# 设置随机种子以保证结果的可复现性
np.random.seed(0)# 生成两个正态分布的数据集
data1 = np.random.normal(loc=20, scale=5, size=1000)  # 均值=20,标准差=5
data2 = np.random.normal(loc=50, scale=10, size=1000)  # 均值=50,标准差=10# 合并数据,形成双峰分布
bimodal_data = np.concatenate([data1, data2])# 绘制双峰分布的直方图
plt.figure(figsize=(10, 6))
sns.histplot(bimodal_data, bins=30, kde=True, color='skyblue')
plt.title("双峰分布")
plt.xlabel("值")
plt.ylabel("频率")
plt.show()

代码说明:

  • loc 表示正态分布的均值。
  • scale 表示正态分布的标准差(数据的离散程度)。
  • size 是生成的样本数。
  • sns.histplot 中的 kde=True 参数会绘制平滑的密度估计曲线,用于展示数据分布的形状。

运行此代码后,生成的直方图会显示两个不同的高峰,从而形成双峰分布。你可以根据需要调整每个数据集的 locscale 参数,以改变高峰之间的距离和数据的离散程度。

MATLAB双峰

在 MATLAB 中,可以通过使用 normrnd 函数生成两个正态分布的数据集,然后将它们合并,以创建一个双峰分布。我们可以通过 histogram 函数来绘制直方图并展示双峰分布的特征。

以下是一个创建并绘制双峰分布的 MATLAB 示例代码:

% 设置随机种子以确保结果可复现
rng(0);% 生成双峰分布数据
data1 = normrnd(20, 5, [1000, 1]);  % 第一组数据,均值为20,标准差为5
data2 = normrnd(50, 5, [1000, 1]);  % 第二组数据,均值为50,标准差为5% 合并数据
data = [data1; data2];% 绘制双峰分布的直方图
figure;
histogram(data, 50, 'FaceColor', [0.5 0.7 1], 'EdgeColor', 'k'); % 50个柱
title('双峰分布示例');
xlabel('数值');
ylabel('频率');

代码解释

  1. 数据生成:使用 normrnd 生成两组正态分布数据,data1data2 分别以 20 和 50 为均值,5 为标准差,每组包含 1000 个数据点。
  2. 数据合并:将两组数据合并成一个向量 data
  3. 绘制直方图histogram 函数用于绘制直方图,通过 FaceColorEdgeColor 控制柱的颜色和边界颜色。50 表示分为 50 个柱。

运行该代码后,将会在 MATLAB 中显示一个具有双峰的分布图。

Java双峰

在 Java 中可以使用 java.util.Random 来生成两个正态分布的数据集,然后将它们合并形成双峰分布。为了实现正态分布的数据生成,我们可以用 Random 类的 nextGaussian 方法,它会生成均值为 0、标准差为 1 的正态分布。通过简单的变换,我们可以将其调整到任意的均值和标准差。

以下是一个 Java 示例代码,展示如何生成和绘制双峰分布。这里我们会使用 JFreeChart 库来绘制直方图,确保视觉效果类似于其他统计绘图库。

前提

为了运行该代码,请确保添加了 JFreeChart 库,可以从 JFreeChart 官网 下载并添加到项目中。

Java 示例代码

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.statistics.HistogramDataset;import javax.swing.*;
import java.util.Random;public class BimodalDistributionExample extends JFrame {public BimodalDistributionExample() {// 创建双峰分布数据double[] data = generateBimodalData(1000, 20, 5, 1000, 50, 5);// 设置直方图数据集HistogramDataset dataset = new HistogramDataset();dataset.addSeries("双峰分布", data, 50); // 使用50个柱// 创建直方图JFreeChart histogram = ChartFactory.createHistogram("双峰分布示例","数值","频率",dataset,PlotOrientation.VERTICAL,false,true,false);// 将直方图添加到面板ChartPanel chartPanel = new ChartPanel(histogram);chartPanel.setPreferredSize(new java.awt.Dimension(800, 600));setContentPane(chartPanel);}// 生成双峰分布数据的函数private double[] generateBimodalData(int n1, double mean1, double std1, int n2, double mean2, double std2) {Random random = new Random();double[] data = new double[n1 + n2];// 生成第一组数据for (int i = 0; i < n1; i++) {data[i] = mean1 + std1 * random.nextGaussian();}// 生成第二组数据for (int i = 0; i < n2; i++) {data[n1 + i] = mean2 + std2 * random.nextGaussian();}return data;}public static void main(String[] args) {SwingUtilities.invokeLater(() -> {BimodalDistributionExample example = new BimodalDistributionExample();example.setSize(800, 600);example.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);example.setVisible(true);});}
}

代码说明

  1. 生成双峰分布数据generateBimodalData 方法生成两组正态分布数据并将它们合并。第一组数据具有均值 mean1 和标准差 std1,第二组数据具有均值 mean2 和标准差 std2
  2. 创建数据集和直方图HistogramDataset 用于创建数据集,JFreeChart 提供了一个易用的 createHistogram 方法来生成直方图。
  3. 显示图形ChartPanel 将图形嵌入到窗口中,设置窗口大小并使之可视。

运行结果

运行代码后会显示一个窗口,窗口中展示了一个直方图,能够清晰地看到具有两个峰值的双峰分布。

注意事项

  • JFreeChart 库需要单独下载并导入项目。
  • nextGaussian 方法用于生成标准正态分布数据,通过线性变换可以得到不同的均值和标准差。

C++双峰

在 C++ 中,可以使用标准库 <random> 生成双峰分布的数据集,并通过绘图库(如 matplotlib-cppgnuplot)来进行可视化。下面的示例代码展示了如何生成双峰分布的数据。由于 C++ 没有内置的可视化库,所以常用第三方工具来展示结果。

1. 使用 C++ 生成双峰分布数据

首先,我们用 <random> 生成两个不同均值和标准差的正态分布数据集合并合并成双峰分布。

#include <iostream>
#include <random>
#include <vector>// 生成双峰分布数据的函数
std::vector<double> generate_bimodal_data(int n1, double mean1, double std1, int n2, double mean2, double std2) {std::random_device rd;std::mt19937 gen(rd());std::normal_distribution<> dist1(mean1, std1);std::normal_distribution<> dist2(mean2, std2);std::vector<double> data;data.reserve(n1 + n2);// 生成第一组数据for (int i = 0; i < n1; ++i) {data.push_back(dist1(gen));}// 生成第二组数据for (int i = 0; i < n2; ++i) {data.push_back(dist2(gen));}return data;
}int main() {int n1 = 1000, n2 = 1000;double mean1 = 20, std1 = 5, mean2 = 50, std2 = 5;// 生成双峰分布数据std::vector<double> data = generate_bimodal_data(n1, mean1, std1, n2, mean2, std2);// 输出部分数据示例std::cout << "生成了 " << data.size() << " 个数据点的双峰分布样本。" << std::endl;for (size_t i = 0; i < 10; ++i) {std::cout << data[i] << " ";}std::cout << "..." << std::endl;return 0;
}

代码说明

  1. 生成双峰数据generate_bimodal_data 函数生成两组正态分布数据,将它们存储在 std::vector<double> 中。
  2. 输出数据:输出部分生成的双峰分布数据样本。

2. 数据可视化

在 C++ 中直接可视化不如 Python 那样方便,可以使用以下两种常见方式:

  • matplotlib-cpp:这是一个 C++ 封装的 Matplotlib 接口,适合已安装 Python 和 Matplotlib 的系统。
  • GNUPlot:可以通过输出数据到文件,再用 GNUPlot 进行可视化。

2.1 使用 matplotlib-cpp 可视化

要使用 matplotlib-cpp,首先下载并配置 matplotlib-cpp 库。下面是代码示例:

#include "matplotlibcpp.h"
#include <iostream>
#include <random>
#include <vector>namespace plt = matplotlibcpp;// 前面的 `generate_bimodal_data` 函数保持不变int main() {int n1 = 1000, n2 = 1000;double mean1 = 20, std1 = 5, mean2 = 50, std2 = 5;// 生成双峰分布数据std::vector<double> data = generate_bimodal_data(n1, mean1, std1, n2, mean2, std2);// 可视化数据plt::hist(data, 50);  // 50个柱plt::title("双峰分布示例");plt::xlabel("数值");plt::ylabel("频率");plt::show();return 0;
}

2.2 使用 GNUPlot 可视化

使用 GNUPlot,可以将数据输出到文本文件,然后通过 GNUPlot 绘制直方图:

  1. 将数据保存到文件:

    #include <fstream>
    // 生成双峰分布数据并保存
    std::ofstream outFile("bimodal_data.txt");
    for (double value : data) {outFile << value << std::endl;
    }
    outFile.close();
    
  2. 使用 GNUPlot 绘制直方图(在命令行中输入以下命令):

    gnuplot -e "set terminal png; set output 'bimodal_distribution.png'; \\\\binwidth=1; set boxwidth binwidth; set style fill solid; \\\\bin(x,width)=width*floor(x/width); \\\\plot 'bimodal_data.txt' using (bin($1,binwidth)):(1.0) smooth freq with boxes title '双峰分布'"
    

这条命令会输出一个名为 bimodal_distribution.png 的双峰分布直方图。

👉更新:亚图跨际


http://www.mrgr.cn/news/60763.html

相关文章:

  • Rust整合Elasticsearch
  • java脚手架系列9-统一权限认证gateway
  • NSSCTF刷题篇web部分
  • STM32之OLED驱动函数
  • 插槽 - 2024最新版前端秋招面试短期突击面试题【100道】
  • 维乐Senso Edge坐垫,自然并不远,向往就前往
  • 练习LabVIEW第二十四题
  • Unity Job System详解(3)——NativeArray源码分析
  • 100种算法【Python版】第21篇——Wilson算法
  • Java Lock CountDownLatch 总结
  • 李宇皓现身第十届“文荣奖”,allblack造型帅气绅士引关注
  • 加强版 第一节图像二值化定义
  • 四、常量指针其他
  • 信创认证(信创人才考评证书)的含金量?到底有多少?
  • 【Flask】三、Flask 常见项目架构
  • IPV6扩展头部
  • SQL进阶技巧:Hive如何进行更新和删除操作?
  • 自修室预约系统|基于java和小程序的自修室预约系统设计与实现(源码+数据库+文档)
  • 代码随想录第46天|
  • 前端:遇到的面试题
  • Oracle 第10章:触发器
  • Spring MVC介绍
  • Spring Boot 3项目创建与示例(Web+JPA)
  • 江协科技STM32学习- P23 DMA 直接存储器存取
  • CSS.选择器
  • Java性能调优与垃圾回收机制(4/5)