从头开始在Python中实现高斯朴素贝叶斯
Naive Bayes是一种非常方便,流行且重要的机器学习算法,尤其适用于文本分析和一般分类。在本文中,我将讨论高斯朴素贝叶斯:算法,其实现和应用于微型维基百科数据集(维基百科中给出的数据集)。
算法:
高斯朴素贝叶斯算法是一种概率算法。它涉及到对数据集中的类和给定类的测试数据分别进行先验概率和后验概率的计算。
先验概率的数学公式…eq-1)
所有类的先验概率都使用相同的公式计算。
eq-2)
给定c类的测试数据x的后验概率的数学公式,它是给定c类的测试数据的所有特征的条件概率的乘积 .....eq-2)
但是,如何获得给定类的测试数据特征的条件概率呢?
这由从高斯(正常)分布获得的概率给出。
eq-3)
给定一个类和x_i是一个测试数据特征,得到该测试特征的条件概率的数学表达式,c是一个类和相关的样本方差σ².....eq-3)
最后,使用贝叶斯定理计算给定实例(测试实例)的每个类的条件概率。
给定测试数据x, c_i类条件概率的数学表达式 ... eq-4)
对所有类重复等式4),并且显示最高概率的类最终被声明为预测结果。
从头开始在Python中实现:
如前所述,从头开始编写算法时,除了Numpy(它为Python提供了matlab类型的环境)和列表/字典相关的库之外,没有使用其他库。4个模块实现了高斯朴素贝叶斯二元分类,每个模块执行不同的操作。
=> pre_prob():它通过将标签集y作为输入,按照eq-1)返回2个类的先验概率。Python实现如下:
# Importing necessary libraries... import collections import numpy as np def pre_prob(y): y_dict = collections.Counter(y) pre_probab = np.ones(2) for i in range(0, 2): pre_probab[i] = y_dict[i]/y.shape[0] return pre_probab
=> mean_var():在给定特征集X和标签集y作为输入的情况下,该函数返回2个类标签(二元分类)的所有特征的均值和方差。Python实现如下:
def mean_var(X, y): n_features = X.shape[1] m = np.ones((2, n_features)) v = np.ones((2, n_features)) n_0 = np.bincount(y)[np.nonzero(np.bincount(y))[0]][0] x0 = np.ones((n_0, n_features)) x1 = np.ones((X.shape[0] - n_0, n_features)) k = 0 for i in range(0, X.shape[0]): if y[i] == 0: x0[k] = X[i] k = k + 1 k = 0 for i in range(0, X.shape[0]): if y[i] == 1: x1[k] = X[i] k = k + 1 for j in range(0, n_features): m[0][j] = np.mean(x0.T[j]) v[0][j] = np.var(x0.T[j])*(n_0/(n_0 - 1)) m[1][j] = np.mean(x1.T[j]) v[1][j] = np.var(x1.T[j])*((X.shape[0]-n_0)/((X.shape[0] - n_0) - 1)) return m, v # mean and variance
=> prob_feature_class():通过将均值m,方差v和测试数据x作为输入,返回给定类c(eq-2)的测试数据x的后验概率的函数。Python时如下:
def prob_feature_class(m, v, x): n_features = m.shape[1] pfc = np.ones(2) for i in range(0, 2): product = 1 for j in range(0, n_features): product = product * (1/sqrt(2*3.14*v[i][j])) * exp(-0.5 * pow((x[j] - m[i][j]),2)/v[i][j]) pfc[i] = product return pfc
=> GNB():最后通过获取测试实例x(eq-4)来计算2个类中每个类的条件概率。特征集X,标签集y和测试数据x作为输入并返回
- 所有特征的2个等级的平均值
- 所有特征的2个类的方差
- 数据集中2个类的先验概率
- 测试数据的后验概率给出了每类2类
- 给定这两类中的每一类的测试数据的后验概率
- 高斯朴素贝叶斯算法给出的最终预测
GNB()的Python实现如下:
def GNB(X, y, x): m, v = mean_var(X, y) pfc = prob_feature_class(m, v, x) pre_probab = pre_prob(y) pcf = np.ones(2) total_prob = 0 for i in range(0, 2): total_prob = total_prob + (pfc[i] * pre_probab[i]) for i in range(0, 2): pcf[i] = (pfc[i] * pre_probab[i])/total_prob prediction = int(pcf.argmax()) return m, v, pre_probab, pfc, pcf, prediction
高斯朴素贝叶斯在微型数据集中的应用
维基百科中给出的样本性别数据集已用于实施的高斯朴素贝叶斯的应用。
朴素贝叶斯分类器--Dataset(https://en.wikipedia.org/wiki/Naive_Bayes_classifier#Sex_classification)
问题陈述:“ 考虑到身高(以英尺为单位),体重(以磅为单位)和足部尺寸(以英寸为单位),预测该人是男性还是女性 ”
=>数据读取使用Pandas完成,因为数据集包含列的文本标题。
import pandas as pd import numpy as np data = pd.read_csv('gender.csv', delimiter = ',') data.head()
=>对Wikipedia中使用的测试实例执行4-module-Gaussian Naive Bayes。
朴素贝叶斯分类器 - 测试(https://en.wikipedia.org/wiki/Naive_Bayes_classifier#Testing)
# converting from pandas to numpy ... X_train = np.array(data.iloc[:,[1,2,3]]) y_train = np.array(data['Person']) for i in range(0,y_train.shape[0]): if y_train[i] == "Female": y_train[i] = 0 else: y_train[i] = 1 x = np.array([6, 130, 8]) # test instance used in Wikipedia # executing the Gaussian Naive Bayes for the test instance... m, v, pre_probab, pfc, pcf, prediction = GNB(X_train, y_train, x) print(m) # Output given below...(mean for 2 classes of all features) print(v) # Output given below..(variance for 2 classes of features) print(pre_probab) # Output given below.........(prior probabilities) print(pfc) # Output given below............(posterior probabilities) print(pcf) # Conditional Probability of the classes given test-data print(prediction) # Output given below............(final prediction)
所有特征(列)的2个类(行)的均值
所有特征(列)的2类(行)的样本方差
类的先验概率, Female and Male
给出两个类别中的每一个的测试数据的后验概率
给出测试数据的2个类的最终条件概率
最终预测
最后,计算和预测结果符合使用相同数据集的Wikipedia中显示的结果。