In [1]:
using CSV, DataFrames, Convex, ECOS, PyPlot
include("to_one_hot.jl")

datatypes = Dict(1=>Float64, 2=>Float64, 3=>Float64, 4=>Float64, 5=>Int8)
irisdata = CSV.read("iris.csv", delim=',', types=datatypes)

U = irisdata[:, 1:end-1]
v = irisdata[:, end] + 1

n,d = size(U)

X = ones(n);
for i=1:d
    X = [X U[:,i]]
end
##X = [X U[:,1].*U[:,3]]
##X = [X U[:,1].*U[:,4]]
##X = [X U[:,3].*U[:,4]]

y = to_one_hot(v)

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

theta = Variable(d,m)

yhat1 = X[v.==1,:]*theta
yhat2 = X[v.==2,:]*theta
yhat3 = X[v.==3,:]*theta

M21 = yhat1[:,2] - yhat1[:,1] 
M31 = yhat1[:,3] - yhat1[:,1]
M32 = yhat2[:,3] - yhat2[:,2] 
M12 = yhat2[:,1] - yhat2[:,2]
M13 = yhat3[:,1] - yhat3[:,3]
M23 = yhat3[:,2] - yhat3[:,3]
# hinge loss
cost  = sum( max( pos(1 + M21) , pos(1 + M31) ) );
cost += sum( max( pos(1 + M32) , pos(1 + M12) ) );
cost += sum( max( pos(1 + M13) , pos(1 + M23) ) );
# logistic loss
#=
cost  = logsumexp([zeros(50) M21 M31]);
cost += logsumexp([zeros(50) M32 M12]);
cost += logsumexp([zeros(50) M13 M23]);
=#

problem = minimize(cost);
solve!(problem, ECOSSolver(verbose=1))
theta_opt = evaluate(theta)
 
C = zeros(K,K)
yhat = X*theta_opt
vhat = zeros(Int8, n)
for i=1:n
    maxval, vhat[i] = findmax(yhat[i,:]) 
    C[vhat[i],v[i]] += 1
end
C
Out[1]:
3×3 Array{Float64,2}:
 50.0   0.0   0.0
  0.0  49.0   1.0
  0.0   1.0  49.0
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  +7.162e+00  +1.651e+02  +2e+03  8e-01  3e+00  1e+00  2e+00    ---    ---    1  2  - |  -  - 
 1  +3.179e+01  +1.035e+02  +1e+03  2e-01  1e+00  2e+00  2e+00  0.5200  3e-01   1  1  1 |  0  0
 2  +3.247e+01  +5.969e+01  +6e+02  7e-02  5e-01  2e+00  7e-01  0.6110  1e-01   2  0  1 |  0  0
 3  +2.097e+01  +3.410e+01  +3e+02  3e-02  3e-01  8e-01  3e-01  0.6044  2e-01   2  1  1 |  0  0
 4  +1.524e+01  +2.118e+01  +1e+02  1e-02  1e-01  4e-01  2e-01  0.6209  9e-02   2  1  1 |  0  0
 5  +1.324e+01  +1.731e+01  +9e+01  9e-03  1e-01  2e-01  1e-01  0.3890  1e-01   2  1  1 |  0  0
 6  +1.176e+01  +1.450e+01  +6e+01  6e-03  8e-02  1e-01  6e-02  0.5277  3e-01   1  0  1 |  0  0
 7  +1.029e+01  +1.209e+01  +3e+01  4e-03  6e-02  8e-02  4e-02  0.5161  2e-01   1  1  1 |  0  0
 8  +1.023e+01  +1.198e+01  +3e+01  4e-03  6e-02  7e-02  4e-02  0.0737  8e-01   1  0  1 |  0  0
 9  +1.014e+01  +1.184e+01  +3e+01  4e-03  5e-02  7e-02  4e-02  0.0562  5e-01   1  0  0 |  0  0
10  +8.829e+00  +9.875e+00  +2e+01  2e-03  3e-02  3e-02  2e-02  0.5695  3e-01   1  0  0 |  0  0
11  +8.859e+00  +9.702e+00  +1e+01  2e-03  3e-02  2e-02  2e-02  0.7413  6e-01   1  1  1 |  0  0
12  +8.400e+00  +9.063e+00  +1e+01  1e-03  3e-02  1e-02  1e-02  0.3826  3e-01   1  1  1 |  0  0
13  +8.285e+00  +8.927e+00  +9e+00  1e-03  3e-02  1e-02  1e-02  0.3350  8e-01   1  1  1 |  0  0
14  +7.253e+00  +7.648e+00  +6e+00  8e-04  2e-02  6e-03  6e-03  0.5519  3e-01   1  1  1 |  0  0
15  +6.829e+00  +7.067e+00  +3e+00  4e-04  1e-02  3e-03  4e-03  0.6970  4e-01   1  1  1 |  0  0
16  +6.626e+00  +6.815e+00  +2e+00  4e-04  1e-02  3e-03  3e-03  0.3198  2e-01   1  1  1 |  0  0
17  +6.478e+00  +6.626e+00  +2e+00  3e-04  7e-03  2e-03  2e-03  0.4559  5e-01   1  0  1 |  0  0
18  +6.071e+00  +6.141e+00  +9e-01  1e-04  4e-03  1e-03  1e-03  0.7128  3e-01   1  0  0 |  0  0
19  +6.117e+00  +6.193e+00  +9e-01  1e-04  4e-03  1e-03  1e-03  0.1306  8e-01   1  1  1 |  0  0
20  +6.043e+00  +6.108e+00  +8e-01  1e-04  4e-03  1e-03  9e-04  0.4351  8e-01   1  1  1 |  0  0
21  +5.849e+00  +5.884e+00  +4e-01  6e-05  2e-03  6e-04  4e-04  0.5880  1e-01   1  1  1 |  0  0
22  +5.707e+00  +5.720e+00  +1e-01  2e-05  8e-04  2e-04  2e-04  0.6492  5e-02   1  0  0 |  0  0
23  +5.730e+00  +5.746e+00  +1e-01  3e-05  1e-03  3e-04  2e-04  0.0479  9e-01   1  1  1 |  0  0
24  +5.694e+00  +5.706e+00  +1e-01  2e-05  7e-04  2e-04  1e-04  0.3801  8e-01   1  1  1 |  0  0
25  +5.665e+00  +5.672e+00  +8e-02  1e-05  4e-04  1e-04  9e-05  0.4981  2e-01   1  0  0 |  0  0
26  +5.669e+00  +5.678e+00  +8e-02  1e-05  6e-04  2e-04  9e-05  0.0686  9e-01   1  1  1 |  0  0
27  +5.602e+00  +5.602e+00  +2e-03  3e-07  1e-05  4e-06  2e-06  0.9890  1e-02   1  0  0 |  0  0
28  +5.600e+00  +5.600e+00  +2e-05  4e-09  2e-07  5e-08  2e-08  0.9890  1e-04   2  1  1 |  0  0
29  +5.600e+00  +5.600e+00  +2e-07  4e-11  2e-09  5e-10  3e-10  0.9890  1e-04   5  1  0 |  0  0
30  +5.600e+00  +5.600e+00  +3e-09  5e-13  2e-11  6e-12  3e-12  0.9890  1e-04   1  0  0 |  0  0

OPTIMAL (within feastol=1.9e-11, reltol=4.6e-10, abstol=2.6e-09).
Runtime: 0.015337 seconds.