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 的双峰分布直方图。

👉更新:亚图跨际

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值