CoolFace
Datasetpublic

Yinxing/LLM_Dataset

sourceHugging Facemitupdated 2mo agoView on Hugging Face
0likes637downloads
Logistic.py120 linesDownload Raw Back to root
1import numpy as np2import pandas as pd3from scipy.stats import norm4 5# モデルで使う関数定義6def logit(x):7    p = 1 / (1 + np.exp(-x))8    dp = p * (1 - p)9    return p, dp10 11def probit(x):12    p = norm.cdf(x)13    dp = norm.pdf(x)14    return p, dp15 16def bhood(func, param, y, z):17    xb = np.dot(z, param)18    p, dp = func(xb)19    p = np.clip(p, 1e-8, 1 - 1e-8)  # log(0)防止20    lhood = np.sum(y * np.log(p) + (1 - y) * np.log(1 - p))21    grad = np.dot(z.T, y - p)22    hess = -np.dot(z.T * dp.flatten(), z)23    return lhood, grad, hess24 25# メインクラス26class BinaryLogit:27    def __init__(self, mode="logit", tol=1e-4):28        self.mode = mode29        self.tol = tol30        self.coef = None31        self.se = None32        self.t = None33        self.APE = None34        self.PEA = None35        self.p = None36        self.likelihood = None37        self.n = None38        self.k = None39 40    def _get_func(self):41        if self.mode == "logit":42            return logit43        elif self.mode == "probit":44            return probit45        else:46            raise NotImplementedError(f"Unknown mode: {self.mode}")47 48    def _get_z_y(self, x, y=None):49        # Pandas から NumPy に変換50        if isinstance(x, pd.DataFrame):51            x_array = x.values52            x_names = ["const"] + x.columns.tolist()53        else:54            x_array = np.asarray(x)55            x_names = ["const"] + [f"x{i}" for i in range(x_array.shape[1])]56 57        self.n, self.k = x_array.shape58        const = np.ones((self.n, 1))59        z = np.hstack([const, x_array])60        self.x_names = x_names61 62        if y is None:63            return z64 65        if isinstance(y, (pd.Series, pd.DataFrame)):66            y_array = np.asarray(y).flatten()67            self.y_name = y.name if hasattr(y, 'name') else "y"68        else:69            y_array = np.asarray(y).flatten()70            self.y_name = "y"71 72        return z, y_array73 74    def fit(self, x, y):75        z, y = self._get_z_y(x, y)76        func = self._get_func()77 78        param = np.zeros(z.shape[1])79        f = bhood(func, param, y, z)80        r = np.max(np.abs(f[1]))81 82        while r > self.tol:83            param = param - np.dot(np.linalg.inv(f[2]), f[1])84            f = bhood(func, param, y, z)85            r = np.max(np.abs(f[1]))86 87        self.coef = param88        self.intercept_ = param[0]89        self.coef_ = param[1:]90        self.likelihood = f[0]91        self.se = np.sqrt(np.diag(np.linalg.inv(-f[2])))92        self.t = self.coef / self.se93        self.p = (1 - norm.cdf(np.abs(self.t))) * 294 95        u = func(np.dot(z, param.reshape(-1, 1)))96        self.APE = np.mean(u[1]) * param97        u = func(np.dot(np.mean(z, axis=0), param))98        self.PEA = u[1] * param99        return self100 101    def predict(self, x):102        if isinstance(x, pd.DataFrame):103            x_array = x.values104        else:105            x_array = np.asarray(x)106 107        if x_array.shape[1] != self.k:108            raise ValueError(f"Expected {self.k} features, got {x_array.shape[1]}")109 110        const = np.ones((x_array.shape[0], 1))111        z = np.hstack([const, x_array])112        func = self._get_func()113        return func(np.dot(z, self.coef))[0]114 115    def summary(self):116        col_names = ["coef", "se", "t", "p", "PEA", "APE"]117        df = pd.DataFrame(np.c_[self.coef, self.se, self.t, self.p, self.PEA, self.APE],118                          index=self.x_names,119                          columns=col_names)120        return df