Python_实现简单贝叶斯分类

来源:互联网 发布:梵高传 知乎 编辑:程序博客网 时间:2024/06/16 08:55


import numpy#先生成原始数据n1=200;n2=40;m=4;h=6#n1代表总样品数,n2是测试样品数,m是种类数,h是特征数S1=numpy.zeros((200,7))#最后一列代表类别S1[0:30,0:6]=numpy.random.randn(30,6)S1[0:30,6]=1S1[30:60,0:6]=numpy.random.randn(30,6)*3+10S1[30:60,6]=2S1[60:140,0:6]=numpy.random.randn(80,6)*5+20S1[60:140,6]=3S1[140:,0:6]=numpy.random.randn(60,6)*10+30S1[140:,6]=4S2=numpy.zeros((40,6))S2[0:10,:]=numpy.random.randn(10,6)S2[10:20,:]=numpy.random.randn(10,6)*3+10S2[20:30,:]=numpy.random.randn(10,6)*5+20S2[30:,:]=numpy.random.randn(10,6)*10+30#si为样本,X为test数据#单个数据在模板空间Si中出现的概率def beiyesi(X,Si):S=numpy.cov(Si.T)S=numpy.mat(S);m,n=Si.shapea=1/((2*numpy.pi)**(n/2)*numpy.linalg.det(S)**0.5)X=X-numpy.mean(Si,axis=0)ans=numpy.dot(X,S.I)ans=numpy.dot(ans,X.T)p=numpy.log(a*(numpy.exp(-0.5*ans)))return pdef many_beiyesi(X,Si):#多个数据在模板空间Si中出现的概率a,b=X.shapeP=[beiyesi(X[i,:],Si) for i in range(a)]return Pdef final(X,S,m):li=[]w=[]a,b=X.shapen1,h=S.shapeh=h-1#P[i,j]代表第j个数据在第i个模板空间中出现的概率P=numpy.zeros((m,a))Q=numpy.zeros((m,a))#Q[i,j]代表第j个数据属于第i个模板的概率for i in range(m):li.append(numpy.argwhere(S==i+1)[:,0])w.append(len(li[i]))Si=S[li[i],0:h]p=many_beiyesi(X,Si)for j in range(a):P[i,j]=p[j]for i in range(m):w[i]=float(w[i])/sum(w)for i in range(m):for j in range(a):Q[i,j]=P[i,j]*w[i]/numpy.dot(w,P[:,j])return P,QP,Q=final(S2,S1,m)


0 0
原创粉丝点击