ICTCLAS中文分詞for Lucene.Net介面代碼(實現Analyzer):
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.IO;
5
6using Lucene.Net.Analysis;
7using Lucene.Net.Analysis.Standard;
8
9namespace AspxOn.Search.FenLei
10{
11
12 /**//// <summary>
13 /// ICTCLAS分片語件for Lucene.net介面
14 /// </summary>
15 public class ICTCLASAnalyzer : Analyzer
16 {
17 //定義要過濾的詞
18 public static readonly System.String[] CHINESE_ENGLISH_STOP_WORDS = new string[428];
19 public string NoisePath = Environment.CurrentDirectory + "\\data\\stopwords.txt";
20
21 public ICTCLASAnalyzer()
22 {
23 StreamReader reader = new StreamReader(NoisePath, System.Text.Encoding.Default);
24 string noise = reader.ReadLine();
25 int i = 0;
26
27 while (!string.IsNullOrEmpty(noise))
28 {
29 CHINESE_ENGLISH_STOP_WORDS[i] = noise;
30 noise = reader.ReadLine();
31 i++;
32 }
33
34 }
35
36 /**//**//**//// Constructs a {@link StandardTokenizer} filtered by a {@link
37 /// StandardFilter}, a {@link LowerCaseFilter} and a {@link StopFilter}.
38 ///
39 public override TokenStream TokenStream(System.String fieldName, System.IO.TextReader reader)
40 {
41 TokenStream result = new ICTCLASTokenizer(reader);
42 result = new StandardFilter(result);
43 result = new LowerCaseFilter(result);
44 result = new StopFilter(result, CHINESE_ENGLISH_STOP_WORDS);
45 return result;
46 }
47
48
49 }
50}
ICTCLAS中文分詞for Lucene.Net介面代碼(實現Tokenizer):
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5using Lucene.Net.Analysis;
6using SharpICTCLAS;
7using System.IO;
8
9namespace AspxOn.Search.FenLei
10{
11 public class ICTCLASTokenizer : Tokenizer
12 {
13 int nKind = 1;
14 List<WordResult[]> result;
15 int startIndex = 0;
16 int endIndex = 0;
17 int i = 1;
18 /**//**/
19 /**////
20 /// 待分詞的句子
21 ///
22 private string sentence;
23 /**//**/
24 /**//// Constructs a tokenizer for this Reader.
25 public ICTCLASTokenizer(System.IO.TextReader reader)
26 {
27 this.input = reader;
28 sentence = input.ReadToEnd();
29 sentence = sentence.Replace("\r\n", "");
30 string DictPath = Path.Combine(Environment.CurrentDirectory, "Data") + Path.DirectorySeparatorChar;
31 //Console.WriteLine("正在初始化字典庫,請稍候");
32 WordSegment wordSegment = new WordSegment();
33 wordSegment.InitWordSegment(DictPath);
34 result = wordSegment.Segment(sentence, nKind);
35 }
36
37 /**//**/
38 /**//// 進行切詞,返回數據流中下一個token或者數據流為空時返回null
39 ///
40 public override Token Next()
41 {
42 Token token = null;
43 while (i < result[0].Length - 1)
44 {
45 string word = result[0][i].sWord;
46 endIndex = startIndex + word.Length - 1;
47 token = new Token(word, startIndex, endIndex);
48 startIndex = endIndex + 1;
49
50 i++;
51 return token;
52
53 }
54 return null;
55 }
56
57 }
58}
中文分詞器代碼:
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.IO;
5
6using Lucene.Net.Analysis;
7using Lucene.Net.Analysis.Standard;
8using Lucene.Net.Documents;
9
10using Lucene.Net.Analysis.Cn;
11using Lucene.Net.Analysis.KTDictSeg;
12
13namespace AspxOn.Search.FenLei
14{
15 /**//// <summary>
16 /// 中文分詞器
17 /// </summary>
18 public class ChineseSpliter
19 {
20 public static string Split(string text, string splitToken)
21 {
22 StringBuilder sb = new StringBuilder();
23
24 Analyzer an = new ICTCLASAnalyzer();
25
26 //TokenStream ts = an.ReusableTokenStream("", new StringReader(text));
27
28 TokenStream ts = an.TokenStream("", new StringReader(text));
29
30 Lucene.Net.Analysis.Token token;
31 while ((token = ts.Next()) != null)
32 {
33 sb.Append(splitToken + token.TermText());
34 }
35
36 return sb.ToString().Substring(1);
37 }
38 }
39}
先驗概率計算代碼:
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace AspxOn.Search.FenLei
6{
7 /**//// <summary>
8 /// 先驗概率(事先概率)計算
9 /// </summary>
10 public class PriorProbability
11 {
12 private static TrainingDataManager tdm = new TrainingDataManager();
13
14 /**//// <summary>
15 /// 計算先驗概率
16 /// </summary>
17 /// <param name="c">給定的分類</param>
18 /// <returns>給定條件下的先驗概率</returns>
19 public static float CaculatePc(string c)
20 {
21 float ret = 0F;
22 float Nc = tdm.(c);
23 float N = tdm.GetTrainFileCount();
24 ret = Nc / N;
25 return ret;
26 }
27 }
28}
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace AspxOn.Search.FenLei
6{
7 /**//// <summary>
8 /// 條件概率計算
9 /// </summary>
10 public class ClassConditionalProbability
11 {
12
13 private static TrainingDataManager tdm = new TrainingDataManager();
14 private static float M = 0F;
15
16 /**//// <summary>
17 /// 類條件概率
18 /// </summary>
19 /// <param name="x">給定關鍵字</param>
20 /// <param name="c">給定分類</param>
21 /// <returns></returns>
22 public static float CaculatePxc(string x, string c)
23 {
24 float ret = 0F;
25 float Nxc = tdm.(c, x);
26 float Nc = tdm.(c);
27 float V = tdm.GetTrainingClassifications().Length;
28
29 ret = (Nxc + 1) / (Nc + V + M);//為避免出現0這樣的極端情況,進行加權處理
30
31 return ret;
32 }
33 }
34}
⑵ 如何使用JavaScript構建機器學習模型
如何使用JavaScript構建機器學習模型
目前,機器學習領域建模的主要語言是 Python 和 R,前不久騰訊推出的機器學習框架 Angel 則支持 Java 和 Scala。本文作者 Abhishek Soni 則用行動告訴我們,開發機器學習模型,JavaScript 也可以。
JavaScript?我不是應該使用 Python 嗎?甚至 Scikit-learn 在 JavaScript 上都不工作。
這是可能的,實際上,連我自己都驚訝於開發者對此忽視的態度。就 Scikit-learn 而言,Javascript 的開發者事實上已經推出了適用的庫,它會在本文中有所提及。那麼,讓我們看看 Javascript 在機器學習上能夠做什麼吧。
根據人工智慧先驅 Arthur Samuel 的說法,機器學習為計算機提供了無需明確編程的學習能力。換句話說,它使得計算機能夠自我學習並執行正確的指令,無需人類提供全部指導。
谷歌已經把自己移動優先的策略轉換到人工智慧優先很久了。
為什麼 JavaScript 在機器學習界未被提及過?
慢(真的假的?)
矩陣操作很困難(這里有庫,比如 math.js)
僅用於 Web 開發(然而這里還有 Node.js)
機器學習庫通常是在 Python 上的(還好,JS 的開發者人數也不少)
在 JavaScript 中有一些可供使用的預制庫,其中包含一些機器學習演算法,如線性回歸、SVM、樸素貝葉斯等等,以下是其中的一部分。
brain.js(神經網路)
Synaptic(神經網路)
Natural(自然語言處理)
ConvNetJS(卷積神經網路)
mljs(一組具有多種功能的子庫)
首先,我們將使用 mljs 回歸庫來進行一些線性回歸操作。
參考代碼:https://github.com/abhisheksoni27/machine-learning-with-js
1. 安裝庫
ml-regression 正如其名,負責機器學習的線性回歸。
csvtojson 是一個用於 node.js 的快速 CSV 解析器,它允許載入 CSV 數據文件並將其轉換為 JSON。
2. 初始化並載入數據
下載數據文件(.csv),並將其加入你的項目。
鏈接:http://www-bcf.usc.e/~gareth/ISL/Advertising.csv
如果你已經初始化了一個空的 npm 項目,打開 index.js,輸入以下代碼。
我把文件放在了項目的根目錄下,如果你想放在其他地方,請記得更新 csvFilePath。
現在我們使用 csvtojson 的 fromFile 方法載入數據文件:
3. 打包數據,准備執行
JSON 對象被存儲在 csvData 中,我們還需要輸入數據點數組和輸出數據點。我們通過一個填充 X 和 Y 變數的 dressData 函數來運行數據。
4. 訓練模型開始預測
數據已經打包完畢,是時候訓練我們的模型了。
為此,我們需要寫一個 performRegression 函數:
performRegression 函數有一個方法 toString,它為浮點輸出獲取一個名為 precision 的參數。predictOutput 函數能讓你輸入數值,然後將模型的輸出傳到控制台。它是這樣的(注意,我使用的是 Node.js 的 readline 工具):
以下是為了增加閱讀用戶的代碼
5. 大功告成!
遵循以上步驟,你的 index.js 應該是這樣:
到你的終端上運行 node index.js,得到的輸出會是這樣:
恭喜!你剛剛在 JavaScript 中訓練了第一個線性回歸模型。
⑶ 貝葉斯分類演算法的分類
(1) 樸素貝葉斯演算法
設每個數據樣本用一個n維特徵向量來描述n個屬性的值,即:X={x1,x2,…,xn},假定有m個類,分別用C1, C2,…,Cm表示。給定一個未知的數據樣本X(即沒有類標號),若樸素貝葉斯分類法將未知的樣本X分配給類Ci,則一定是
P(Ci|X)>P(Cj|X) 1≤j≤m,j≠i
根據貝葉斯定理
由於P(X)對於所有類為常數,最大化後驗概率P(Ci|X)可轉化為最大化先驗概率P(X|Ci)P(Ci)。如果訓練數據集有許多屬性和元組,計算P(X|Ci)的開銷可能非常大,為此,通常假設各屬性的取值互相獨立,這樣
先驗概率P(x1|Ci),P(x2|Ci),…,P(xn|Ci)可以從訓練數據集求得。
根據此方法,對一個未知類別的樣本X,可以先分別計算出X屬於每一個類別Ci的概率P(X|Ci)P(Ci),然後選擇其中概率最大的類別作為其類別。
樸素貝葉斯演算法成立的前提是各屬性之間互相獨立。當數據集滿足這種獨立性假設時,分類的准確度較高,否則可能較低。另外,該演算法沒有分類規則輸出。
(2) TAN演算法(樹增強型樸素貝葉斯演算法)
TAN演算法通過發現屬性對之間的依賴關系來降低NB中任意屬性之間獨立的假設。它是在NB網路結構的基礎上增加屬性對之間的關聯(邊)來實現的。
實現方法是:用結點表示屬性,用有向邊表示屬性之間的依賴關系,把類別屬性作為根結點,其餘所有屬性都作為它的子節點。通常,用虛線代表NB所需的邊,用實線代表新增的邊。屬性Ai與Aj之間的邊意味著屬性Ai對類別變數C的影響還取決於屬性Aj的取值。
這些增加的邊需滿足下列條件:類別變數沒有雙親結點,每個屬性有一個類別變數雙親結點和最多另外一個屬性作為其雙親結點。
找到這組關聯邊之後,就可以計算一組隨機變數的聯合概率分布如下:
其中ΠAi代表的是Ai的雙親結點。由於在TAN演算法中考慮了n個屬性中(n-1)個兩兩屬性之間的關聯性,該演算法對屬性之間獨立性的假設有了一定程度的降低,但是屬性之間可能存
在更多其它的關聯性仍沒有考慮,因此其適用范圍仍然受到限制。
⑷ 貝葉斯演算法是什麼
貝葉斯演算法是統計學的一種分類方法,它是一類利用概率統計知識進行分類的演算法。在許多場合,樸素貝葉斯(Naïve Bayes,NB)分類演算法可以與決策樹和神經網路分類演算法相媲美,該演算法能運用到大型資料庫中,而且方法簡單、分類准確率高、速度快。
由於貝葉斯定理假設一個屬性值對給定類的影響獨立於其它屬性的值,而此假設在實際情況中經常是不成立的,因此其分類准確率可能會下降。為此,就衍生出許多降低獨立性假設的貝葉斯分類演算法,如TAN(tree augmented Bayes network)演算法。
貝葉斯演算法的主要步驟:
1、收集大量的垃圾郵件和非垃圾郵件,建立垃圾郵件集和非垃圾郵件集。
2、提取郵件主題和郵件體中的獨立字元串,例如ABC32,¥234等作為TOKEN串並統計提取出的TOKEN串出現的次數即字頻。按照上述的方法分別處理垃圾郵件集和非垃圾郵件集中的所有郵件。
3、每一個郵件集對應一個哈希表,hashtable_good對應非垃圾郵件集而hashtable_bad對應垃圾郵件集。表中存儲TOKEN串到字頻的映射關系。
⑸ 用C++完成貝葉斯分類演算法的設計與實現
你演算法都有了,那報告上無非是寫寫啥是貝葉斯分類演算法,自己選用什麼開發工作實現,大體上的代碼結構(設計那些類,類的功能和層次關系)不就ok了嗎,老師又不會看你代碼,你就是寫一坨字母上去估計也能通過開題報告。天下文章一大抄,奉勸兄台要善於綜合利用。
⑹ 貝葉斯分類演算法的基本步驟
主要有以下7個步驟:
1. 收集大量的垃圾郵件和非垃圾郵件,建立垃圾郵件集和非垃圾郵件集。
2. 提取郵件主題和郵件體中的獨立字元串,例如 ABC32,¥234等作為TOKEN串並統計提取出的TOKEN串出現的次數即字頻。按照上述的方法分別處理垃圾郵件集和非垃圾郵件集中的所有郵件。
3. 每一個郵件集對應一個哈希表,hashtable_good對應非垃圾郵件集而hashtable_bad對應垃圾郵件集。表中存儲TOKEN串到字頻的映射關系。
4. 計算每個哈希表中TOKEN串出現的概率P=(某TOKEN串的字頻)/(對應哈希表的長度)。
5. 綜合考慮hashtable_good和hashtable_bad,推斷出當新來的郵件中出現某個TOKEN串時,該新郵件為垃圾郵件的概率。數學表達式為:
A 事件 ---- 郵件為垃圾郵件;
t1,t2 …….tn 代表 TOKEN 串
則 P ( A|ti )表示在郵件中出現 TOKEN 串 ti 時,該郵件為垃圾郵件的概率。
設
P1 ( ti ) = ( ti 在 hashtable_good 中的值)
P2 ( ti ) = ( ti 在 hashtable_ bad 中的值)
則 P ( A|ti ) =P2 ( ti ) /[ ( P1 ( ti ) +P2 ( ti ) ] ;
6. 建立新的哈希表hashtable_probability存儲TOKEN串ti到P(A|ti)的映射
7. 至此,垃圾郵件集和非垃圾郵件集的學習過程結束。根據建立的哈希表 hashtable_probability可以估計一封新到的郵件為垃圾郵件的可能性。
當新到一封郵件時,按照步驟2,生成TOKEN串。查詢hashtable_probability得到該TOKEN 串的鍵值。
假設由該郵件共得到N個TOKEN 串,t1,t2…….tn,hashtable_probability中對應的值為 P1 , P2 , ……PN , P(A|t1 ,t2, t3……tn) 表示在郵件中同時出現多個TOKEN串t1,t2……tn時,該郵件為垃圾郵件的概率。
由復合概率公式可得
P(A|t1 ,t2, t3……tn)=(P1*P2*……PN)/[P1*P2*……PN+(1-P1)*(1-P2)*……(1-PN)]
當 P(A|t1 ,t2, t3……tn) 超過預定閾值時,就可以判斷郵件為垃圾郵件。
⑺ 如何利用貪心法構建貝葉斯網路代碼
基於matlab的貝葉斯網路工具箱BNT是kevin p.murphy基於matlab語言開發的關於貝葉斯網路學習的開源軟體包,提供了許多貝葉斯網路學習的底層基礎函數庫,支持多種類型的節點(概率分布)、精確推理和近似推理、參數學習及結構學習、靜態模型和動態模型。
貝葉斯網路表示:BNT中使用矩陣方式表示貝葉斯網路,即若節點i到j有一條弧,則對應矩陣中(i,j)值為1,否則為0。
結構學習演算法函數:BNT中提供了較為豐富的結構學習函數,都有:
1. 學習樹擴展貝葉斯網路結構的TANC演算法learn_struct_tan().
2. 數據完整條件下學習一般貝葉斯網路結構的K2演算法learn_struct_k2()、貪婪搜索GS(greedy search)演算法learn_struct_gs()和爬山HC(hill climbing)演算法learn_struct_hc()等。
3. 缺失數據條件下學習一般貝葉斯網路結構的最大期望EM(expectation maximization)演算法learn_struct_EM()和馬爾科夫鏈蒙特卡羅MCMC(Markov Chain Monte Carlo)learn_struct_mcmc()演算法等。
參數學習演算法函數:BNT中也提供了豐富的參數學習函數,都有:
1. 完整數據時,學習參數的方法主要有兩種:最大似然估計learn_params()和貝葉斯方法bayes_update_params();
2. 數據缺失時,如果已知網路拓撲結構,用EM演算法來計算參數,倘若未知網路拓撲結構,使用結構最大期望SEM(structure EM)演算法learn_struct_SEM()。
推理機制及推理引擎:為了提高運算速度,使各種推理演算法能夠有效應用,BNT工具箱採用了引擎機制,不同的引擎根據不同的演算法來完成模型轉換、細化和求解。這個推理過程如下:
BNT中提供了多種推理引擎,都有:
1. 聯合樹推理引擎jtree_inf_engine();
2. 全局聯合樹推理引擎global_joint_inf_engine();
3. 信念傳播推理引擎 belprop_inf_engine();
4. 變數消元推理引擎 var_elim_inf_engine().
⑻ 樸素貝葉斯演算法的原理是什麼
樸素貝葉斯分類(NBC)是以貝葉斯定理為基礎並且假設特徵條件之間相互獨立的方法,以特徵詞之間獨立作為前提假設,學習從輸入到輸出的聯合概率分布,再基於學習到的模型。
樸素貝葉斯法是基於貝葉斯定理與特徵條件獨立假設的分類方法。
最為廣泛的兩種分類模型是決策樹模型(Decision Tree Model)和樸素貝葉斯模型(Naive Bayesian Model,NBM)。和決策樹模型相比,樸素貝葉斯分類器(Naive Bayes Classifier 或 NBC)發源於古典數學理論,有著堅實的數學基礎,以及穩定的分類效率。
同時,NBC模型所需估計的參數很少,對缺失數據不太敏感,演算法也比較簡單。理論上,NBC模型與其他分類方法相比具有最小的誤差率。但是實際上並非總是如此,這是因為NBC模型假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,這給NBC模型的正確分類帶來了一定影響。
樸素貝葉斯演算法(Naive Bayesian algorithm) 是應用最為廣泛的分類演算法之一。
樸素貝葉斯方法是在貝葉斯演算法的基礎上進行了相應的簡化,即假定給定目標值時屬性之間相互條件獨立。也就是說沒有哪個屬性變數對於決策結果來說佔有著較大的比重,也沒有哪個屬性變數對於決策結果佔有著較小的比重。
雖然這個簡化方式在一定程度上降低了貝葉斯分類演算法的分類效果,但是在實際的應用場景中,極大地簡化了貝葉斯方法的復雜性。