不导入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
相关产品推荐
相关产品推荐

