The first version:
import xlwt
import math
import numpy as np
import pandas as pd
from pathlib import Path
from sklearn.model_selection import StratifiedKFold
from collections import OrderedDict
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from scipy.special import expit
from copy import deepcopy
from scipy.spatial.distance import pdist, squareform
from sklearn.metrics import accuracy_score, mean_absolute_error, f1_score
from sklearn.preprocessing import StandardScaler
from sklearn.metrics.pairwise import rbf_kernel
from sklearn.metrics import accuracy_score
from time import time
from sklearn import preprocessing
from sklearn.metrics.pairwise import pairwise_kernels, pairwise_distances
from sklearn.base import ClassifierMixin, BaseEstimator
from sklearn.utils.validation import check_X_y
from sklearn.preprocessing import StandardScaler, MinMaxScaler, Normalizer
from sklearn.metrics import accuracy_score, mean_absolute_error, f1_score
from mord import LogisticAT
from sklearn.model_selection import train_test_split
from numpy.linalg import inv
from itertools import product
class svlor():
def __init__(self):
self.X = None
self.y = None
def fit(self, X, y):
self.X = np.asarray(X, dtype=np.float64)
self.y = np.asarray(y, dtype=np.int32)
self.nSample, self.nDim = X.shape
self.labels = list(np.sort(np.unique(y)))
self.nClass = len(self.labels)
self.Z = self.Get_Z()
self._w = np.random.random(self.nDim)
self.epoch=100
self.lr = 0.01
self.C = 10
self.Update()
def Get_Z(self):
Z = np.zeros((self.nSample, self.nSample))
for i in range(self.nSample-1):
for j in range(i, self.nSample):
Z[i,j] = np.sign(self.y[i] - self.y[j])
return Z
def Update(self):
for e in range(self.epoch):
# ------update phi and G---------
G = 0.0
# phi = np.zeros((self.nSample, self.nSample))
for i in range(self.nSample-1):
for j in range(i, self.nSample):
SubX = self.X[i] - self.X[j]
if 1 > self.Z[i,j] * self._w @ SubX:
# phi[i,j] = 1
G += -self.Z[i,j] * SubX
G = self.C * G + self._w
self._w += self.lr * G
def predict(self,X):
lab_dict = OrderedDict()
for lab in self.labels:
lab_dict[lab] = []
for idx in range(self.nSample):
lab_dict[self.y[idx]].append(idx)
Theta = np.zeros(self.nClass-1)
for k in range(self.nClass-1):
min_value = np.inf
tar_ele = None
for ele in product(lab_dict[k],lab_dict[k+1]):
SubXw = self._w @ (self.X[ele[0]] - self.X[ele[1]])
if min_value > SubXw:
tar_ele = ele
min_value = SubXw
Theta[k] = self._w @ (self.X[tar_ele[0]] + self.X[tar_ele[1]]) /2
projection = X @ self._w
Theta = Theta.reshape(-1,1)
tmp = np.tile(projection,(self.nClass-1,1)) - Theta
tmp = tmp.T
y_pred = np.sum(tmp < 0, axis=1).astype(np.int32)
return y_pred
name = "cleveland"
# name = "HDI2"
# name = "glass"
# name = "balance-scale"
# name = "newthyroid"
# name = "automobile"
data_path