实验步骤:
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|有病)=
p(xi|没病)=
若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)))