机器学习入门实战--朴素贝叶斯分类器对皮马人糖尿病数据进行预测

实验步骤:

1.划分训练集和测试集

2.计算训练集中患病的概率和没病的概率

3.计算训练集中每个特征向量的均值和方差

4.将测试集中的每个特征向量代入公式中,其中σ为训练集中该特征的方差,μ为训练集中该特征的均值。

例如:训练集中患病的数据中各个特征的均值分别为μ1,μ2,...,μn,方差为σ1,σ2,...,σn。没病的各个特征的均值分别为μ'1,μ'2,...,μ'n,方差分别为σ'1,...,σ'n

现在有一个人的特征向量v=[x1,x2,...,xn],请问这个人是否患病?

p(有病)=p(x1|有病)*p(x2|有病)*...*p(xn|有病)*p(有病)

p(没病)=p(x1|没病)*p(x2|没病)*...*p(xn|没病)*p(没病)

p(xi|有病)=\frac{1}{\sqrt{2\pi \sigma _{i}}}exp(-\frac{(x_{i}-\mu _{i})^{2}}{2\sigma _{i}^{2}})

p(xi|没病)=\frac{1}{\sqrt{2\pi \sigma^{^{'}} _{i}}}exp(-\frac{(x_{i}-\mu^{'} _{i})^{2}}{2\sigma _{i}^{'2}})

 若p(有病)>p(没病),则这个人患病,反之则没病。

import numpy as np

data=np.loadtxt(r"pima-indians-diabetes/pima-indians-diabetes.data.csv",delimiter=",")

def separated(data,s=0.7):
    n=len(data)
    train_data=data[0:int(s*n),:]

    test_data=data[int(n*s):,:]
    return train_data,test_data
# print(separated(data,0.7))
train_data,test_data=separated(data,0.7)
# print(len(train_data),len(test_data))

train_yes=np.where(train_data[:,-1]==1.0)
train_yes=np.squeeze(train_data[train_yes,0:])

train_not=np.where(train_data[:,-1]==0.0)
train_not=np.squeeze(train_data[train_not,0:])

# print(len(train_yes),len(train_not))

test_yes=np.where(test_data[:,-1]==1.0)
test_yes=np.squeeze(test_data[test_yes,0:])
test_not=np.where(test_data[:,-1]==0.0)
test_not=np.squeeze(test_data[test_not,0:])
# print(len(test_yes),len(test_not))

p_train_get=round(len(train_yes)/(len(train_data)),4)
p_train_not=round(len(train_not)/len(train_data),4)
# print(p_train_get,p_train_not)
p_test_get=round(len(test_yes)/(len(test_data)),4)
p_test_not=round(len(test_not)/(len(test_data)),4)
# print(p_test_get,p_test_not)


def process(num_list):
    mean_list=[]
    var_list=[]
    for i in range(9):
        vector=num_list[:,i]
        fm=np.mean(vector)
        # fm=round(float(fm),4)
        mean_list.append(fm)
        fv=np.var(vector,ddof=1)
        # fv=round(float(fv),4)
        var_list.append(fv)
    del mean_list[-1]
    del var_list[-1]
    return mean_list,var_list

def normal_probability(feature_vector,mean_list,var_list):
    n=len(feature_vector[:-1])
    feature_prob=[]
    for i in range(n):
        miu=mean_list[i]
        sigma=var_list[i]
        x=feature_vector[i]
        fx=np.exp(- ((x-miu)**2 / (2 * sigma))) / np.sqrt(2 * np.pi * sigma)
        feature_prob.append(fx)
    return feature_prob
def predict(f_yes_p,f_not_p,p_get,p_not):
    y=1
    n=1

    for i in range(len(f_yes_p)):
        y*=f_yes_p[i]
    y=y*p_get
    for j in range(len(f_not_p)):
        n*=f_not_p[j]
    n=n*p_not


    if y>n:
        res=1
    else:
        res=0

    return res



mean_yes,var_yes=process(train_yes)
mean_not,var_not=process(train_not)
#训练集的均值和方差
print(mean_yes,var_yes)

if __name__ == '__main__':

    c=0
    for i in range(len(test_data)):
        v=test_data[i]

        f_yes_p=normal_probability(v,mean_yes,var_yes)
        f_not_p=normal_probability(v,mean_not,var_not)
        res=predict(f_yes_p,f_not_p,p_test_get,p_test_not)
        if res==v[-1]:
            c=c+1
print("准确率为{:.2f}".format(c/len(test_data)))

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值