2017-04-08 14 views
2

下面这个代码是假设运行一个完整的高斯covaraince(http://courses.ee.sun.ac.za/Pattern_Recognition_813/lectures/lecture03/node2.html)贝叶斯分类器,但我得到两个错误,当我运行的代码。它们是:平均数空切片和自由度的<= 0

RuntimeWarning: Mean of empty slice. 
    warnings.warn("Mean of empty slice.", RuntimeWarning) 

RuntimeWarning: Degrees of freedom <= 0 for slice 
    warnings.warn("Degrees of freedom <= 0 for slice", RuntimeWarning) 

这是我的代码:

def modelFull(train, test): 
    err_train = 0 
    err_test = 0 
    x_train = [] 
    x_test = [] 
    labels = [] 
    train_labels = [] 
    test_labels = [] 
    for i in train: 
     x_train.append(i[:-1]/255) 
     labels.append(i[-1]) 
     train_labels.append(i[-1]) 
    for i in test: 
     x_test.append(i[:-1]/255) 
     labels.append(i[-1]) 
     test_labels.append(i[-1]) 
    x_train = np.array(x_train) 
    x_0 = [] 
    x_1 = [] 
    for i in train: 
     if i[-1] == 0: 
      x_0.append(i[:-1]/255) 
     if i[-1] == 1: 
      x_1.append(i[:-1]/255) 
    x_0 = np.array(x_0) 
    x_1 = np.array(x_1) 
    p_0 = float(x_0.shape[0])/float((x_0.shape[0]+x_1.shape[0])) 
    p_1 = float(x_1.shape[0])/float((x_0.shape[0]+x_1.shape[0])) 
    train_x0_mean = x_0.mean(axis=0) 
    train_x1_mean = x_1.mean(axis=0) 
    cov_x0 = np.cov(np.transpose(x_0)) 
    cov_x1 = np.cov(np.transpose(x_1)) 
    cov_x0 = cov_x0 + np.eye(256) * .01 
    cov_x1 = cov_x1 + np.eye(256) * .01 
    det_x1_cov = -float(np.linalg.slogdet(cov_x1)[1]) 
    det_x0_cov = -float(np.linalg.slogdet(cov_x0)[1]) 
    train_results = [] 
    test_results = [] 
    for x in x_train: 
     x0_minus_mu_T = np.transpose((x-train_x0_mean)) 
     x0_inverse = np.linalg.inv(cov_x0) 
     x0_minus_mu = x-train_x0_mean 
     x1_minus_mu_T = np.transpose((x-train_x1_mean)) 
     x1_inverse = np.linalg.inv(cov_x1) 
     x1_minus_mu = x-train_x1_mean 
     x_0_probability = det_x0_cov - (x0_minus_mu_T.dot(x0_inverse)).dot(x0_minus_mu) 
     x_1_probability = det_x1_cov - (x1_minus_mu_T.dot(x1_inverse)).dot(x1_minus_mu) 
     if (x_0_probability+np.log(p_0))/(x_1_probability+np.log(p_1)) < 1: 
      train_results.append(1) 
     else: 
      train_results.append(0) 
    for x in x_test: 
     x0_minus_mu_T = np.transpose((x-train_x0_mean)) 
     x0_inverse = np.linalg.inv(cov_x0) 
     x0_minus_mu = x-train_x0_mean 
     x1_minus_mu_T = np.transpose((x-train_x1_mean)) 
     x1_inverse = np.linalg.inv(cov_x1) 
     x1_minus_mu = x-train_x1_mean 
     x_0_probability = det_x0_cov - (x0_minus_mu_T.dot(x0_inverse)).dot(x0_minus_mu) 
     x_1_probability = det_x1_cov - (x1_minus_mu_T.dot(x1_inverse)).dot(x1_minus_mu) 
     if (x_0_probability+np.log(p_0))/(x_1_probability+np.log(p_1)) < 1: 
      test_results.append(1) 
     else: 
      test_results.append(0) 

    train_correct = 0 
    test_correct = 0 
    for i in range(len(train_results)): 
     if int(train_results[i]) == int(train_labels[i]): 
      train_correct +=1 

    for i in range(len(test_results)): 
     if int(test_results[i]) == int(test_labels[i]): 
      test_correct +=1 

    err_train = 1-(float(test_correct)/ len(test_results)) 
    err_train = 1-(float(train_correct)/ len(train_results)) 

    return err_train, err_test 
+0

如果你创建一个[最小,完整,可验证](http://stackoverflow.com/help/mcve)例如,你会得到更多更好的答案。由于这个问题现在站立,这将是相当困难的人来帮助你与此有关。 –

回答

1

RuntimeWarning:对切片自由< = 0度时

时ÿ OU使用错误的形状,例如:

import numpy as np 

x = np.random.random([1000,1]) 
y = np.random.random([1000,1]) 
print(x.shape, y.shape) 
# (1000, 1) (1000, 1) 
t = np.cov(x, y) #RuntimeWarning 
t = np.cov(x.T, y.T) #This works