Python 实现Support Vector Learning for Ordinal Regression(SVLOR)

博客探讨了Python中Support Vector Learning for Ordinal Regression(SVLOR)的实现,指出初版代码可能误用梯度上升但反而得到更高精度。同时,文章提及了采用梯度下降法的改进版本,以及通过优化包提升效果,并引入了概率输出和计算到决策边界的距离功能。
摘要由CSDN通过智能技术生成

 

 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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeniuHe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值