Kernal Function | 核函数

通俗易懂理解核函数 in 《hands on machine learning with scikit-learn and tensorflow》

核函数的作用

某些数据在原始空间无法线性可分,可以将其映射高维空间处理。
提问:如何映射?何种高维空间?
假设:映射为Φ,映射后的空间为Φ(x)
问题:要跟不知道我们要什么样的Φ

在高维空间中划分超平面主要涉及 样本xi样本xj 之间的內积运算<Φ(xi),Φ(xj)>(这里具体参见西瓜书P126)
核函数的作用就是:k(xi,xj) = <Φ(xi),Φ(xj)>, 使得在低维空间操作xi,xj上完成高维Φ(xi),Φ(xj)想要完成的运算。

结合上图《hands on machine learning with scikit-learn and tensorflow》中的描述,做出个人理解:
核函数首先在samples上找1个landmark,然后计算其他所有数据同这个landmark的核函数距离,之后将这个距离作为一个特征使用。
如要生成更多的特征,那么就找更多的landmark,最多可以找到m个(m = the num of samples)

核函数是一种距离公式,它可以用来生成特征。

核函数的公式

这里只例举高斯核函数,我看过两种表达方式,分别为高斯核、高斯径向基函数如下:

高斯核,x1x2都是样本,σ是高斯带宽
高斯径向基函数RBF, l是landmark

核函数的代码

'''
np.linalg.norm(): 默认参数下求二范数,双竖运算符∥...∥ 表示Norm运算,即取向量的‘度量’
np.subtract(a,b):a-b

---

高斯核函数:k(||x-xc||)=exp{- ||x-xc||^2 / (2*σ^2) }
xc为核函数中心
σ为函数的宽度参数

---

高斯核函数图像类似于一张纸中间隆起一块,σ越小则越尖
'''
def calc_gaussian(x, center, width):
    return np.exp(-(np.square(np.linalg.norm(np.subtract(x, center))))/(2*np.square(width)))
for i in range(1,M):
        phi[:,i] = calc_gaussian(x,landmark[i],1) # 设置了m个landmark

核函数逻辑回归

y = wx+b 无法完成分类,对x进行变化,x' = k(x,l) ==> y = wx'+b 可以对x'划分
已知x',y可以求出w,b
对new_x,进行变化new_x',带入y = wx'+b,即可进行预测
为了提高预测准确性,往往会设置多个landmark求多个x'得到多个模型y = wx'+b

"""
===================================================================
Support Vector Regression (SVR) and Least Squares with Guassion Kernal
===================================================================
Source: https://github.com/JinScientist/Gaussion-Kernal-Least-Squares-Regression/
"""
print(__doc__)

import numpy as np
from sklearn.svm import SVR
import matplotlib.pyplot as plt
M=20 # number of kernal function
lamda=1  #regularization coefficient
############# Linear Combination of Gaussion(LGK) kernal
def LGK(M,x,y,lamda):
    N=len(x)
    mu=np.linspace(0, 6, M)
    phi=np.zeros(shape=[N,M])
    for i in range(1,M):
        phi[:,i]=np.exp(-np.square(x-mu[i-1])/2).reshape(40,)
    phiinv=np.linalg.pinv(phi)
    w=phiinv.dot(y)
    phiT=np.transpose(phi)
    wr=np.linalg.inv(lamda*np.identity(M)+phiT.dot(phi)).dot(phiT).dot(y)
    print('Dimension of Moore-Penrose pseudo-inverse:')
    print(phiinv.shape)
    print('Dimension of y:')
    print(y.shape)
    return(w,wr)#wr:regularized w

###########predict from trained LGK
def LGKpredict(M,w,x):
    N=len(x)    
    phi=np.zeros(shape=[N,M])
    mu=np.linspace(0, 6, M)
    for i in range(1,M):
        phi[:,i]=np.exp(-np.square(x-mu[i-1])/2).reshape(40,)
    ypredict=phi.dot(w.reshape(M,1))
    return(ypredict)
# Generate sample data
X = np.sort(5 * np.random.rand(40, 1), axis=0)
y = np.sin(X).ravel()

###############################################################################
# Add noise to targets
y[::5] += 3 * (0.5 - np.random.rand(8))

###############################################################################
# Fit regression model

(w,wr)=LGK(M,X,y,lamda)
y_LGK=LGKpredict(M,w,X)
y_LGK_r=LGKpredict(M,wr,X)
np.savetxt("w.csv", w, delimiter=",")
print('Dimension of W_ML:')
print(w.shape)

svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1)
svr_lin = SVR(kernel='linear', C=1e3)
svr_poly = SVR(kernel='poly', C=1e3, degree=2)
y_rbf = svr_rbf.fit(X, y).predict(X)
y_lin = svr_lin.fit(X, y).predict(X)
y_poly = svr_poly.fit(X, y).predict(X)

###############################################################################
# look at the results
lw = 1
plt.scatter(X, y, color='darkorange', label='data')
plt.hold('on')
plt.plot(X, y_rbf, color='navy', lw=lw, label='RBF model')
plt.plot(X, y_lin, color='c', lw=lw, label='Linear model')
plt.plot(X, y_poly, color='cornflowerblue', lw=lw, label='Polynomial model')
plt.plot(X, y_LGK, color='maroon', lw=lw, label='Gausian kernal \n Least square model')
plt.plot(X, y_LGK_r, color='lime', lw=lw, label='Regularized Gausian kernal \n Least square model')
plt.xlabel('data')
plt.ylabel('target')
plt.title('Gausian Kernal Least Square and Support Vector Regression')
lgd=plt.legend(bbox_to_anchor=(1.05, 1), loc=2)
plt.savefig('SVR.png',bbox_extra_artists=(lgd,), bbox_inches='tight')
Github:Gaussion-Kernal-Least-Squares-Regression
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352