设置 random 随机种子的意义何在
时间: 2023-11-24 19:28:02 浏览: 68
设置 random 随机种子的意义在于确保随机数生成的可重复性。在程序中,如果需要多次使用随机数,可以通过设置相同的随机种子来保证每次运行程序生成的随机数序列相同。这样可以方便调试和验证程序的正确性。另外,如果不设置随机种子,则每次运行程序都会生成不同的随机数序列,这可能会导致程序的不稳定性和不可重复性,从而影响程序的正确性。
相关问题
import numpy as np from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt np.random.seed(42) # 设置随机种子,保证每次运行结果相同 x = np.random.randn(100, 3) y = x.dot(np.array([4, 5, 6])) + np.random.randn(100) * 0.1 def loss_function(w, x, y): return 0.5 * np.mean((np.dot(x, w) - y) ** 2) def gradient_function(w, x, y): return np.dot(x.T, np.dot(x, w) - y) / len(y) def SGD(x, y, w_init, alpha, max_iter): w = w_init for i in range(max_iter): rand_idx = np.random.randint(len(y)) x_i = x[rand_idx, :].reshape(1, -1) y_i = y[rand_idx] grad_i = gradient_function(w, x_i, y_i) w = w - alpha * grad_i return w fig = plt.figure() ax = Axes3D(fig) W0 = np.arange(0, 10, 0.1) W1 = np.arange(0, 10, 0.1) W0, W1 = np.meshgrid(W0, W1) W2 = np.array([SGD(x, y, np.array([w0, w1, 0]), 0.01, 1000)[2] for w0, w1 in zip(np.ravel(W0), np.ravel(W1))]) W2 = W2.reshape(W0.shape) ax.plot_surface(W0, W1, W2, cmap='coolwarm') ax.set_xlabel('w0') ax.set_ylabel('w1') ax.set_zlabel('loss') plt.show() 代码11行为何报错
在代码的第11行,报错是因为 x 中的索引应该是整数类型,而不是浮点数类型。在这行代码中,索引 `x[rand_idx, :]` 访问的是 x 中的第 rand_idx 行。但是由于 np.random.randint() 返回的是整数类型,因此索引应该使用整数值而不是浮点数值。
为了修复这个错误,可以将第11行代码修改为以下形式:
```python
x_i = x[int(rand_idx), :].reshape(1, -1)
```
这样就会将 rand_idx 转换为整数类型,然后使用整数索引来访问 x 中的行。
np.random.seed(0)和np.random.seed(1)有何区别
在numpy中,设置随机数种子时,不同的种子数字会生成不同的随机数序列。因此,np.random.seed(0)和np.random.seed(1)会生成不同的随机数序列,两者之间的区别在于生成的随机数序列不同。
具体地说,np.random.seed(0)会生成一组特定的随机数序列,这些随机数序列与种子数字0相关联。而np.random.seed(1)则会生成另一组特定的随机数序列,这些随机数序列与种子数字1相关联。因此,如果使用相同的随机生成函数,比如np.random.rand(),在np.random.seed(0)和np.random.seed(1)下生成的随机数序列会不同。
需要注意的是,对于相同的随机数生成函数,在相同的种子数字下生成的随机数序列是一样的。因此,如果需要保证随机数的可重复性,可以使用相同的种子数字来设置随机数种子。
阅读全文