In [1]:
using CSV, PyPlot

traindata = CSV.read("mnist_train.csv"; datarow = 1, delim=',', types=fill(UInt8,785));
testdata = CSV.read("mnist_test.csv"; datarow = 1, delim=',', types=fill(UInt8,785));

traindata = traindata[1:300,:]
#testdata = testdata[1:300,:]

n_train,d = size(traindata)
trainY = Int8.(traindata[:,1])
trainX = ones(n_train,d)
n_test,d = size(testdata)
testY = Int8.(testdata[:,1])
testX = ones(n_test,d)

for i=2:d
    trainX[:,i] = Float32.(traindata[:,i])
    testX[:,i] = Float32.(testdata[:,i])
end

figure
num = 10
for i=1:(num*num)
    subplot(num,num,i)
    imshow(reshape(trainX[i,2:end],28,28)', cmap="gray")
    axis("Off")
end
println(Int8.(traindata[1:(num*num),1]))
Int8[
5, 0, 4, 1, 9, 2, 1, 3, 1, 4, 3, 5, 3, 6, 1, 7, 2, 8, 6, 9, 4, 0, 9, 1, 1, 2, 4, 3, 2, 7, 3, 8, 6, 9, 0, 5, 6, 0, 7, 6, 1, 8, 7, 9, 3, 9, 8, 5, 9, 3, 3, 0, 7, 4, 9, 8, 0, 9, 4, 1, 4, 4, 6, 0, 4, 5, 6, 1, 0, 0, 1, 7, 1, 6, 3, 0, 2, 1, 1, 7, 9, 0, 2, 6, 7, 8, 3, 9, 0, 4, 6, 7, 4, 6, 8, 0, 7, 8, 3, 1]
In [2]:
using Convex, ECOS
include("to_one_hot.jl")

X = trainX
m = 10
y = zeros(Int8, n_train, m)
for i=1:n_train
    y[i,trainY[i]+1] = 1
end

d = size(X,2)
K = size(y,2)
m = K

theta = Variable(d,m)
yhat = X*theta

cost = 0
for i=1:n_train
    yhati = yhat[i,:]
    yi = y[i,:]
    Mi = yhati - yhati*yi
    one_plus_Mi = pos( ones(1,m)-reshape(yi,1,m) + Mi )
    cost += maximum(one_plus_Mi)
end
cost += 1.0*vecnorm(theta[2:end,:])
    
problem = minimize(cost);
solve!(problem, ECOSSolver(verbose=1))
theta_opt = evaluate(theta)
 
C_train = zeros(K,K)
yhat = trainX*theta_opt
vhat = zeros(Int8, n_train)
for i=1:n_train
    maxval, vhat[i] = findmax(yhat[i,:]) 
    C_train[vhat[i],trainY[i]+1] += 1
end

C_test = zeros(K,K)
yhat = testX*theta_opt
vhat = zeros(Int8, n_test)
for i=1:n_test
    maxval, vhat[i] = findmax(yhat[i,:]) 
    C_test[vhat[i],testY[i]+1] += 1
end

figure
subplot(121)
imshow(C_train, cmap="gray")
axis("Off")
title("Train confusion matrix")
subplot(122)
imshow(C_test, cmap="gray")
axis("Off")
title("Test confusion matrix")
Out[2]:
PyObject Text(0.5,1,'Test confusion matrix')
ECOS 2.0.5 - (C) embotech GmbH, Zurich Switzerland, 2012-15. Web: www.embotech.com/ECOS

It     pcost       dcost      gap   pres   dres    k/t    mu     step   sigma     IR    |   BT
 0  +1.048e-09  +1.691e+02  +1e+04  1e+00  3e+00  1e+00  1e+00    ---    ---    1  3  - |  -  - 
 1  -3.193e-01  +4.210e+01  +2e+03  4e-02  5e-01  6e-01  2e-01  0.8538  3e-03   3  2  2 |  0  0
 2  -6.344e-01  +5.624e+00  +7e+02  4e-02  2e-02  7e-01  7e-02  0.9280  4e-01   6  4  4 |  0  0
 3  -4.578e-03  +1.326e-01  +2e+01  1e-03  4e-04  7e-03  2e-03  0.9757  3e-04   5  4  4 |  0  0
 4  +9.728e-04  +2.790e-02  +3e+00  2e-04  8e-05  1e-03  4e-04  0.8254  3e-02   1  1  1 |  0  0
 5  +1.303e-03  +7.468e-03  +8e-01  5e-05  2e-05  2e-04  8e-05  0.8430  9e-02   1  1  1 |  0  0
 6  +1.133e-03  +2.601e-03  +2e-01  1e-05  5e-06  3e-05  2e-05  0.8576  1e-01   1  1  1 |  0  0
 7  +1.052e-03  +1.313e-03  +4e-02  3e-06  8e-07  3e-06  4e-06  0.9073  1e-01   1  1  1 |  0  0
 8  +1.091e-03  +1.147e-03  +8e-03  1e-06  2e-07  7e-07  9e-07  0.7934  1e-02   1  1  1 |  0  0
 9  +1.170e-03  +1.188e-03  +3e-03  8e-07  6e-08  2e-07  3e-07  0.7249  7e-02   2  1  1 |  0  0
10  +1.256e-03  +1.264e-03  +1e-03  5e-07  2e-08  6e-08  1e-07  0.7666  2e-01   2  1  1 |  0  0
11  +1.346e-03  +1.349e-03  +4e-04  4e-07  9e-09  1e-08  4e-08  0.9459  3e-01   2  1  1 |  0  0
12  +1.440e-03  +1.440e-03  +1e-04  4e-07  2e-09  3e-09  1e-08  0.9200  2e-01   2  1  1 |  0  0
13  +1.484e-03  +1.485e-03  +6e-05  3e-07  1e-09  2e-09  7e-09  0.9890  6e-01   2  2  2 |  0  0
14  +1.532e-03  +1.532e-03  +4e-05  3e-07  6e-10  9e-10  4e-09  0.9479  5e-01   2  1  1 |  0  0
15  +1.579e-03  +1.579e-03  +2e-05  3e-07  3e-10  5e-10  2e-09  0.9751  5e-01   2  1  1 |  0  0
16  +1.606e-03  +1.606e-03  +2e-05  3e-07  2e-10  4e-10  2e-09  0.8841  7e-01   2  1  1 |  0  0
17  +1.643e-03  +1.643e-03  +1e-05  3e-07  2e-10  3e-10  1e-09  0.9168  6e-01   2  1  1 |  0  0
18  +1.681e-03  +1.681e-03  +8e-06  3e-07  9e-11  2e-10  9e-10  0.9890  6e-01   2  1  1 |  0  0
19  +1.720e-03  +1.720e-03  +6e-06  3e-07  6e-11  1e-10  6e-10  0.9890  6e-01   2  1  1 |  0  0
20  +1.734e-03  +1.734e-03  +5e-06  3e-07  5e-11  1e-10  6e-10  0.5681  7e-01   2  1  1 |  0  0
21  +1.773e-03  +1.773e-03  +3e-06  3e-07  3e-11  8e-11  4e-10  0.5772  3e-01   2  1  1 |  0  0
22  +1.794e-03  +1.794e-03  +3e-06  3e-07  2e-11  7e-11  3e-10  0.9890  8e-01   1  1  1 |  0  0
23  +1.806e-03  +1.806e-03  +4e-06  3e-07  2e-11  8e-11  4e-10  0.9890  9e-01   2  1  1 |  0  0
24  +1.854e-03  +1.854e-03  +2e-06  3e-07  1e-11  5e-11  2e-10  0.7847  4e-01   2  1  1 |  0  0
25  +1.859e-03  +1.859e-03  +2e-06  3e-07  9e-12  5e-11  3e-10  0.4759  9e-01   1  1  1 |  0  0
26  +1.895e-03  +1.895e-03  +2e-06  3e-07  6e-12  4e-11  2e-10  0.6566  4e-01   1  1  1 |  0  0
27  +1.898e-03  +1.898e-03  +2e-06  3e-07  5e-12  4e-11  2e-10  0.1906  8e-01   1  1  1 |  0  0
28  +1.914e-03  +1.914e-03  +1e-06  3e-07  5e-12  4e-11  2e-10  0.9890  8e-01   1  1  1 |  0  0
29  +1.950e-03  +1.950e-03  +1e-06  3e-07  3e-12  3e-11  1e-10  0.6778  4e-01   1  1  1 |  0  0
30  +1.973e-03  +1.973e-03  +1e-06  3e-07  2e-12  2e-11  1e-10  0.9890  8e-01   1  1  1 |  0  0
31  +1.986e-03  +1.986e-03  +1e-06  3e-07  2e-12  2e-11  1e-10  0.5053  7e-01   1  1  1 |  0  0
32  +1.987e-03  +1.987e-03  +1e-06  3e-07  2e-12  2e-11  2e-10  0.1636  1e+00   1  1  1 |  0  0
33  +2.025e-03  +2.025e-03  +1e-06  3e-07  1e-12  2e-11  1e-10  0.6414  4e-01   1  1  1 |  0  0
34  +2.037e-03  +2.037e-03  +9e-07  3e-07  1e-12  2e-11  1e-10  0.4946  8e-01   1  1  1 |  0  0
35  +2.070e-03  +2.070e-03  +8e-07  3e-07  7e-13  2e-11  9e-11  0.9890  7e-01   1  1  1 |  0  0
36  +2.094e-03  +2.094e-03  +8e-07  3e-07  5e-13  2e-11  9e-11  0.7537  7e-01   1  1  1 |  0  0
37  +2.110e-03  +2.110e-03  +9e-07  3e-07  4e-13  2e-11  1e-10  0.8153  8e-01   1  1  1 |  0  0
38  +2.146e-03  +2.146e-03  +5e-07  3e-07  3e-13  1e-11  6e-11  0.5384  3e-01   1  1  1 |  0  0
39  +2.169e-03  +2.169e-03  +5e-07  3e-07  2e-13  1e-11  5e-11  0.9890  8e-01   1  1  1 |  0  0
40  +2.197e-03  +2.197e-03  +4e-07  3e-07  1e-13  1e-11  5e-11  0.8238  6e-01   1  1  1 |  0  0
41  +2.209e-03  +2.209e-03  +5e-07  3e-07  1e-13  1e-11  5e-11  0.5473  8e-01   1  1  1 |  0  0
42  +2.247e-03  +2.247e-03  +4e-07  3e-07  8e-14  8e-12  4e-11  0.8099  5e-01   1  1  1 |  0  0
43  +2.256e-03  +2.256e-03  +4e-07  3e-07  8e-14  1e-11  5e-11  0.6992  9e-01   1  1  1 |  0  0
44  +2.275e-03  +2.275e-03  +4e-07  3e-07  6e-14  1e-11  4e-11  0.9890  8e-01   1  1  1 |  0  0
45  +2.315e-03  +2.315e-03  +2e-07  3e-07  4e-14  6e-12  3e-11  0.6690  4e-01   1  1  1 |  0  0
46  +2.350e-03  +2.350e-03  +2e-07  3e-07  3e-14  5e-12  2e-11  0.9890  6e-01   1  1  1 |  0  0
47  +2.367e-03  +2.367e-03  +3e-07  3e-07  4e-14  5e-12  3e-11  0.9890  8e-01   1  1  1 |  0  0
48  +2.404e-03  +2.404e-03  +2e-07  3e-07  2e-14  4e-12  2e-11  0.6035  4e-01   1  1  1 |  0  0
49  +2.405e-03  +2.405e-03  +7e-07  3e-07  6e-14  4e-12  7e-11  0.2711  1e+00   1  1  1 |  0  0
50  +2.413e-03  +2.413e-03  +6e-07  3e-07  5e-14  6e-12  7e-11  0.2339  6e-01   1  1  1 |  0  0
51  +2.431e-03  +2.431e-03  +7e-07  3e-07  5e-14  1e-11  7e-11  0.9275  8e-01   1  1  1 |  0  0
52  +2.439e-03  +2.439e-03  +9e-07  3e-07  5e-14  2e-11  1e-10  0.9890  9e-01   1  1  1 |  0  0
53  +2.482e-03  +2.482e-03  +5e-07  3e-07  2e-14  1e-11  6e-11  0.7145  4e-01   1  1  1 |  0  0
54  +2.511e-03  +2.511e-03  +4e-07  3e-07  3e-14  1e-11  5e-11  0.9695  7e-01   1  1  1 |  0  0
55  +2.512e-03  +2.512e-03  +6e-07  3e-07  5e-14  1e-11  7e-11  0.2480  9e-01   1  1  1 |  0  0
56  +2.558e-03  +2.558e-03  +3e-07  3e-07  2e-14  7e-12  4e-11  0.6039  2e-01   1  1  1 |  0  0
57  +2.572e-03  +2.572e-03  +5e-07  3e-07  5e-14  8e-12  6e-11  0.8726  8e-01   1  1  1 |  0  0
58  +2.598e-03  +2.598e-03  +5e-07  3e-07  3e-14  1e-11  5e-11  0.8041  7e-01   1  1  1 |  0  0
59  +2.625e-03  +2.625e-03  +6e-07  3e-07  6e-14  1e-11  7e-11  0.9789  7e-01   1  1  1 |  0  0
60  +2.644e-03  +2.644e-03  +7e-07  3e-07  4e-14  2e-11  7e-11  0.9890  8e-01   1  1  1 |  0  0
61  +2.698e-03  +2.698e-03  +3e-07  3e-07  2e-14  8e-12  3e-11  0.7409  3e-01   1  1  1 |  0  0
62  +2.729e-03  +2.729e-03  +2e-07  3e-07  2e-14  7e-12  3e-11  0.9890  7e-01   1  1  1 |  0  0
63  +2.750e-03  +2.750e-03  +2e-07  3e-07  3e-14  6e-12  3e-11  0.6961  7e-01   1  1  1 |  0  0
64  +2.775e-03  +2.775e-03  +2e-07  3e-07  2e-14  5e-12  2e-11  0.9890  7e-01   1  1  1 |  0  0
65  +2.814e-03  +2.814e-03  +2e-07  3e-07  3e-14  4e-12  2e-11  0.9639  6e-01   1  1  1 |  0  0
66  +2.816e-03  +2.816e-03  +8e-07  3e-07  8e-14  4e-12  9e-11  0.4044  1e+00   1  1  1 |  0  0
67  +2.837e-03  +2.837e-03  +1e-06  3e-07  6e-14  2e-11  1e-10  0.9890  8e-01   1  1  1 |  0  0
68  +2.871e-03  +2.871e-03  +7e-07  3e-07  2e-14  2e-11  8e-11  0.5319  4e-01   1  1  1 |  0  0
69  +2.885e-03  +2.885e-03  +7e-07  3e-07  4e-14  2e-11  8e-11  0.9890  9e-01   1  1  1 |  0  0
70  +2.920e-03  +2.920e-03  +5e-07  3e-07  3e-14  1e-11  5e-11  0.5029  3e-01   1  1  1 |  0  0
71  +2.928e-03  +2.928e-03  +5e-07  3e-07  5e-14  1e-11  6e-11  0.5973  9e-01   1  1  1 |  0  0
72  +2.970e-03  +2.970e-03  +3e-07  3e-07  2e-14  8e-12  3e-11  0.5411  2e-01   1  1  1 |  0  0
73  +2.982e-03  +2.982e-03  +3e-07  3e-07  3e-14  8e-12  4e-11  0.9890  9e-01   1  1  1 |  0  0
74  +3.013e-03  +3.013e-03  +2e-07  3e-07  2e-14  6e-12  3e-11  0.4726  4e-01   1  1  1 |  0  0
75  +3.016e-03  +3.016e-03  +4e-07  3e-07  5e-14  7e-12  4e-11  0.3408  9e-01   1  1  1 |  0  0
76  +3.073e-03  +3.073e-03  +2e-07  3e-07  2e-14  5e-12  2e-11  0.9425  4e-01   1  1  1 |  0  0
77  +3.094e-03  +3.094e-03  +2e-07  3e-07  2e-14  5e-12  2e-11  0.5654  6e-01   1  1  1 |  0  0
78  +3.104e-03  +3.104e-03  +5e-07  3e-07  6e-14  5e-12  6e-11  0.7962  9e-01   1  1  1 |  0  0
79  +3.124e-03  +3.124e-03  +5e-07  3e-07  2e-14  1e-11  6e-11  0.9890  8e-01   1  1  1 |  0  0
80  +3.173e-03  +3.173e-03  +3e-07  3e-07  2e-14  7e-12  3e-11  0.5567  1e-01   1  1  1 |  0  0
81  +3.174e-03  +3.174e-03  +3e-07  3e-07  3e-14  7e-12  4e-11  0.0802  1e+00   1  1  1 |  0  0
82  +3.220e-03  +3.220e-03  +2e-07  3e-07  2e-14  5e-12  2e-11  0.7059  4e-01   1  1  1 |  0  0
83  +3.262e-03  +3.262e-03  +1e-07  3e
WARNING: Problem status Suboptimal; solution may be inaccurate.
-07  2e-14  3e-12  1e-11  0.8752  5e-01   1  1  1 |  0  0
84  +3.262e-03  +3.262e-03  +2e-07  3e-07  4e-14  4e-12  2e-11  0.0822  1e+00   1  1  1 |  0  0
85  +3.270e-03  +3.270e-03  +3e-07  3e-07  3e-14  6e-12  3e-11  0.9227  9e-01   1  1  1 |  0  0
86  +3.306e-03  +3.306e-03  +2e-07  3e-07  1e-14  4e-12  2e-11  0.4459  2e-01   1  1  1 |  0  0
87  +3.316e-03  +3.316e-03  +2e-07  3e-07  2e-14  6e-12  2e-11  0.9890  9e-01   1  1  1 |  0  0
88  +3.383e-03  +3.383e-03  +9e-08  3e-07  2e-14  2e-12  1e-11  0.9890  3e-01   1  1  1 |  0  0
Slacks/multipliers leaving the cone, recovering best iterate (38) and stopping.

Close to OPTIMAL (within feastol=2.9e-07, reltol=2.6e-04, abstol=5.5e-07).
Runtime: 352.895618 seconds.

In [3]:
Error_rate_train = (sum(C_train) - sum(diag(C_train)))/sum(C_train)
Error_rate_test = (sum(C_test) - sum(diag(C_test)))/sum(C_test)
println(Error_rate_test)
0.2091
In [4]:
C_test
Out[4]:
10×10 Array{Float64,2}:
 895.0     0.0   14.0   11.0    2.0   51.0   23.0    8.0   37.0   18.0
   0.0  1082.0   69.0    9.0    3.0   18.0    9.0   24.0   41.0    6.0
  37.0     4.0  812.0   48.0   25.0   17.0   61.0   37.0   14.0   28.0
   4.0     1.0   19.0  768.0    7.0  103.0    1.0    3.0   37.0   20.0
   5.0     4.0   30.0    3.0  788.0   37.0   15.0   15.0    8.0   84.0
  26.0     1.0   10.0   75.0    1.0  509.0   18.0    1.0   52.0    3.0
   5.0     5.0   24.0    2.0   22.0   15.0  814.0    2.0   34.0    7.0
   5.0     1.0   29.0   21.0   22.0   35.0    7.0  885.0   14.0  136.0
   1.0    36.0   22.0   26.0    3.0   26.0    1.0   11.0  665.0   16.0
   2.0     1.0    3.0   47.0  109.0   81.0    9.0   42.0   72.0  691.0