Random Seed是什么?
随机种子(Random Seed)就是这些随机数的初始值。
一般计算机里面产生的随机数都是伪随机数。 伪随机数,也是就一个一直不变的数。
import numpy as np# 不设置seed:每次运行结果都不同
random_numbers1 = np.random.rand(3)
print("不设置seed:", random_numbers1)# 设置seed:结果可重现
np.random.seed(42)
random_numbers2 = np.random.rand(3)
print("seed=42:", random_numbers2) # 每次运行都一样# 再次使用相同的seed
np.random.seed(42)
random_numbers3 = np.random.rand(3)
print("再次seed=42:", random_numbers3) # 与random_numbers2完全相同
- 为什么要用Random Seed?
- 可重现性:确保实验结果可以复现
- 调试方便:固定随机结果便于找bug
- 公平比较:不同算法使用相同的随机初始化
- 怎么用?常见应用场景:
可重复性:
- 在调试代码时,可以重现相同的结果
- 在比较不同算法时,使用相同的随机初始化条件
实验控制:
- 在进行实验对比时,保证初始条件相同
- 在论文研究中,使其他研究者能重现结果
不同场景的应用:
- 模型训练:确保每次训练初始化相同
- 数据划分:确保训练集/测试集划分一致
- 随机采样:保证采样结果可重现
import numpy as np# 1. 首先生成原始数据
X = np.random.rand(100, 2) # 创建100个随机的二维点
# 比如生成的数据可能是:
# [[0.1, 0.2],
# [0.3, 0.4],
# [0.5, 0.6],
# ...共100个点...]# 2. 从这100个点中随机选择3个点作为初始中心
def kmeans_init(X, k):np.random.seed(42) # 设置随机种子n_samples = X.shape[0] # = 100# random_indices会随机生成3个不同的索引,比如[5, 23, 67]random_indices = np.random.choice(n_samples, k, replace=False)# 根据这些索引从X中选择对应的点# 如果random_indices是[5, 23, 67],那么就选择X中第5、23、67号点作为初始中心initial_centers = X[random_indices]return initial_centersk = 3
centers = kmeans_init(X, k)
让我们用一个更简单的例子来说明:
import numpy as np# 生成10个二维点作为示例
np.random.seed(1) # 为了演示固定结果
X = np.random.rand(10, 2)
print("原始数据点:")
print(X)
# 输出10个二维点,比如:
# [[0.417, 0.720],
# [0.000, 0.302],
# [0.146, 0.092],
# [0.785, 0.597],
# [0.934, 0.244],
# [0.390, 0.527],
# [0.671, 0.444],
# [0.883, 0.865],
# [0.641, 0.175],
# [0.138, 0.384]]# 从这10个点中随机选择3个作为中心点
def kmeans_init(X, k):np.random.seed(42) # 固定随机种子n_samples = 10 # 总共10个点# 随机选择3个不同的索引(比如选择了 2,7,4)random_indices = np.random.choice(n_samples, k, replace=False)print("选择的索引:", random_indices)# 返回这些索引对应的点作为初始中心initial_centers = X[random_indices]print("选择的中心点:")print(initial_centers)return initial_centersk = 3
centers = kmeans_init(X, k)
关键理解:
- np.random.rand(100, 2)生成了原始数据点(100个点,每个点有x,y两个坐标)
- random_seed控制的是从这100个点中选择3个点的随机过程
- 不是生成新的点
- 而是从现有的点中随机选择
- 这些选择的点将作为K-means聚类的初始中心点
就像:
- 你先在纸上随机画了100个点
- 然后需要从这100个点中随机选择3个点作为起始中心
- random_seed就是控制"选择"这个过程
- 相同的seed每次都会选择相同的点
- 不同的seed会选择不同的点
- 不设置seed每次运行都会选择不同的点
所以seed不是控制X坐标点的生成,而是控制从已有的X中选择哪些点作为初始中心点。这些初始中心点会影响K-means算法最终的聚类结果。