python机器学习库numpy---7.1、生成随机数-均匀分布
一、总结
一句话总结:
均匀分布常用主要四个方法,表示[0, 1)之间均匀分布的rand和random,表示[low, high)之间的uniform,随机整数randint
a、服从[0, 1)之间的均匀分布: numpy.random.rand(d0, d1, ..., dn) b、[0, 1)之间均匀抽样: numpy.random.random(size=None) 和rand函数功能一样,参数不同而已 c、在区间[low, high)中均匀分布: numpy.random.uniform(low=0.0, high=1.0, size=None) d、随机整数:在区间[low, high)中离散均匀抽样: numpy.random.randint(low, high=None, size=None, dtype='l')
二、生成随机数-均匀分布
博客对应课程的视频位置:7.1、生成随机数-均匀分布-范仁义-读书编程笔记
https://www.fanrenyi.com/video/38/347
7、生成随机数
(1)、均匀分布
a、服从[0, 1)之间的均匀分布:
numpy.random.rand(d0, d1, ..., dn)
b、[0, 1)之间均匀抽样:
numpy.random.random(size=None)
和rand函数功能一样,参数不同而已
c、在区间[low, high)中均匀分布:
numpy.random.uniform(low=0.0, high=1.0, size=None)
d、随机整数:在区间[low, high)中离散均匀抽样:
numpy.random.randint(low, high=None, size=None, dtype='l')
python中,random.random( )和random.rand( )功能完全一样,numpy为什么要留两个表示0-1均匀分布的函数?
历史原因,可能是为了使 Matlab 用户更容易学习 python+numpy 的组合。如果把其中一个函数去掉,所带来的麻烦远大于好处,因为有很多现存的代码分别使用了这两个函数。
(2)、正态分布
a、标准正态分布(均值为0,标准差为1):
numpy.random.randn(d0, d1, ..., dn)
b、服从μ=loc,σ=scale 的正态分布:
numpy.random.normal(loc=0.0, scale=1.0, size=None)
(3)、随机种子
RandomState:定义种子类:RandomState是一个种子类,提供了各种种子方法,最常用seed
seed([seed]):定义全局种子:参数为整数或者矩阵
代码示例:
np.random.seed(1234) #设置随机种子为1234
(1)、均匀分布
(a)、服从[0, 1)之间的均匀分布:numpy.random.rand(d0, d1, ..., dn)
作用:
产生一个给定形状的数组(其实应该是ndarray对象或者是一个单值),数组中的值服从[0, 1)之间的均匀分布。
参数:
d0, d, ..., dn : int,可选。如果没有参数则返回一个float型的随机数,该随机数服从[0, 1)之间的均匀分布。
返回值:
ndarray对象或者一个float型的值
In [2]:
import numpy as np print(np.random.rand())
In [3]:
print(np.random.rand(3))
In [4]:
print(np.random.rand(3,4))
In [5]:
import matplotlib.pyplot as plt # 导入matplotlib模块,用于图表辅助分析 %matplotlib inline # 解决中文乱码 plt.rcParams["font.sans-serif"]=["SimHei"] plt.rcParams["font.family"]="sans-serif" # 解决负号无法显示的问题 plt.rcParams['axes.unicode_minus'] =False data_x = np.random.rand(1000) data_y = np.random.rand(1000) plt.scatter(data_x,data_y)
Out[5]:
(b)、[0, 1)之间均匀抽样:numpy.random.random(size=None)
作用:
返回从[0, 1)之间均匀抽样的数组,size指定形状。
参数:
size:
int型或int型的元组,如果不提供则返回一个服从该分布的随机数
返回值:
float型或者float型的ndarray对象
In [6]:
# 无参数
print(np.random.random())
In [8]:
print(np.random.random(size=(3,)))
In [9]:
# 元组做参数
print(np.random.random((4,3)))
In [10]:
import matplotlib.pyplot as plt # 导入matplotlib模块,用于图表辅助分析 %matplotlib inline # 解决中文乱码 plt.rcParams["font.sans-serif"]=["SimHei"] plt.rcParams["font.family"]="sans-serif" # 解决负号无法显示的问题 plt.rcParams['axes.unicode_minus'] =False data_x = np.random.random((1000,)) data_y = np.random.random((1000,)) plt.scatter(data_x,data_y)
Out[10]:
(c)、在区间[low, high)中均匀分布:numpy.random.uniform(low=0.0, high=1.0, size=None)
作用:
返回一个在区间[low, high)中均匀分布的数组,size指定形状。
参数:
low, high:float型或者float型的类数组对象。指定抽样区间为[low, high),low的默认值为0.0,hign的默认值为1.0
size:
int型或int型元组。指定形状,如果不提供size,则返回一个服从该分布的随机数。
In [11]:
print(np.random.uniform())
In [12]:
print(np.random.uniform(10,100,(4,5)))
In [13]:
import matplotlib.pyplot as plt # 导入matplotlib模块,用于图表辅助分析 %matplotlib inline # 解决中文乱码 plt.rcParams["font.sans-serif"]=["SimHei"] plt.rcParams["font.family"]="sans-serif" # 解决负号无法显示的问题 plt.rcParams['axes.unicode_minus'] =False data_x = np.random.uniform(10,100,(1000,)) data_y = np.random.uniform(10,100,(1000,)) plt.scatter(data_x,data_y)
Out[13]:
(d)、随机整数:在区间[low, high)中离散均匀抽样:numpy.random.randint(low, high=None, size=None, dtype='l')
作用:
返回一个在区间[low, high)中离散均匀抽样的数组,size指定形状,dtype指定数据类型。
参数:
low, high:int型,指定抽样区间[low, high)
size:int型或int型的元组,指定形状
dypte:可选参数,指定数据类型,比如int,int64等,默认是np.int
返回值:
如果指定了size,则返回一个int型的ndarray对象,否则返回一个服从该分布的int型随机数。
In [16]:
print(np.random.randint(10))
In [ ]:
# 只有一个参数的时候表示最大值
print(np.random.randint(10))
In [17]:
help(np.random.randint)
In [20]:
print(np.random.randint(low=10,size=(3,4),high=100))
In [21]:
import matplotlib.pyplot as plt # 导入matplotlib模块,用于图表辅助分析 %matplotlib inline # 解决中文乱码 plt.rcParams["font.sans-serif"]=["SimHei"] plt.rcParams["font.family"]="sans-serif" # 解决负号无法显示的问题 plt.rcParams['axes.unicode_minus'] =False data_x = np.random.randint(10,100,(1000,)) data_y = np.random.randint(10,100,(1000,)) plt.scatter(data_x,data_y)
Out[21]:
(2)、正态分布
(a)、标准正态分布(均值为0,标准差为1):numpy.random.randn(d0, d1, ..., dn)
作用:
返回一个指定形状的数组,数组中的值服从标准正态分布(均值为0,标准差为1)。
参数:
d0, d, ..., dn : int,可选。如果没有参数,则返回一个服从标准正态分布的float型随机数。
返回值:
ndarray对象或者float
In [5]:
# 无参数
import numpy as np print(np.random.randn())
In [6]:
print(np.random.randn(3))
In [7]:
# 3行4列 的正态分布
print(np.random.randn(3,4)) # 正态分布,所以我们可以看到结果有正有负
In [8]:
import matplotlib.pyplot as plt # 导入matplotlib模块,用于图表辅助分析 %matplotlib inline # 解决中文乱码 plt.rcParams["font.sans-serif"]=["SimHei"] plt.rcParams["font.family"]="sans-serif" # 解决负号无法显示的问题 plt.rcParams['axes.unicode_minus'] =False data_x = np.random.randn(1000) data_y = np.random.randn(1000) plt.scatter(data_x,data_y)
Out[8]:
(b)、服从μ=loc,σ=scale 的正态分布:numpy.random.normal(loc=0.0, scale=1.0, size=None)
作用:
返回一个由size指定形状的数组,数组中的值服从 μ=loc,σ=scale 的正态分布。
参数:
loc : float型或者float型的类数组对象,指定均值 μ
scale : float型或者float型的类数组对象,指定标准差 σ
size : int型或者int型的元组,指定了数组的形状。如果不提供size,且loc和scale为标量(不是类数组对象),则返回一个服从该分布的随机数。
输出:
ndarray对象或者一个标量
In [9]:
# 无参数
print(np.random.normal())
In [10]:
# 3行4列 的正态分布
print(np.random.normal(10,2,(3,4)))
In [11]:
import matplotlib.pyplot as plt # 导入matplotlib模块,用于图表辅助分析 %matplotlib inline # 解决中文乱码 plt.rcParams["font.sans-serif"]=["SimHei"] plt.rcParams["font.family"]="sans-serif" # 解决负号无法显示的问题 plt.rcParams['axes.unicode_minus'] =False data_x = np.random.normal(10,2,(1000)) data_y = np.random.normal(10,2,(1000)) plt.scatter(data_x,data_y)
Out[11]:
(3)、随机种子
计算机实现的随机数生成通常为伪随机数生成器,为了使得具备随机性的代码最终的结果可复现,需要设置相同的种子值
电脑产生随机数需要明白以下几点:
(1)随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就不会变。
(2)只要用户不设置随机种子,那么在默认情况下随机种子来自系统时钟(即定时/计数器的值)
(3)随机数产生的算法与系统有关,Windows和Linux是不同的,也就是说,即便是随机种子一样,不同系统产生的随机数也不一样。
随机种子方法
RandomState:定义种子类:RandomState是一个种子类,提供了各种种子方法,最常用seed
seed([seed]):定义全局种子:参数为整数或者矩阵
代码示例:
np.random.seed(1234) #设置随机种子为1234
In [3]:
#1为种子,种子不一样,生成的随机数也不一样,但是对每个种子来说,每次运行所生成的随机数是相同的
import numpy as np rs = np.random.RandomState(1) data = rs.rand(30) print(data)
In [3]:
# 如果没设置随机数
import numpy as np print(np.random.rand(30))
In [4]:
import numpy as np np.random.seed(1) #设置随机种子为1 print(np.random.rand(30))
In [ ]: