通过图像对核函数进行直观理解

载入库

%matplotlib inline
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import numpy.linalg as la

几个比较著名的核函数

内积

def linear():
    return lambda x, y: np.inner(x, y)

多项式

def polykernel(dimension, offset):
    return lambda x, y: (offset + np.inner(x, y)) ** dimension

径向基

def radial_basis(gamma=10):
    return lambda x, y: np.exp(-gamma*la.norm(np.subtract(x, y)))

高斯

def gaussian(sigma):
    return lambda x, y: \
        np.exp(-np.sqrt(la.norm(x-y) ** 2 / (2 * sigma ** 2)))

正切

def hyperbolic_tangent(kappa, c):
    return lambda x, y: np.tanh(kappa * np.dot(x, y) + c)

通过图像来直观地展示核函数的作用

选定图像

这里写图片描述

读入图像

img=plt.imread("./example.jpg")

图像通道合并

img=img.max(axis=2)

图像显示

plt.imshow(img)
plt.show()

这里写图片描述

核函数效果展示

准备画布

X = np.arange(-1.5, 1.5, 0.01)
Y = np.arange(-1.5, 1.5, 0.01)
X, Y = np.meshgrid(X, Y)

fig = plt.figure()
ax = Axes3D(fig)

初始图像

ax.plot_surface(X,Y, img)

这里写图片描述

内积核函数

数据填充

img4kernel=np.zeros((300,300))
for i,x_i in enumerate(img[:,:]):
    for j,x_j in enumerate(img[:,:]):
        img4kernel[i,j]=linear()(x_i,x_j)

转换后的图像展示

ax.plot_surface(X,Y, img4kernel)

这里写图片描述

plt.imshow(img4kernel)

这里写图片描述

多项式核函数

数据填充

img4kernel=np.zeros((300,300))
for i,x_i in enumerate(img[:,:]):
    for j,x_j in enumerate(img[:,:]):
        img4kernel[i,j]=polykernel(2,0)(x_i,x_j)

转换后的图像展示

ax.plot_surface(X,Y, img4kernel)

这里写图片描述

plt.imshow(img4kernel)

这里写图片描述

径向基核函数

数据填充

img4kernel=np.zeros((300,300))
for i,x_i in enumerate(img[:,:]):
    for j,x_j in enumerate(img[:,:]):
        img4kernel[i,j]=radial_basis()(x_i,x_j)

转换后的图像展示

ax.plot_surface(X,Y, img4kernel)

这里写图片描述

plt.imshow(img4kernel)

这里写图片描述

高斯核函数

数据填充

img4kernel=np.zeros((300,300))
for i,x_i in enumerate(img[:,:]):
    for j,x_j in enumerate(img[:,:]):
        img4kernel[i,j]=gaussian(0.5)(x_i,x_j)

转换后的图像展示

ax.plot_surface(X,Y, img4kernel)

这里写图片描述

plt.imshow(img4kernel)

这里写图片描述

正切核函数

数据填充

img4kernel=np.zeros((300,300))
for i,x_i in enumerate(img[:,:]):
    for j,x_j in enumerate(img[:,:]):
        img4kernel[i,j]=hyperbolic_tangent(2,2)(x_i,x_j)

转换后的图像展示

ax.plot_surface(X,Y, img4kernel)

这里写图片描述

plt.imshow(img4kernel)

这里写图片描述

总结

更多关于核函数的内容可以参考该github仓库

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值