# -*- coding: utf-8 -*-
# Author: Yikun Zhang
# Last Editing: March 19, 2024
# Description: This file contains the implementations of common kernel functions.
import numpy as np
#=======================================================================================#
[docs]
def rectangular(t):
'''
Rectangular/uniform kernel function.
Parameters
----------
t: float or (n,)-array
The query points.
Return
-------
res: float or (n,)-array
The kernel values evaluated at the query points.
'''
ind = (np.abs(t)<=1)
res = np.abs(0.5*ind)
return res
[docs]
def triangular(t):
'''
Triangular kernel function.
Parameters
----------
t: float or (n,)-array
The query points.
Return
-------
res: float or (n,)-array
The kernel values evaluated at the query points.
'''
ind = (np.abs(t)<=1)
res = np.abs((1-np.abs(t))*ind)
return res
[docs]
def epanechnikov(t):
'''
Epanechnikov kernel function.
Parameters
----------
t: float or (n,)-array
The query points.
Return
-------
res: float or (n,)-array
The kernel values evaluated at the query points.
'''
ind = (np.abs(t)<=1)
res = np.abs(0.75*(1-t**2)*ind)
return res
[docs]
def biweight(t):
'''
Biweight/quartic kernel function.
Parameters
----------
t: float or (n,)-array
The query points.
Return
-------
res: float or (n,)-array
The kernel values evaluated at the query points.
'''
ind = (np.abs(t)<=1)
res = np.abs(((15/16)*(1-t**2)**2)*ind)
return res
[docs]
def triweight(t):
'''
Triweight kernel function.
Parameters
----------
t: float or (n,)-array
The query points.
Return
-------
res: float or (n,)-array
The kernel values evaluated at the query points.
'''
ind = (np.abs(t)<=1)
res = np.abs((35/32)*(1-t**2)**3*ind)
return res
[docs]
def tricube(t):
'''
Tricube kernel function.
Parameters
----------
t: float or (n,)-array
The query points.
Return
-------
res: float or (n,)-array
The kernel values evaluated at the query points.
'''
ind = (np.abs(t)<=1)
res = np.abs((70/81)*(1-np.abs(t)**3)**3*ind)
return res
[docs]
def gaussian(t):
'''
Gaussian kernel function.
Parameters
----------
t: float or (n,)-array
The query points.
Return
-------
res: float or (n,)-array
The kernel values evaluated at the query points.
'''
res = (1/np.sqrt(2*np.pi))*np.exp(-0.5*t**2)
return res
[docs]
def bigaussian(t):
'''
Bigaussian kernel function.
Parameters
----------
t: float or (n,)-array
The query points.
Return
-------
res: float or (n,)-array
The kernel values evaluated at the query points.
'''
res = (2/np.sqrt(np.pi))*(t**2)*np.exp(-t**2)
return res
[docs]
def cosine(t):
'''
Cosine kernel function.
Parameters
----------
t: float or (n,)-array
The query points.
Return
-------
res: float or (n,)-array
The kernel values evaluated at the query points.
'''
ind = (np.abs(t)<=1)
res = np.abs((np.pi/4)*np.cos(np.pi*t/2)*ind)
return res
[docs]
def logistic(t):
'''
Logistic kernel function.
Parameters
----------
t: float or (n,)-array
The query points.
Return
-------
res: float or (n,)-array
The kernel values evaluated at the query points.
'''
res = 1/(np.exp(t)+2+np.exp(-t))
return res
[docs]
def sigmoid(t):
'''
Sigmoid kernel function.
Parameters
----------
t: float or (n,)-array
The query points.
Return
-------
res: float or (n,)-array
The kernel values evaluated at the query points.
'''
res = (2/np.pi)/(np.exp(t)+np.exp(-t))
return res
[docs]
def silverman(t):
'''
Silverman kernel function.
Parameters
----------
t: float or (n,)-array
The query points.
Return
-------
res: float or (n,)-array
The kernel values evaluated at the query points.
'''
res = 0.5*np.exp(-np.abs(t)/np.sqrt(2))*np.sin(np.abs(t)/np.sqrt(2)+np.pi/4)
return res
[docs]
def KernelRetrieval(name):
'''
Retrieving the kernel function, its second moment, and its variance based on
the name.
Parameters
----------
name: str
The name of the kernel function.
Return
--------
kern_func: python function
The kernel function.
sigmaK_sq: float
The second moment of the kernel function.
K_sq: float
The variance of the kernel function.
'''
if name == "rectangular":
return rectangular, 1/3, 1/2
if name == "triangular":
return triangular, 1/6, 2/3
if name == "epanechnikov":
return epanechnikov, 1/5, 3/5
if name == "biweight":
return biweight, 1/7, 5/7
if name == "triweight":
return triweight, 1/9, 350/429
if name == "tricube":
return triangular, 35/243, 175/247
if name == "gaussian":
return gaussian, 1, 1/(2*np.sqrt(np.pi))
if name == "bigaussian":
return bigaussian, 3/2, 3*np.sqrt(2/np.pi)/8
if name == "cosine":
return cosine, 1-8/(np.pi**2), np.pi**2/16
if name == "logistic":
return logistic, np.pi**2/3, 1/6
if name == "sigmoid":
return sigmoid, np.pi**2/4, 2/(np.pi**2)
if name == "silverman":
return silverman, 0, 3*np.sqrt(2)/16