python 秘技_神之秘技:RankGaussian

本文介绍了一个Python实现的RankGaussian Normalization类,用于数据转换。该类包含初始化、数据处理方法,以及正态分布累积分布函数的逆函数等。通过示例展示了如何使用该类对数据进行规范化处理。
摘要由CSDN通过智能技术生成

import numpy as npfrom collections import Counter, OrderedDictclass RGN:'''Rank Gaussian Normalization'''def __init__(self, data=None, precision=np.float32):#data: 1D array or listself._data = dataself.precision = precisionself._output = Noneif self._data is None:self._trafo_map = Noneelse:self.fit_transform(self._data)@propertydef data(self):return self._data@propertydef output(self):return self._output@propertydef precision(self):return self._precision@precision.setterdef precision(self, p):if not isinstance(p, type):raise ValueError('precision must be a data type, e.g.: np.float64')self._precision = pdef _RationalApproximation(self, t:float)->float:c = [2.515517, 0.802853, 0.010328]d = [1.432788, 0.189269, 0.001308]return t - ((c[2]*t + c[1])*t + c[0]) / (((d[2]*t + d[1])*t + d[0])*t + 1.0)def _NormalCDFInverse(self, p:float) -> float:if (p <= 0.0 or p >= 1.0):raise Exception('0

float:if x == 0:return 0elif x < 0:return -self._NormalCDFInverse(-x)*0.7else:return self._NormalCDFInverse(x)*0.7def fit_transform(self, dataIn:list) -> dict:self.fit(dataIn)return self.transform(dataIn)def fit(self, dataIn:list):self._data = dataIntrafoMap = OrderedDict()hist = Counter(dataIn)if len(hist) == 0:passelif len(hist) == 1:key = list(hist.keys())[0]trafoMap[key] = 0.0elif len(hist) == 2:keys = sorted(list(hist.keys()))trafoMap[keys[0]] = 0.0trafoMap[keys[1]] = 1.0else:N = cnt = 0for it in hist:N += hist[it]assert (N == len(dataIn))mean = 0.0for it in sorted(list(hist.keys())):rankV = cnt / NrankV = rankV * 0.998 + 1e-3rankV = self._vdErfInvSingle01(rankV)assert(rankV >= -3.0 and rankV <= 3.0)mean += hist[it] * rankVtrafoMap[it] = rankVcnt += hist[it]mean /= Nfor it in trafoMap:trafoMap[it] -= meanself._trafo_map = trafoMapreturndef _binary_search(self, keys, val):start, end = 0, len(keys)-1while start+1 < end:mid = (start + end) // 2if val < keys[mid]:end = midelse:start = midreturn keys[start], keys[end]def transform(self, dataIn:list) -> dict:dataOut = []trafoMap = self._trafo_mapkeys = list(trafoMap.keys())if len(keys) == 0:raise Exception('No transfermation map')for i in range(len(dataIn)):val = dataIn[i]trafoVal = 0.0if val <= keys[0]:trafoVal = trafoMap[keys[0]]elif val >= keys[-1]:trafoVal = trafoMap[keys[-1]]elif val in trafoMap:trafoVal = trafoMap[val]else:lower_key, upper_key = self._binary_search(keys, val)x1, y1 = lower_key, trafoMap[lower_key]x2, y2 = upper_key, trafoMap[upper_key]trafoVal = y1 + (val - x1) * (y2 - y1) / (x2 - x1)dataOut.append(trafoVal)dataOut = np.asarray(dataOut, dtype=self.precision)self._output = dataOutreturn self._output# if __name__ == '__main__':# data = [-19.9378,10.5341,-32.4515,33.0969,24.3530,-1.1830,-1.4106,-4.9431,# 14.2153,26.3700,-7.6760,60.3346,36.2992,-126.8806,14.2488,-5.0821,# 1.6958,-21.2168,-49.1075,-8.3084,-1.5748,3.7900,-2.1561,4.0756,# -9.0289,-13.9533,-9.8466,79.5876,-13.3332,-111.9568,-24.2531,120.1174]# rgn = RGN(data)# print(rgn.output)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值