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 [ ]: