# Problems with Linear Discriminant Analysis Classifier

I wrote two functions for determining the linear discriminant classifier of an EEG data set. The data set consists of preprocessed EEG data 𝑋∈𝑅5×62×5322 and stimulus labels 𝑌∈𝑅2×5322 during a copy-spelling paradigm with a P300 speller. The data matrix X contains 5 selected time windows of EEG activity at 62 electrodes after a visual stimulus was presented on the screen in front of the subject. If the first row of 𝑌 is 1, the stimulus was a target stimulus, if the second row of 𝑌 is 1, the stimulus was a non-target stimulus. The first function returns the weight vector and the bias term. The second function is a graph class to show the result

def lda_fit(X,Y):
# class means

unique_classes=np.unique(Y)
mu=np.zeros((len(unique_classes),X.shape[1]))
for i,name in enumerate(unique_classes):
mu[i,:] = X[Y==name,:].mean(axis=0)

mupos=mu[1]
muneg=mu[0]
mupos=mupos.reshape(155,2)
muneg=muneg.reshape(155,2)
Xneu=X[0].reshape(155,2)

# D-by-D inter class covariance matrix (signal)
Sinter = np.dot((muneg-mupos),(muneg-mupos).T)

# D-by-D intra class covariance matrices (noise)
Sintra =np.dot((Xneu-mupos),(Xneu-mupos).T)+np.dot((Xneu-muneg),(Xneu-muneg).T)

# solve eigenproblem
eigvals, eigvecs = sp.linalg.eig(Sinter,Sintra)
w = eigvecs[:,eigvals.argmax()]
# bias term
b = (w.dot(mupos) + w.dot(muneg))/2.
# return the weight vector
return w,b


I get the following error: "ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 155 is different from 310)"

I know it has something to do with the shape of the matrices, but I really stuck.

• Indeed it is an issue with the dot product.First I tried to calculate the inter class covariance matrix and the intra class covariance matrix with the shape 310,1 and it didn't work. SO I reshaped the matrices to the size of 155,2 and then the dot product worked. Unfortunatly the result was pretty useless for the graph class. So there has to be a another possibility how I can calculate the sinter and sintra. The code for my graph class is this:X_train, X_test, Y_train, Y_test = train_test_split(X,Y) w_lda,b_lda = lda_fit(X_train,Y_train) w_lda=np.repeat(w_lda,2) Jun 1 '19 at 8:18
• The output of print(X_test[Y_test<0, :].shape) is (1118, 310). The exact error is: ValueError Traceback (most recent call last) <ipython-input-163-8e53abe25a8e> in <module> 26 pl.legend(('$b_{ncc}$','non-target','target')) 27 pl.ylim([0, 300]) ---> 28 acc = int((sp.sign(X_test @ w_lda - b_lda)==Y_test).mean()*100) 29 pl.title(f"LDA Acc {acc}%"); ValueError: operands could not be broadcast together with shapes (1331,) (2,) Jun 1 '19 at 8:21