繁簡切換您正在訪問的是FX168財經網,本網站所提供的內容及信息均遵守中華人民共和國香港特別行政區當地法律法規。

FX168財經網>人物頻道>帖子

【量化課堂】樸素貝葉斯入門

作者/lcb173364 2019-05-10 06:58 0 來源: FX168財經網人物頻道

導語:在現實生活中,我們經常要利用觀測現象(特征數據)推測現象背後的原因。例如我們看到草地濕了,需要判斷是不是下雨導致的;今天的交易量大漲,需要判斷是有新資金入場、還是存量資金雄起了一把;去醫院體檢,檢查結果為陽性,是因為真的得病了,還是因為醫院的誤診。樸素貝葉斯算法可以利用曆史數據的分布,給你一個最有可能的結果,使你犯錯誤的概率最小化。


1.    一個例子說清楚的事情絕不用定義:

先說一句特別複雜的樸素貝葉斯介紹:樸素貝葉斯法是基於貝葉斯定理,特征條件獨立假設和後驗概率最大化的分類方法。不知道你們看完了什麼感受,反正我是一臉懵逼。下面我用一個小例子讓大家明白這到底是怎麼回事。
舉個例子:某一種病,年輕人得病的概率遠遠小於年長的。如果一個年輕人檢查為陽性,那麼他就能直接被確診嗎?要知道,檢查為陽性,可能會是誤診的哦。這個時候,樸素貝葉斯就登場了。我們不妨把各種可能性列出來,畫一個圖:
圖片名稱
上圖中,箭頭附近的數字表示各種情況的概率。例如,沒病然而檢查為陽性(說明誤診了)的概率是1%,沒病而且檢查為陰性的概率是99%。如果一個年輕人去醫院體檢,體檢結果是有病,那麼這個人到底是有病還是沒病呢?或者說這個人真實得病的概率有多大呢?

有的人可能會說,既然有病的人會有99%的被確診,至少得病的概率比沒病的概率要高吧。其實,一個年輕人檢查出有病,真正得病的概率比沒病的概率還要低!

現在我們來分析下:假設人群中有20000人,按照第一個圖中的患病的概率,18000人是沒有病的,2000人是有病的;在18000個沒有病的人中,年輕人的概率為95%,檢查為陽性的概率為1%,那麼“年輕”並且“檢查為陽性”並且“沒病”的人數一共有18000?95%?1%=17118000?95%?1%=171

18000?95%?1%=171

18000?95%?1%=171

18000\cdot95\%\cdot1\% = 171

人;在2000個有病的人中,年輕人的概率是5%,檢查為陽性的概率是99%。那麼年輕人得病並且被檢查出來的人數為2000?5%?99%=992000?5%?99%=992000?5%?99%=992000?5%?99%=99

2000\cdot5\%\cdot99\% = 99

人。如果我們現在只知道這個人是年輕人,而且檢查結果是陽性:那麼他有可能是本身真的得病並且被檢查出來的人,也有可能是誤診了的人。前者的概率就是99/(99 171)=36.7%99/(99 171)=36.7%99/(99171)=36.7%99/(99 171)=36.7%

99/(99 171)=36.7\%

。後者為171/(99 171)=63.3%171/(99 171)=63.3%171/(99171)=63.3%171/(99 171)=63.3%

171/(99 171)=63.3\%

。很顯然,我們有更大的可能性相信他沒有得病(所以現實生活中,醫生會讓你多複診幾次)。
圖片名稱
在上面的整個分析過程中,我們就分別用到了特征條件獨立假設,貝葉斯定理,條件概率最大化這幾個知識點。下面我們進行詳細說明。

2.    特征的條件獨立假設

我們的目的是通過“目前已知的數據”判斷未知的結果,那麼這個“目前已知的數據”就被稱為特征。在上面判斷有沒有得病的例子中,特征就是這個人“是否年輕”以及“檢查結果是否為陽性”。

這里我們要做一個重要的假設:上述兩個特征之間是獨立的。在判斷這個人有沒有病的時候,我們認為這個人“是否年輕”和“檢查是否為陽性”之間沒有聯系。因此,隨機抽取一個檢查者,他“年輕”並且“檢查結果為陽性”的概率就等於“年輕”的概率乘以“檢查結果為陽性”的概率。

上面這個假設就是條件獨立假設。如果變量不滿足獨立性,則不可以將兩者的概率相乘,比如天空有雲的概率是0.5,下雨的概率是0.33,但下雨和“天空中有雲”不是獨立的,就不能得到“即有雲又下雨”的概率為0.5?0.330.5?0.33

0.5?0.33

0.5?0.33

0.5\cdot0.33

這個結論。

3.貝葉斯定理

貝葉斯定理主要描述在給定特征數據的情況下,判定屬於某個類別的概率。在下面的公式中,樣本的數據用X=xX=x

X=x

X=x

X=x

表示,樣本的類別屬於某個類別用Y=ckY=ckY=ckY=ck

Y=c_k

表示。

P(Y=ck|X=x)=(P(X=x|Y=ck)P(Y=ck))/(kP(X=x|Y=ck)P(Y=ck))P(Y=ck|X=x)=(P(X=x|Y=ck)P(Y=ck))/(kP(X=x|Y=ck)P(Y=ck))

P(Y=ck|X=x)=(P(X=x|Y=ck)P(Y=ck))/(kP(X=x|Y=ck)P(Y=ck))

P(Y=ck|X=x)=(P(X=x|Y=ck)P(Y=ck))/(kP(X=x|Y=ck)P(Y=ck))

P(Y=c_k|X=x)= (P(X=x|Y=c_k)P(Y=c_k))/(\sum_kP(X=x|Y=c_k)P(Y=c_k))


在章節1給出的例子中,注意看我們計算真正得病的公式:

=A/B=99/(99 171)=A/B=99/(99 171)

=A/B=99/(99171)

=A/B=99/(99 171)

年輕人檢查為陽性而真的得病的概率=A/B=99/(99 171)


其中,A為真實得病的人中“檢查為陽性”並且“年輕”的數目,B為人群中所有“檢查為陽性”並且“年輕”的人的數目,其實這個公式就是貝葉斯定理的公式。現在感覺貝葉斯定理是不是簡單了很多。

4.    後驗概率最大化

我們知道一個“年輕”人“檢查為陽性”,現在需要你告訴他有病還是沒病。那麼很顯然,我們只要用上文公式做計算,看看這個“年輕”並且“檢查結果為陽性”的人到底是得病的概率更高,還是沒得病的概率更高。這個就是後驗概率最大化的直觀解釋。在上面的例子中,我們就可以告訴他,檢查結果為陽性也不意味着你就得病了,但是為了安全起見,需要後續跟進複查。

5.    樸素貝葉斯的具體使用-sklearn

上面通過了一個小例子介紹了一下樸素貝葉斯算法的算法原理,但是如何在實際的代碼中使用樸素貝葉斯算法幫助我們完成分類呢?下面介紹下python環境中的樸素貝葉斯算法是如何使用的。

特征是通過收盤價數據計算的SMA,WMA,MOM指標,訓練樣本的特征是從2007-1-4到2016-6-2中截止前一天的SMA,WMA,MOM指標,訓練樣本的類別標簽是2007-1-4日到2016-6-2中每一天的漲跌情況,漲了就是True,跌了就是False,測試樣本是2016-6-3日的三個指標以及漲跌情況。我們可以判定之後判斷結果是正確還是錯誤,如果通過樸素貝葉斯判斷的結果和當天的漲跌情況相符,則輸出True,如果判斷結果和當天的漲跌情況不符,則輸出False。(和SVM那一篇中例子的作用是一樣滴,只是為了展示如何使用,不對預測的準確性做擔保啊)

本文由JoinQuant量化課堂推出,版權歸JoinQuant所有,商業轉載請聯系我們獲得授權,非商業轉載請注明出處。

import talibfrom jqdata import *test_stock = '399300.XSHE'start_date = datetime.date(2007, 1, 4)end_date = datetime.date(2016, 6, 3)trading_days = get_all_trade_days()start_date_index = trading_days.index(start_date)end_date_index = trading_days.index(end_date)x_all = []y_all = []for index in range(start_date_index, end_date_index):# 得到計算指標的所有數據start_day = trading_days[index - 30]end_day = trading_days[index]stock_data = get_price(test_stock, start_date=start_day, end_date=end_day, frequency='daily', fields=['close'])close_prices = stock_data['close'].values#通過數據計算指標# -2是保證獲取的數據是昨天的,-1就是通過今天的數據計算出來的指標sma_data = talib.SMA(close_prices)[-2] wma_data = talib.WMA(close_prices)[-2]mom_data = talib.MOM(close_prices)[-2]features = []features.append(sma_data)features.append(wma_data)features.append(mom_data)label = Falseif close_prices[-1] > close_prices[-2]:label = Truex_all.append(features)y_all.append(label)# 準備算法需要用到的數據x_train = x_all[: -1]y_train = y_all[: -1]x_test = x_all[-1]y_test = y_all[-1]print('data done')
data done
from sklearn.naive_bayes import GaussianNB#開始利用機器學習算法計算clf = GaussianNB()#訓練的代碼clf.fit(x_train, y_train)#得到測試結果的代碼prediction = clf.predict(x_test)# 看看預測對了沒print(prediction == y_test)print('all done')
[ True]
all done
分享到:
舉報財經168客戶端下載

全部回複

0/140

投稿 您想發表你的觀點和看法?

更多人氣分析師

  • 張亦巧

    人氣2208文章4145粉絲45

    暫無個人簡介信息

  • 張迎妤

    人氣1904文章3305粉絲34

    個人專注於行情技術分析,消息面解讀剖析,給予您第一時間方向...

  • 指導老師

    人氣1864文章4423粉絲52

    暫無個人簡介信息

  • 李冉晴

    人氣2320文章3821粉絲34

    李冉晴,專業現貸實盤分析師。

  • 梁孟梵

    人氣2184文章3177粉絲39

    qq:2294906466 了解群指導添加微信mfmacd

  • 王啟蒙現貨黃金

    人氣312文章3438粉絲8

    本人做分析師以來,並專注於貴金屬投資市場,尤其是在現貨黃金...

  • 金泰鉻J

    人氣2328文章3925粉絲51

    投資問答解咨詢金泰鉻V/信tgtg67即可獲取每日的實時資訊、行情...

  • 金算盤

    人氣2696文章7761粉絲125

    高級分析師,混過名校,廝殺於股市和期貨、證券市場多年,專注...

  • 金帝財神

    人氣4760文章8329粉絲119

    本文由資深分析師金帝財神微信:934295330,指導黃金,白銀,...

FX168財經

FX168財經學院

FX168財經

FX168北美