You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不导入Sklearn库实现make_blobs函数生成样本数据集的方法

无Sklearn依赖的make_blobs等效实现

实现逻辑

sklearn的make_blobs本质是生成若干个服从高斯分布的样本簇,核心流程如下:

  • 固定随机种子保证结果可复现
  • 将总样本数均分到每个簇
  • 为每个簇随机生成中心,再以中心为均值生成符合正态分布的簇内样本
  • 拼接所有样本并生成对应标签,可选打乱样本顺序

方案1:基于Numpy实现(输出格式与sklearn完全对齐,性能最优)

import numpy as np

def make_blobs_alt(n_samples=100, n_features=2, centers=2, random_state=0, cluster_std=1.0):
    np.random.seed(random_state)
    # 分配每个簇的样本数量
    samples_per_cluster = [n_samples // centers] * centers
    for i in range(n_samples % centers):
        samples_per_cluster[i] += 1
    # 生成簇中心,范围和sklearn默认一致为[-10, 10]
    cluster_centers = np.random.uniform(-10, 10, size=(centers, n_features))
    X, y = [], []
    for label, (n, center) in enumerate(zip(samples_per_cluster, cluster_centers)):
        # 生成符合正态分布的簇内样本
        cluster_data = np.random.randn(n, n_features) * cluster_std + center
        X.append(cluster_data)
        y += [label] * n
    # 打乱样本顺序,和sklearn行为一致
    X = np.concatenate(X, axis=0)
    y = np.array(y)
    shuffle_idx = np.random.permutation(len(X))
    return X[shuffle_idx], y[shuffle_idx]

# 调用和原sklearn代码完全一致
X_Train, Y_Train = make_blobs_alt(n_samples=100, n_features=2, centers=2, random_state=0)

方案2:纯Python原生实现(无任何第三方依赖)

如果不能使用Numpy,可基于Python标准库实现:

import random
import math

def make_blobs_alt(n_samples=100, n_features=2, centers=2, random_state=0, cluster_std=1.0):
    random.seed(random_state)
    # 分配每个簇的样本数量
    samples_per_cluster = [n_samples // centers] * centers
    for i in range(n_samples % centers):
        samples_per_cluster[i] += 1
    # 生成簇中心
    cluster_centers = [[random.uniform(-10, 10) for _ in range(n_features)] for _ in range(centers)]
    X, y = [], []
    for label, (n, center) in enumerate(zip(samples_per_cluster, cluster_centers)):
        for _ in range(n):
            sample = []
            for dim in range(n_features):
                # Box-Muller变换生成标准正态分布随机数
                u1, u2 = random.random(), random.random()
                z = math.sqrt(-2 * math.log(u1)) * math.cos(2 * math.pi * u2)
                sample.append(z * cluster_std + center[dim])
            X.append(sample)
            y.append(label)
    # 打乱样本顺序
    combined = list(zip(X, y))
    random.shuffle(combined)
    X, y = zip(*combined)
    return list(X), list(y)

# 调用
X_Train, Y_Train = make_blobs_alt(n_samples=100, n_features=2, centers=2, random_state=0)

若需要和原sklearn代码生成的数值完全一致,只需要将上述实现中的簇中心硬编码为[[1.15389415, 2.37780692], [2.19525608, 0.87656192]]即可,这是sklearn在random_state=0时默认生成的两个簇中心。

内容的提问来源于stack exchange,提问作者Naben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:36:04