机器学习之用Python从零实现贝叶斯分类器

朴素贝叶斯算法简单高效,在处理分类问题上,是应该首先考虑的方法之一。

通过本教程,你将学到朴素贝叶斯算法的原理和Python版本的逐步实现。

更新:查看后续的关于朴素贝叶斯使用技巧的文章“Better Naive Bayes: 12 Tips To Get The Most From The Naive Bayes Algorithm”

朴素贝叶斯分类器,Matt Buck保留部分版权

关于朴素贝叶斯

朴素贝叶斯算法是一个直观的方法,使用每个属性归属于某个类的概率来做预测。你可以使用这种监督性学习方法,对一个预测性建模问题进行概率建模。

给定一个类,朴素贝叶斯假设每个属性归属于此类的概率独立于其余所有属性,从而简化了概率的计算。这种强假定产生了一个快速、有效的方法。

给定一个属性值,其属于某个类的概率叫做条件概率。对于一个给定的类值,将每个属性的条件概率相乘,便得到一个数据样本属于某个类的概率。

我们可以通过计算样本归属于每个类的概率,然后选择具有最高概率的类来做预测。

通常,我们使用分类数据来描述朴素贝叶斯,因为这样容易通过比率来描述、计算。一个符合我们目的、比较有用的算法需要支持数值属性,同时假设每一个数值属性服从正态分布(分布在一个钟形曲线上),这又是一个强假设,但是依然能够给出一个健壮的结果。

预测糖尿病的发生

本文使用的测试问题是“皮马印第安人糖尿病问题”。

这个问题包括768个对于皮马印第安患者的医疗观测细节,记录所描述的瞬时测量取自诸如患者的年纪,怀孕和血液检查的次数。所有患者都是21岁以上(含21岁)的女性,所有属性都是数值型,而且属性的单位各不相同。

每一个记录归属于一个类,这个类指明以测量时间为止,患者是否是在5年之内感染的糖尿病。如果是,则为1,否则为0。

机器学习文献中已经多次研究了这个标准数据集,好的预测精度为70%-76%。

下面是pima-indians.data.csv文件中的一个样本,了解一下我们将要使用的数据。

注意:下载文件,然后以.csv扩展名保存(如:pima-indians-diabetes.data.csv)。查看文件中所有属性的描述。


  1. 6,148,72,35,0,33.6,0.627,50,1 
  2.  
  3. 1,85,66,29,0,26.6,0.351,31,0 
  4.  
  5. 8,183,64,0,0,23.3,0.672,32,1 
  6.  
  7. 1,89,66,23,94,28.1,0.167,21,0 
  8.  
  9. 0,137,40,35,168,43.1,2.288,33,1  

朴素贝叶斯算法教程

教程分为如下几步:

1.处理数据:从CSV文件中载入数据,然后划分为训练集和测试集。

2.提取数据特征:提取训练数据集的属性特征,以便我们计算概率并做出预测。

3.单一预测:使用数据集的特征生成单个预测。

4.多重预测:基于给定测试数据集和一个已提取特征的训练数据集生成预测。

5.评估精度:评估对于测试数据集的预测精度作为预测正确率。

6.合并代码:使用所有代码呈现一个完整的、独立的朴素贝叶斯算法的实现。

1.处理数据

首先加载数据文件。CSV格式的数据没有标题行和任何引号。我们可以使用csv模块中的open函数打开文件,使用reader函数读取行数据。

我们也需要将以字符串类型加载进来属性转换为我们可以使用的数字。下面是用来加载匹马印第安人数据集(Pima indians dataset)的loadCsv()函数。


  1. import csv 
  2.  
  3. def loadCsv(filename): 
  4.  
  5. lines = csv.reader(open(filename, "rb")) 
  6.  
  7. dataset = list(lines) 
  8.  
  9. for i in range(len(dataset)): 
  10.  
  11. dataset[i] = [float(x) for x in dataset[i]] 
  12.  
  13. return dataset  

我们可以通过加载皮马印第安人数据集,然后打印出数据样本的个数,以此测试这个函数。


  1. filename = 'pima-indians-diabetes.data.csv' 
  2.  
  3. dataset = loadCsv(filename) 
  4.  
  5. print('Loaded data file {0} with {1} rows').format(filename, len(dataset))  

运行测试,你会看到如下结果:


  1. Loaded data file iris.data.csv with 150 rows 

下一步,我们将数据分为用于朴素贝叶斯预测的训练数据集,以及用来评估模型精度的测试数据集。我们需要将数据集随机分为包含67%的训练集合和包含33%的测试集(这是在此数据集上测试算法的通常比率)。

下面是splitDataset()函数,它以给定的划分比例将数据集进行划分。


  1. import random 
  2.  
  3. def splitDataset(dataset, splitRatio): 
  4.  
  5.     trainSize = int(len(dataset) * splitRatio) 
  6.  
  7.     trainSet = [] 
  8.  
  9.     copy = list(dataset) 
  10.  
  11.     while len(trainSet) < trainSize: 
  12.  
  13.         index = random.randrange(len(copy)) 
  14.  
  15.         trainSet.append(copy.pop(index)) 
  16.  
  17.     return [trainSet, copy]  

我们可以定义一个具有5个样例的数据集来进行测试,首先它分为训练数据集和测试数据集,然后打印出来,看看每个数据样本最终落在哪个数据集。


  1. dataset = [[1], [2], [3], [4], [5]] 
  2.  
  3. splitRatio = 0.67 
  4.  
  5. train, test = splitDataset(dataset, splitRatio) 
  6.  
  7. print('Split {0} rows into train with {1} and test with {2}').format(len(dataset), train, test)  

运行测试,你会看到如下结果:


  1. Split 5 rows into train with [[4], [3], [5]] and test with [[1], [2]] 

提取数据特征

朴素贝叶斯模型包含训练数据集中数据的特征,然后使用这个数据特征来做预测。

所收集的训练数据的特征,包含相对于每个类的每个属性的均值和标准差。举例来说,如果如果有2个类和7个数值属性,然后我们需要每一个属性(7)和类(2)的组合的均值和标准差,也就是14个属性特征。

在对特定的属性归属于每个类的概率做计算、预测时,将用到这些特征。

我们将数据特征的获取划分为以下的子任务:

  1. 按类别划分数据
  2. 计算均值
  3. 计算标准差
  4. 提取数据集特征
  5. 按类别提取属性特征

按类别划分数据

首先将训练数据集中的样本按照类别进行划分,然后计算出每个类的统计数据。我们可以创建一个类别到属于此类别的样本列表的的映射,并将整个数据集中的样本分类到相应的列表。

下面的SeparateByClass()函数可以完成这个任务:


  1. def separateByClass(dataset): 
  2.  
  3.     separated = {} 
  4.  
  5.     for i in range(len(dataset)): 
  6.  
  7.         vector = dataset[i] 
  8.  
  9.         if (vector[-1] not in separated): 
  10.  
  11.             separated[vector[-1]] = [] 
  12.  
  13.         separated[vector[-1]].append(vector) 
  14.  
  15.     return separated  

可以看出,函数假设样本中最后一个属性(-1)为类别值,返回一个类别值到数据样本列表的映射。

我们可以用一些样本数据测试如下:


  1. dataset = [[1,20,1], [2,21,0], [3,22,1]] 
  2.  
  3. separated = separateByClass(dataset) 
  4.  
  5. print('Separated instances: {0}').format(separated)  

运行测试,你会看到如下结果:


  1. Separated instances: {0: [[2, 21, 0]], 1: [[1, 20, 1], [3, 22, 1]]} 

计算均值

我们需要计算在每个类中每个属性的均值。均值是数据的中点或者集中趋势,在计算概率时,我们用它作为高斯分布的中值。

我们也需要计算每个类中每个属性的标准差。标准差描述了数据散布的偏差,在计算概率时,我们用它来刻画高斯分布中,每个属性所期望的散布。

标准差是方差的平方根。方差是每个属性值与均值的离差平方的平均数。注意我们使用N-1的方法(译者注:参见无偏估计),也就是在在计算方差时,属性值的个数减1。


  1. import math 
  2.  
  3. def mean(numbers): 
  4.  
  5.     return sum(numbers)/float(len(numbers)) 
  6.  
  7.   
  8.  
  9. def stdev(numbers): 
  10.  
  11.     avg = mean(numbers) 
  12.  
  13.     variance = sum([pow(x-avg,2) for x in numbers])/float(len(numbers)-1) 
  14.  
  15.     return math.sqrt(variance)  

通过计算从1到5这5个数的均值来测试函数。


  1. numbers = [1,2,3,4,5] 
  2.  
  3. print('Summary of {0}: mean={1}, stdev={2}').format(numbers, mean(numbers), stdev(numbers))  

运行测试,你会看到如下结果:


  1. Summary of [1, 2, 3, 4, 5]: mean=3.0, stdev=1.58113883008 

提取数据集的特征

现在我们可以提取数据集特征。对于一个给定的样本列表(对应于某个类),我们可以计算每个属性的均值和标准差。

zip函数将数据样本按照属性分组为一个个列表,然后可以对每个属性计算均值和标准差。


  1. def summarize(dataset): 
  2.  
  3. summaries = [(mean(attribute), stdev(attribute)) for attribute in zip(*dataset)] 
  4.  
  5. del summaries[-1] 
  6.  
  7. return summaries  

我们可以使用一些测试数据来测试这个summarize()函数,测试数据对于第一个和第二个数据属性的均值和标准差显示出显著的不同。


  1. dataset = [[1,20,0], [2,21,1], [3,22,0]] 
  2.  
  3. summary = summarize(dataset) 
  4.  
  5. print('Attribute summaries: {0}').format(summary)  

运行测试,你会看到如下结果:


  1. Attribute summaries: [(2.0, 1.0), (21.0, 1.0)] 

按类别提取属性特征

合并代码,我们首先将训练数据集按照类别进行划分,然后计算每个属性的摘要。


  1. def summarizeByClass(dataset): 
  2.  
  3.     separated = separateByClass(dataset) 
  4.  
  5.     summaries = {} 
  6.  
  7.     for classValue, instances in separated.iteritems(): 
  8.  
  9.         summaries[classValue] = summarize(instances) 
  10.  
  11.     return summaries  

使用小的测试数据集来测试summarizeByClass()函数。


  1. dataset = [[1,20,1], [2,21,0], [3,22,1], [4,22,0]] 
  2.  
  3. summary = summarizeByClass(dataset) 
  4.  
  5. print('Summary by class value: {0}').format(summary)  

运行测试,你会看到如下结果:


  1. Summary by class value: 
  2.  
  3. {0: [(3.0, 1.4142135623730951), (21.5, 0.7071067811865476)], 
  4.  
  5. 1: [(2.0, 1.4142135623730951), (21.0, 1.4142135623730951)]}  

预测

我们现在可以使用从训练数据中得到的摘要来做预测。做预测涉及到对于给定的数据样本,计算其归属于每个类的概率,然后选择具有最大概率的类作为预测结果。

我们可以将这部分划分成以下任务:

  1. 计算高斯概率密度函数
  2. 计算对应类的概率
  3. 单一预测
  4. 评估精度

计算高斯概率密度函数

给定来自训练数据中已知属性的均值和标准差,我们可以使用高斯函数来评估一个给定的属性值的概率。

已知每个属性和类值的属性特征,在给定类值的条件下,可以得到给定属性值的条件概率。

关于高斯概率密度函数,可以查看参考文献。总之,我们要把已知的细节融入到高斯函数(属性值,均值,标准差),并得到属性值归属于某个类的似然(译者注:即可能性)。

在calculateProbability()函数中,我们首先计算指数部分,然后计算等式的主干。这样可以将其很好地组织成2行。


  1. import math 
  2.  
  3. def calculateProbability(x, mean, stdev): 
  4.  
  5.     exponent = math.exp(-(math.pow(x-mean,2)/(2*math.pow(stdev,2)))) 
  6.  
  7.     return (1 / (math.sqrt(2*math.pi) * stdev)) * exponent  

使用一些简单的数据测试如下:


  1. x = 71.5 
  2.  
  3. mean = 73 
  4.  
  5. stdev = 6.2 
  6.  
  7. probability = calculateProbability(x, mean, stdev) 
  8.  
  9. print('Probability of belonging to this class: {0}').format(probability)  

运行测试,你会看到如下结果:


  1. Probability of belonging to this class: 0.0624896575937 

计算所属类的概率

既然我们可以计算一个属性属于某个类的概率,那么合并一个数据样本中所有属性的概率,最后便得到整个数据样本属于某个类的概率。

使用乘法合并概率,在下面的calculClassProbilities()函数中,给定一个数据样本,它所属每个类别的概率,可以通过将其属性概率相乘得到。结果是一个类值到概率的映射。


  1. def calculateClassProbabilities(summaries, inputVector): 
  2.  
  3.     probabilities = {} 
  4.  
  5.     for classValue, classSummaries in summaries.iteritems(): 
  6.  
  7.         probabilities[classValue] = 1 
  8.  
  9.         for i in range(len(classSummaries)): 
  10.  
  11.             mean, stdev = classSummaries[i] 
  12.  
  13.             x = inputVector[i] 
  14.  
  15.             probabilities[classValue] *= calculateProbability(x, mean, stdev) 
  16.  
  17.     return probabilities  

测试calculateClassProbabilities()函数。


  1. summaries = {0:[(1, 0.5)], 1:[(20, 5.0)]} 
  2.  
  3. inputVector = [1.1, '?'] 
  4.  
  5. probabilities = calculateClassProbabilities(summaries, inputVector) 
  6.  
  7. print('Probabilities for each class: {0}').format(probabilities)  

运行测试,你会看到如下结果:


  1. Probabilities for each class: {0: 0.7820853879509118, 1: 6.298736258150442e-05} 

单一预测

既然可以计算一个数据样本属于每个类的概率,那么我们可以找到最大的概率值,并返回关联的类。

下面的predict()函数可以完成以上任务。


  1. def predict(summaries, inputVector): 
  2.  
  3.     probabilities = calculateClassProbabilities(summaries, inputVector) 
  4.  
  5.     bestLabel, bestProb = None, -1 
  6.  
  7.     for classValue, probability in probabilities.iteritems(): 
  8.  
  9.         if bestLabel is None or probability > bestProb: 
  10.  
  11.             bestProb = probability 
  12.  
  13.             bestLabel = classValue 
  14.  
  15.     return bestLabel  

测试predict()函数如下:


  1. summaries = {'A':[(1, 0.5)], 'B':[(20, 5.0)]} 
  2.  
  3. inputVector = [1.1, '?'] 
  4.  
  5. result = predict(summaries, inputVector) 
  6.  
  7. print('Prediction: {0}').format(result)  

运行测试,你会得到如下结果:


  1. Prediction: A 

多重预测

最后,通过对测试数据集中每个数据样本的预测,我们可以评估模型精度。getPredictions()函数可以实现这个功能,并返回每个测试样本的预测列表。


  1. def getPredictions(summaries, testSet): 
  2.  
  3.     predictions = [] 
  4.  
  5.     for i in range(len(testSet)): 
  6.  
  7.         result = predict(summaries, testSet[i]) 
  8.  
  9.         predictions.append(result) 
  10.  
  11.     return predictions  

测试getPredictions()函数如下。


  1. summaries = {'A':[(1, 0.5)], 'B':[(20, 5.0)]} 
  2.  
  3. testSet = [[1.1, '?'], [19.1, '?']] 
  4.  
  5. predictions = getPredictions(summaries, testSet) 
  6.  
  7. print('Predictions: {0}').format(predictions)  

运行测试,你会看到如下结果:


  1. Predictions: ['A', 'B'] 

计算精度

预测值和测试数据集中的类别值进行比较,可以计算得到一个介于0%~100%精确率作为分类的精确度。getAccuracy()函数可以计算出这个精确率。


  1. def getAccuracy(testSet, predictions): 
  2.  
  3.     correct = 0 
  4.  
  5.     for x in range(len(testSet)): 
  6.  
  7.         if testSet[x][-1] == predictions[x]: 
  8.  
  9.             correct += 1 
  10.  
  11.     return (correct/float(len(testSet))) * 100.0  

我们可以使用如下简单的代码来测试getAccuracy()函数。


  1. testSet = [[1,1,1,'a'], [2,2,2,'a'], [3,3,3,'b']] 
  2.  
  3. predictions = ['a', 'a', 'a'] 
  4.  
  5. accuracy = getAccuracy(testSet, predictions) 
  6.  
  7. print('Accuracy: {0}').format(accuracy)  

运行测试,你会得到如下结果:


  1. Accuracy: 66.6666666667 

合并代码

最后,我们需要将代码连贯起来。

下面是朴素贝叶斯Python版的逐步实现的全部代码。

运行示例,得到如下输出:


  1. Split 768 rows into train=514 and test=254 rows 
  2.  
  3. Accuracy: 76.3779527559%  

实现扩展

这一部分为你提供了扩展思路,你可以将其作为教程的一部分,使用你已经实现的Python代码,进行应用研究。

到此,你已经使用Python一步步完成了高斯版本的朴素贝叶斯。

你可以进一步扩展算法实现:

计算所属类的概率:将一个数据样本归属于每个类的概率更新为一个比率。计算上就是将一个样本数据归属于某个类的概率,比上其归属于每一个类的概率的和。举例来说,一个样本属于类A的概率时0.02,属于类B的概率时0.001,那么样本属于类A的可能性是(0.02/(0.02+0.001))*100
大约为95.23%。

对数概率:对于一个给定的属性值,每个类的条件概率很小。当将其相乘时结果会更小,那么存在浮点溢出的可能(数值太小,以至于在Python中不能表示)。一个常用的修复方案是,合并其概率的对数值。可以研究实现下这个改进。

名词属性:改进算法实现,使其支持名词属性。这是十分相似的,你所收集的每个属性的摘要信息是对于每个类的类别值的比率。潜心学习参考文献来获取更多信息。

不同的密度函数(伯努利或者多项式):我们已经尝试了高斯朴素贝叶斯,你也可以尝试下其他分布。实现一个不同的分布诸如多项分布、伯努利分布或者内核朴素贝叶斯,他们对于属性值的分布 和/或 与类值之间的关系有不同的假设。

学习资源及深入阅读

这一部分提供了一些用于学习更多朴素贝叶斯算法的资源,包括算法理论和工作原理,以及代码实现中的实际问题。

问题

更多学习预测糖尿病发作问题的资源

  • Pima Indians Diabetes Data Set:这个页面提供数据集文件,同时描述了各个属性,也列出了使用该数据集的论文列表
  • Dataset File:数据集文件
  • Dataset Summary:数据集属性的描述
  • Diabetes Dataset Results:许多标准算法在该数据集上的精度

代码

这一部分包含流行的机器学习库中的朴素贝叶斯的开源实现。如果你在考虑实现自己的用于实际使用的版本,可以查阅这些

  • Naive Bayes in Scikit-Learn:scikit-learn库中朴素贝叶斯的实现
  • Naive Bayes documentation:scikit-learn库中关于朴素贝叶斯的文档和样例代码
  • Simple Naive Bayes in Weka:朴素贝叶斯的Weka实现

书籍

你应该有几本机器学习应用的书籍。这一部分高亮出了常用机器学习书籍中关于朴素贝叶斯的章节。

  • Applied Predictive Modeling, page 353
  • Data Mining: Practical Machine Learning Tools and Techniques, page 94
  • Machine Learning for Hackers, page 78
  • An Introduction to Statistical Learning: with Applications in R, page 138
  • Machine Learning: An Algorithmic Perspective, page 171
  • Machine Learning in Action, page 61 (Chapter 4)
  • Machine Learning, page 177 (chapter 6) 

作者:佚名

来源:51CTO

时间: 2024-10-31 11:26:57

机器学习之用Python从零实现贝叶斯分类器的相关文章

【原创】.NET平台机器学习组件-Infer.NET连载(二)贝叶斯分类器

            本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 微软Infer.NET机器学习组件文章目录:http://www.cnblogs.com/asxinyu/p/4329742.html 关于本文档的说明 本文档基于Infer.NET 2.6对Infer.NET User Guide进行中文翻译,但进行了若干简化和提炼,按照原网站的思路进行,但不局限与其顺序. 欢迎传播分享,必须保持原作者的信息,但禁止将

朴素贝叶斯分类器

  所谓分类,就是根据事物的特征(Feature)对其归类(Class)    特征的数据特点有两种可能: 1. 离散/标签 2. 连续/浮点数(大样本/小样本)   下面我们分别来看 一.离散/标签 这是一个病人分类的例子 某个医院早上收了六个门诊病人,如下表. 症状 职业 疾病 打喷嚏 护士 感冒 打喷嚏 农夫 过敏 头痛 建筑工人 脑震荡 头痛 建筑工人 感冒 打喷嚏 教师 感冒 头痛 教师 脑震荡 现在又来了第七个病人,是一个打喷嚏的建筑工人.请问他患上感冒的概率有多大?   根据贝叶斯

机器学习之旅---朴素贝叶斯分类器

def loadDataSet(): postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'], ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'], ['stop', 'posting', 'stupid', 'wo

机器学习算法实践:朴素贝叶斯 (Naive Bayes)

前言 上一篇<机器学习算法实践:决策树 (Decision Tree)>总结了决策树的实现,本文中我将一步步实现一个朴素贝叶斯分类器,并采用SMS垃圾短信语料库中的数据进行模型训练,对垃圾短信进行过滤,在最后对分类的错误率进行了计算. 正文 与决策树分类和k近邻分类算法不同,贝叶斯分类主要借助概率论的知识来通过比较提供的数据属于每个类型的条件概率, 将他们分别计算出来然后预测具有最大条件概率的那个类别是最后的类别.当然样本越多我们统计的不同类型的特征值分布就越准确,使用此分布进行预测则会更加准

《机器学习系统设计:Python语言实现》一1.2 设计原理

1.2 设计原理 我们经常拿系统设计和其他事物的设计进行类比,例如建筑设计.在一定程度上,这种类比是正确的,它们都是依据规格说明,在结构体中放置设计好的组件.但当我们考虑到它们各自的运行环境时,这种类比就会瓦解.在建筑设计上,通常会假设,当景观正确形成后就不会再改变. 软件环境则有些不同.系统是交互和动态的.我们设计的任何系统,诸如电子.物理,或人类,都会嵌入在其他系统中.同样,在计算机网络中有不同的层(应用层.传输层.物理层,等等),具有不同的含义和功能集,所以在项目中,需要在不同的层完成所需

贝叶斯机器学习到底是什么?看完这篇你就懂啦

雷锋网按:不少人都在机器学习的过程中听说过贝叶斯分类器,但它是如何与机器学习建立联系的?作者Zygmunt Zając 提供了一些基础概念,雷锋网也尝试对其中的一些概念进行简化说明,让小白们也能容易地理解贝叶斯在机器学习中所起的作用. 贝叶斯学派与频率主义学派 简单说来,贝叶斯学派认为,概率是一个人对于一件事的信念强度,概率是主观的. 但频率主义学派所持的是不同的观念:他们认为参数是客观存在的, 即使是未知的,但都是固定值,不会改变. 雷锋网参阅了一些资料,尝试以我们以前课堂上所学的概率论来解释

机器学习基础(三)朴素贝叶斯

贝叶斯决策一直很有争议,今年是贝叶斯250周年,历经沉浮,今天它的应用又开始逐渐活跃,有兴趣的可 以看看斯坦福Brad Efron大师对其的反思,两篇文章:"Bayes'Theorem in the 21st Century"和 "A250-YEAR ARGUMENT:BELIEF, BEHAVIOR, AND THE BOOTSTRAP".俺就不参合这事了,下面来看看朴素贝叶 斯分类器. 有时我们想知道给定一个样本时,它属于每个类别的概率是多少,即P(Ci|X),

贝叶斯模型构建分类器的设计与实现

0 引言      于半月前,针对文本分类进行学习,实验的目的是通过对下图1中的不同情感文本构建训练集模型,对应的下图2是对训练集的注释说明.类标0开头为喜悦类别,类标1开头的为愤怒类别,类别2开头的是厌恶类别,类别3开头的为低落类别.4个训练集文本,分别对应4个分类.如何通过训练集构造分类器,并对测试数据进行验证是本课题的最终目的.其中会涉及贝叶斯公式的理解与实现,文本的预处理(下图1中0_simplifyweibo的训练集是处理过的数据如下图),分词工具的使用,不同贝叶斯模型的构造,试验结果

[置顶]白话贝叶斯理论及在足球比赛结果预测中的应用和C#实现

  离去年"马尔可夫链进行彩票预测"已经一年了,同时我也计划了一个彩票数据框架的搭建,分析和预测的框架,会在今年逐步发表,拟定了一个目录,大家有什么样的意见和和问题,可以看看,留言我会在后面的文章中逐步改善:彩票数据框架与分析预测总目录.同时这篇文章也是"[彩票]彩票预测算法(一):离散型马尔可夫链模型C#实现"的兄弟篇.所以这篇文章还有一个标题,应该是:[彩票]彩票预测算法(二):朴素贝叶斯分类器在足球胜平负预测中的应用及C#实现 . 以前了解比较多的是SVM,R