前段時間AlphaGo和李世石廣受關注,做爲人工智能的腦殘粉,看完比賽後激動不已,由於有必定的機器學習的基礎,便打算擼一個棋類的AI,但我還算有點自知之明,圍棋AI,甚至google打算作得通用AI是作不出的了,因此打算擼一個五子棋的AI。html
選取五子棋做爲試手項目主要是如下幾點緣由:前端
規則簡單。爲了簡單起見,BetaMeow只要有一方練成五子就能夠判輸贏。python
受衆多。由於五子棋的規則相對簡單,使得其受衆遠比圍棋多,換句話來講,我把BetaMeow作出來了,那麼能夠測試的人也多。git
近年機器學習
,數據挖掘
,人工智能
很火,但其實很多人對這些名詞實際上是一頭霧水,我嘗試用我本身的語言解釋,若是有什麼須要完善的地方,歡迎提出。github
好比說,有一個模型可以可以根據一我的的社交動態,推斷出他是喜歡蘋果仍是香蕉,那麼,我如今想知道某個社交平臺上市喜歡蘋果的人多,仍是喜歡香蕉的人多。顯然,我把社交平臺的數據扔進模型中跑一遍就能夠了,但社交平臺數據確定不是說一兩個txt文件這麼簡單啊。這時就可能涉及網絡爬蟲(收集數據),分佈式存儲(數據量巨大的時候),過濾無關的數據(數據清洗),修改模型使得符合當前業務場景(花式調參),跑完數據得到結果後決定採起什麼商業措施等。(BI)算法
機器學習就是負責考慮如何創建模型,而數據挖掘則是負責其餘地方,不過通常來講,數據挖掘部分的工做可能會分開幾個部門來作。bootstrap
簡言之,機器學習是內功,而數據挖掘則是機器學習的一種用途。而人工智能,就是更廣的概念了segmentfault
回到正題上,傳統的五子棋AI採用的搜索算法,這個方面其實已經很完善,聽聞已經出現了無解的結果(玩家沒法取勝)。但BetaMeow本質上是我在學習機器學習方面的實戰項目,因此我想辦法利用機器學習的方面的算法實現。網絡
最後選擇決策樹算法。經過決策樹判斷該局的情況,屬於對方(玩家)佔優仍是己方(AI)佔優。機器學習
至於什麼叫決策樹,有時真的是一圖勝千言。
圖片來至於http://www.52analysis.com/shujuwajue/2441.html
簡單來講,經過一層層的篩選下來,你就能得到相應的結果。
關於如何構建決策樹,若是須要了解文字說明,能夠參考這裏,若是須要參考python的代碼實現,能夠參考下文給出的github地址,這裏只給出簡單總結。
在一個二維集合(能夠當作矩陣)中,第二維表明每個決策的實例,用某種方式(例如信息增益(首先要計算熵))在肯定一個最佳分割點(p),而後以該點做爲根節點,此時剩下的子集有兩種狀況,要麼做爲決策樹的結果,要麼遞歸下去建立子樹。
有句話叫好的數據賽過好的模型,通過這番實踐我算是真正認識到這句話的意思。機器學習的算法不是你隨便扔一個數據集下去,他都能訓練出一個有效的模型。我曾經把整個棋局扔給他它訓練,然而並無什麼亂用。幾番周折才角色以連子形式做爲訓練的內容。
舉個例子
[1,1,0,1,2]
這個訓練集代表,玩家的連子形式已是1,1,0,1(0表示空位),若是玩家順利連成了4子,那麼AI則完全出於劣勢,由於若是4子是在棋盤中間的話,那麼ai只能堵一邊,玩家仍是能夠在另外一邊連成5子。
因此ai應該下在2號位,阻止其連成4子。
個人代碼中有大量如此的數據,用於教會ai決定是及時阻止對方,仍是提升本身的連子數。(跑兩次不一樣的決策樹)
BetaMeow如今顯然是不完善的。
首先是五子棋規則的自己,首先是五子棋棋盤應該15x15
,而後無知的我把它弄成了19x19
,而後規前後手的規則好像也有不一樣的規定,但我沒有考慮太多這方面,畢竟個人主要目的是機器學習的實踐,並不是作出一個五子棋遊戲。五子棋只是一個載體。
一樣是由於個人目的在於算法,因此界面不太美觀,甚至在不一樣分辨率上可能有問題(使用的bootstrap應該問題不大),因此若是有較爲熟悉前端的朋友,歡迎修改修改後Pull Requese給我。
第二點,算法自己也有不完善的地方。
由於目前的方案是遍歷棋局,分析各店的形式,可能由於循環的緣由,會致使後面的選擇覆蓋掉前一個選擇,從而錯過了一些最好的選擇。
下一步會是給每個選擇的結果加上權重,從而避免上述問題。
嗯,說了這麼多,最後給出這個項目的github地址
重要的事情再說一遍。
前端真的作得很爛,若是有熟悉前端的朋友幫我修改一下,真的萬分感謝。
這個github地址會記錄下我學習機器學習和數據挖掘的各類小項目(包括我以前的圖片識別的項目),將會持續更新很長一段時間,若是你對這個有興趣,歡迎關注和支持。
若是你也有機器學習和數據挖掘等相關的項目,歡迎推薦給我,你們互相學習的同時,我也會在個人項目的README中給出你項目的URL(你也要給出我項目的URL哦,親)
感謝關注和支持。