Bayes分类器
- 整体代码,在’mnist’,'cifar10’数据集上train。后续补充细节
- minist精度0.88
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import normalize
from sklearn.metrics import accuracy_score
from cross_validation import Cross_validation
from download import Download
from sklearn.decomposition import PCA
class Bayes:
def fit(self, x, y):#获得均值,方差和频率
self.x = x
self.y = y
self.classes = np.unique(y)
self.parameters = {}
for i , c in enumerate(self.classes):
X_index_c=x[np.where(y == c)]#
m= X_index_c.shape[1]
X_index_c_mean = np.mean(X_index_c, axis=0, keepdims=True)
X_index_c_cov = np.cov(X_index_c.T)
parameters = {'mean':X_index_c_mean,'cov':X_index_c_cov,'prior':X_index_c.shape[0]/ x.shape[0]}
self.parameters['class' + str(c)] = parameters
def _pdf(self, x, classes):#用多维高斯分布拟合p(x|y)
mean = self.parameters['class' + str(classes)]['mean']
cov = self.parameters['class' + str(classes)]['cov']
n,d = x.shape
p = (-np.log(np.linalg.det(cov))/2
-np.diagonal(np.dot(x-mean,np.linalg.inv(cov)).dot((x-mean).T))/2)
print(p.shape)
return p
def _predict(self, x):#计算每个种类的p(y)p(x|y)
output = []
for y in range(self.classes.shape[0]):
prior = np.log(self.parameters['class' + str(y)]['prior'])
posterior = self._pdf(x, y)
prediction = prior + posterior
output.append(prediction)
return output
def predict(self,x):#argmax(p(y)p(x|y))就是最终的结果
output = self._predict(x)
output = np.reshape(output, (self.classes.shape[0], x.shape[0]))
prediction = np.argmax(output, axis=0)
return prediction
if __name__=='__main__':
'''
x = datasets.load_iris().data
y = datasets.load_iris().target
'''
list1= ['mnist','cifar10']
download = Download(list1[0])
x,y = download._dowenload()[0],download._dowenload()[1]
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2)
# 利用PCA对原始数据进行降维
pca = PCA(n_components=10)
pca.fit(x_train)
x_train = pca.transform(x_train)
x_test = pca.transform(x_test)
clf = Bayes()
clf.fit(x_train, y_train)#获得均值方差后验概率
y_pred = clf.predict(x_test)
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy:', round(accuracy,2))
'''
n =x.shape[1]
k=10
cv=Cross_validation(x,y,k)
D=cv.segmentation()
clf = Bayes()
Accuracy=[]
for i in range(k):
test_D=D[i,:,:]
a=D[i:-1,:,:].flatten()
b=D[0:i,:,:].flatten()
train_D=np.concatenate((a,b)).reshape(-1,n+1)
y_train=train_D[:,-1].astype(int)
y_test=test_D[:,-1].astype(int)
clf.fit(train_D[:,0:-1],y_train)
y_pred = clf.predict(test_D[:,0:-1])
accuracy = accuracy_score(y_test, y_pred)
Accuracy.append(accuracy)
print(round(sum(Accuracy)/len(Accuracy),2))
'''
# print('x_tarin', x_train.shape,'D0',D[0].shape)
#print(test_D1.shape,train_D1.shape)