朴素贝叶斯
又到了更新博客的时间了,今天跟大伙聊聊朴素贝叶斯,贝叶斯公式大伙都知道,它长得是这个样子:
用汉字表示为
分母P(x):是全概率公式.
分子P(x|c):表示在c条件下x发生的概率,称之为条件概率。
P©:可以理解为先验概率,样本空间中各类样本所占的
比例,可通过各类样本出现的频率估计(大数定理)
由于我们的训练的数据中,x的类别有很多种,所以P(x|c)这个条件概率公式可以写成下面的形式:
来最后将贝叶斯公式重写一下
按道理说P©和P(x)属于一个定值,我们就是要使得后面的式子值越大,那么这个公式的结果就越大。如果要求它的最大值该怎么办呢?而且它是连乘的。学过概率统计的同学应该晓得用极大似然方法,因为求对数之后可以将乘法变成加法,然后再想办法求极值,这里不仔细介绍了。
由于对所有类别来说P(x) 相同,因此贝叶斯分类器的表达式可以写成:
介绍了这么多贝叶斯的概念到底是要干什么?其实我们只想根据这个公式求出后验概率,明白我们的猜测(先验概率)和推断(后验概率)是否一样。
那什么是朴素贝叶斯,它到底朴素在哪里,其实很简单就是一个物体之间的属性是否独立,越是独立,越是朴素。就像一个人的身高和体重一样他们之间就不朴素,因为身高高的人往往体重会偏重一下,所以他们之间是由联系的,因此就有了办朴素贝叶斯公式,这里不介绍了。
接下来看看代码:
# 贝叶斯算法
from sklearn.naive_bayes import GaussianNB
def create_data():
iris = load_iris()
df = pd.DataFrame(iris.data,columns = iris.feature_names)
df['label'] = iris.target
df.columns = ['sepal length','sepal width','petal length','petal width','label']
data = np.array(df.iloc[:100,:])
# print(data)
return data[:,:-1],data[:,-1]
x,y = create_data()
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3)
clf = GaussianNB()
clf.fit(x_train,y_train)
print(clf.score(x_train,y_train))
print(clf.predict([[4.4,3.2,1.3,0.2]]))
1.0
[0.]