背景:由於返校的原因,手頭的筆記本無法完成在Windows下運行虛擬機的操作,所以選擇在Windows下進行一些學習。(不得不吐槽下“微星筆記本”)
最近在看“強化學習”有關書籍,其中前幾章爲基礎知識。現做個總結:
- 書中多采用python實例,不可避免的又要和python打交道,於是配置了相關vscode的python環境。電腦本身是裝有numpy,和matplotlib包的(忘了什麼時候安裝的了)
首先在vscode中,ctrl+shift+P
找到下圖所示配置地方
添加語句如下所示:
{
"python.pythonPath": "E:\\software\\anaconda\\python.exe"
}
其中,路徑爲python.exe所在路徑。這樣,在Vscode中就可以關聯找到numpy,以及mathplotlib包了。
- Python也是腳本語言,這點和Matlab的.m文件挺像的。
- 略過書中有關矩陣基本形式的介紹(書中着重強調了對稱矩陣的性質,不知道後續內容是否有涉及)
- 概率部分,貝葉斯定理:
- 重要性採樣:當原分佈函數比較複雜的時候,無法直接利用原分佈函數進行求期望,方差等操作。這個時候,可以採用“曲線救國”的方式,基於大數定理,用採樣的樣本近似逼近原分佈,採用的是
np.random.normal()
實現。附上書中的例子,慢慢琢磨:
import numpy as np
import math
import matplotlib.pyplot as plt
def gaussian(x,u ,sigma):
return math.exp(-(x-u)**2/(2*sigma*sigma))/math.sqrt(2*math.pi*sigma*sigma)
def importance_sampling_test(ori_sigma, sample_sigma):
origin = []
for n in range(10):
sum = 0
for i in range(10000):
a = np.random.normal(1.0,ori_sigma)
sum += a
origin.append(sum)
isample = []
for n in range(10):
sum2 = 0
for i in range(10000):
a = np.random.normal(1.0,sample_sigma)
ua = gaussian(a,1.0,sample_sigma)
na = gaussian(a,1.0,ori_sigma)
sum2 += a*na/ua
isample.append(sum2)
origin = np.array(origin)
isample = np.array(isample)
np_mean = np.mean(origin)
np_std = np.std(origin)
print(np_mean,end="")
print("\t",end="")#np.std(origin)
print(np_std)
np_mean = np.mean(isample)
np_std = np.std(isample)
print(np_mean,end="") #np.std(origin)
print("\t",end="")
print(np_std)
importance_sampling_test(1.0,1.0)
importance_sampling_test(1.0,0.5)
importance_sampling_test(1.0,2)
xs = np.linspace(-5,6,301)
y1 = [gaussian(x,1.0,1.0) for x in xs]
y2 = [gaussian(x,1.0,0.5) for x in xs]
y3 = [gaussian(x,1.0,2) for x in xs]
fig = plt.figure(figsize=(8,5))
plt.plot(xs,y1,label='sigma=1.0')
plt.plot(xs,y2,label='sigma=0.5',linestyle=':')
plt.plot(xs,y3,label='sigma=2.0',linestyle='--')
plt.legend()
plt.show()
在VScode中,單機右上角的運行按鈕後,可以得到下圖:
- 信息論基礎:熵,書中又名“驚喜度”。事件發生的概率越小,驚喜度越大。表示熵的函數需要時連續的。。於是找到一個滿足的函數爲:
連續變量上定義爲
書中將擲硬幣的例子編寫曲線表示,假如有字的一面朝上的概率爲,有花的一面的朝上的概率爲,則有關熵的公式爲:
Python代碼如下:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,1,101)
y = -x*np.log2(x)-(1-x)*np.log2(1-x)
y[np.isnan(y)] = 0
plt.plot(x,y)
plt.show()
- KL散度:描述兩個概率分佈的差異。表徵兩個概率分佈之間的距離。當兩個分佈越接近,則KL散度越小;反之,兩個分佈越遠,KL散度就越大。 (書中有一大堆公式推導,略)
- 凸函數及其性質:其實高中數學中就已經普及函數的凹凸性質了,以前確實沒有注意到這個知識點。機器學習概念篇:一文詳解凸函數和凸優化,乾貨滿滿
凸函數,凸集的優點:如果一個點是凸函數的局部最優值,那麼這個點就是函數的全局最優值。更進一步,如果這個函數是強凸函數,那麼這個點是函數唯一的全局最優值。(詳細證明見書中 P39-P41) - 機器學習概念: Python中,有
scikit-learn
工具包可以完成可視化的迴歸問題,通過pip list
查看。可以參考鏈接爲:機器學習算法的隨機數據生成 ,plot的顏色和線條設置可以參看python中matplotlib的顏色及線條控制
import numpy
import sklearn.datasets as d
import matplotlib.pyplot as plt
reg_data = d.make_regression(100,1,1,1,1.0)
x,y = d.make_classification(100,2,2,0,0,2)
plt.subplot(121)
plt.plot(reg_data[0],reg_data[1])
plt.subplot(122)
plt.plot(x[:,0],x[:,1],marker=',')
plt.show()
- 交叉熵:舉一個例子,如果有兩個服從伯努利分佈的隨機變量P和Q,他們的交叉熵爲
用python畫出來爲
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
X = np.linspace(0.01,0.99,101)
Y = np.linspace(0.01,0.99,101)
X,Y = np.meshgrid(X,Y)
Z = -X*np.log2(Y) -(1-X)*np.log2(1-Y)
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap='rainbow')
plt.show()
如果最終輸出爲的結果是迴歸問題的一個連續變量,使用平方損失函數更合適;如果最終輸出是分類問題的一個離散變量,那麼交叉熵損失函數更合適