from copy import deepcopy
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
import cvxpy as cvx
X ,y = datasets.make_blobs(n_samples=300, n_features=2,centers=2,cluster_std=[2.0,2.0],random_state=123)
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.1,random_state=0)
class LogisticRegression():
def __init__(self,X,y):
self.X = X
self.y = np.vstack(y)
self.N = self.X.shape[0]
self.d = self.X.shape[1]
self.lambd = 0.1
self.w = cvx.Variable((self.d,1))
self.obj = cvx.Maximize(cvx.sum(cvx.multiply(self.y,self.X @ self.w) - cvx.logistic(self.X @ self.w)) - self.lambd * cvx.norm(self.w,1))
self.prob = cvx.Problem(self.obj).solve()
self.theta = np.array([a[0] for a in self.w.value])
def pred_prob(self,X_test):
prob = 1/(1+ cvx.exp(-(X_test @ self.w)).value)
return prob
def pred(self,X_test):
result = []
for ele in 1 / (1 + cvx.exp(-(X_test @ self.w)).value):
if ele >= 0.5:
result.append(1)
else:
result.append(0)
return np.array(result)
if __name__ == '__main__':
X, y = datasets.make_blobs(n_samples=300, n_features=2, centers=2, cluster_std=[2.0, 2.0], random_state=123)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=0)
model = LogisticRegression(X_train,y_train)
prob = model.pred_prob(X_test=X_test)
y_pred = model.pred(X_test=X_test)
print(y_test)
print(y_pred)
print(prob)