机器学习里的kernel是指什么?

本文首先定义了核函数的概念,并通过实例说明了核函数如何简化高维空间中特征向量的内积计算过程,进而避免了直接计算带来的复杂度。此外,文章还探讨了核函数在机器学习算法中的应用方式及其在支持向量机(SVM)中的具体作用。

1.先给个定义:核函数Kkernel function)就是指K(x, y) = ,其中xyn维的输入值,f(·) 是从n维到m维的映射(通常而言,m>>n)。是xy的内积(inner product),严格来说应该叫欧式空间的标准内积,也就是很多人常说的点积(dot product)。  

2.    

3.光看这一段还是不明白kernel是什么,用来干什么的...对吧?不要急。一个好的知识分享者是不会把一篇空洞的定义扔下就不管的,TA会告诉你这个概念的intuition,然后给你举个小小的栗子,最后告诉你几个应用场景。Andrew NgMachine Learning为什么会成为一门现象级的MOOC?原因之一就是因为他除了是个学术上的大神,也同样是个极有质素的知识分享者。所以我要学习他。  

4.  

5.好了,intuitively(这也模仿得太生硬了吧),要计算,我们要先分别计算f(x)f(y),然后再求它们的内积。上面的定义里也说了,经过映射后的xy,维数大大增加,计算内积的成本可能会非常之大,而且在高位空间费力牛劲儿地计算内积,内积又是一个scalar,相当于说又把我们的计算从高维空间拉回到一维空间!所以我们特别想要一个简便运算法,帮助我们不需要奔向高维空间就能在家门口计算得到想要的内积。这时候该轮到我们的猪脚——kernel登场了,它能帮我们做到这一点。  

6.  

7.举个小小栗子。  

8.  

9. x = (x1, x2, x3, x4); y = (y1, y2, y3, y4);  

10.  

11. f(x) = (x1x1, x1x2, x1x3, x1x4, x2x1, x2x2, x2x3, x2x4, x3x1, x3x2, x3x3, x3x4, x4x1, x4x2, x4x3, x4x4); f(y)亦然;  

12.  

13.令核函数 K(x, y) = ()^2.  

14.  

15.接下来,让我们带几个简单的数字进去看看是个什么效果:x = (1, 2, 3, 4); y = (5, 6, 7, 8). 那么:  

16.  

17.f(x) = ( 1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16) ;  

18.  

19.f(y) = (25, 30, 35, 40, 30, 36, 42, 48, 35, 42, 49, 56, 40, 48, 56, 64) ;  

20.  

21. = 25+60+105+160+60+144+252+384+105+252+441+672+160+384+672+1024  

22.  

23.4900.  

24.  

25.好累,对不对?可谁让f(·)把四维空间的数据映射到十六维空间里呢?  

26.  

27.如果我们用核函数呢?  

28.  

29.K(x, y) = (5+12+21+32)^2 = 70^2 = 4900.  

30.  

31.就是这样!  

32.  

33.所以现在你看出来了吧,kernel其实就是帮我们省去在高维空间里进行繁琐计算的简便运算法。甚至,它能解决  

34. 无限维空间

35.无法计算的问题!因为有时f(·)会把n维空间映射到无限维空间去,对此我们常常束手无策,除非是用kernel,尤其是RBF kernelK(x,y) = exp(-||x-y||^2) )。  

36.  

37.在有kernel之前,做machine learning的典型的流程应该是:data --> features --> learning algorithm,但kernel给我们提供了一个alternative,那就是,我们不必定义从datafeature的映射函数,而是可以直接kernel(data) --> learning algorithm,也可以是data --> features --> kernel(features) --> learning algorithm  

38.  

39.所以虽然我们看到kernel常被应用在SVMSVM中的kernel应该是后一种用法,后文再说),但其实要用到内积的learning algorithm都可以使用kernel用到内积的learning algorithm”其实并不少见,不信你可以想一想最普通不过的linear classifier/regressor有没有一个步骤是计算特征向量(feature vectors)。  

40.  

41.<strong>那么kernelSVM究竟扮演着什么角色?</strong>  

42.  

43.初学SVM时常常可能对kernel有一个误读,那就是误以为是kernel使得低维空间的点投射到高位空间后实现了线性可分。其实不然。这是把kernelfeature space transformation 混为了一谈

44.。(这个错误其实很蠢,只要你把SVM从头到尾认真推导一遍就不会犯我这个错。)  

45.还是简单回顾一下吧。SVM就是 y = w'·φ(x) + b,其中φ(x)是特征向量(feature vectors),并且是φ(x)使得数据从低维投射到高位空间后实现了线性可分。而kernel是在解对偶问题的最优化问题时,能够使φ(x)更方便地计算出来,特别是φ(x)维数很高的时候。  

46.  

47.--------------正文完,附上几个链接-----------

48.  

49.kernel的种类繁多,如果想详细了解,可以看看这个帖子  

50.<a class="wrap external" href="//link.zhihu.com/?target=http%3A//crsouza.com/2010/03/kernel-functions-for-machine-learning-applications/" target="_blank">  

51.  

52.Caltech的机器学习:  

53.</a><a class="wrap external" href="//link.zhihu.com/?target=http%3A//work.caltech.edu/telecourse.html" target="_blank">  

54.  

55.台湾大学林轩田《机器学习基石》:  

56.</a><a class="wrap external" href="//link.zhihu.com/?target=https%3A//www.coursera.org/course/ntumlone" target="_blank">  

57.  

58.PS:本来草稿里存的话是想告诉题主,这样的问题好好去翻教材,或者看CaltechAbu-Mostafa教授的公开课Learning from Data,或者看台湾大学林轩田的《机器学习基石》,(前者是后者的导师,而且师徒俩讲课都很萌),弄懂kernel这个概念是不成问题的。  

59.  

60.但当时没有就这样草率地发出来。原因倒不是怕被扣友善度,而是接连地追问了我自己到底弄明白kernel了没有。所以谢谢题主问这个问题,你又驱使我把这个概念完整地思考一遍,并记录下来。  

机器学习中,模型调优是通过调整模型的超参数(hyperparameters)以优化其性能的过程。超参数是模型在训练之前需要手动设置的参数,例如决策树的最大深度、K近邻算法中的邻居数等。这些参数不能通过模型自动学习获得,但对模型的性能有显著影响。调优的目标是找到一组最佳的超参数组合,使模型在验证集或测试集上的表现达到最优,从而提高模型的准确性、降低过拟合或欠拟合的风险,并加快训练过程 [^2]。 ### 常用的机器学习模型调优技术 1. **网格搜索(Grid Search)** 网格搜索是一种穷举搜索方法,它通过遍历用户定的所有超参数组合来寻找最优解。虽然这种方法可以保证找到给定范围内的最优参数,但由于其计算复杂度较高,在参数空间较大时效率较低。Scikit-Learn 提供了 `GridSearchCV` 工具来实现这一功能 [^3]。以下是一个使用 `GridSearchCV` 进行网格搜索的示例代码: ```python from sklearn.model_selection import GridSearchCV from sklearn.svm import SVC from sklearn.datasets import load_iris # 加载数据集 iris = load_iris() X, y = iris.data, iris.target # 定义要搜索的超参数范围 param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']} # 创建SVM分类器 model = SVC() # 使用GridSearchCV进行调优 grid_search = GridSearchCV(model, param_grid, cv=5) grid_search.fit(X, y) # 输出最佳参数和得分 print("Best parameters found: ", grid_search.best_params_) print("Best cross-validation score: {:.2f}".format(grid_search.best_score_)) ``` 2. **随机搜索(Random Search)** 随机搜索与网格搜索类似,但它不是遍历所有可能的组合,而是从超参数空间中随机选择一定数量的组合进行评估。这种方法在高维空间中通常比网格搜索更高效,因为它可以更快地探索较大的参数空间。Scikit-Learn 提供了 `RandomizedSearchCV` 来实现随机搜索 [^3]。 3. **贝叶斯优化(Bayesian Optimization)** 贝叶斯优化是一种基于概率模型的序贯设计策略,它通过构建目标函数的概率模型并利用该模型来决定下一步应该评估哪些超参数。相比网格搜索和随机搜索,贝叶斯优化能够在较少的迭代次数内找到更好的超参数组合。常见的库包括 `scikit-optimize` 和 `Hyperopt`。 4. **交叉验证(Cross-Validation)** 交叉验证是模型调优过程中用于评估不同超参数组合性能的一种方法。最常见的形式是 K 折交叉验证(K-Fold Cross Validation),其中数据集被划分为 K 个子集,依次将每个子集作为验证集,其余部分作为训练集,最终取平均结果作为评估标。这种方法有助于减少因数据划分带来的偏差 。 5. **早停法(Early Stopping)** 对于一些迭代式学习算法(如神经网络),早停法是一种防止过拟合的有效手段。它的基本思想是在训练过程中监控验证集上的损失,当损失不再下降时提前终止训练,从而避免过度拟合训练数据 [^5]。 6. **集成调优(Ensemble Tuning)** 集成学习方法(如 Bagging 和 Boosting)也可以用于提升模型的整体性能。通过对多个弱学习器的结果进行集成,可以获得更加稳定和准确的预测效果。例如,XGBoost 和 LightGBM 等框架内置了高效的调优机制 [^5]。 7. **数据增强(Data Augmentation)** 数据增强是一种增加训练样本多样性的方法,尤其适用于图像识别等领域。通过对原始数据进行变换(如旋转、翻转、缩放等操作),可以在不收集额外数据的情况下有效提升模型的泛化能力 [^4]。 8. **正则化(Regularization)** 正则化技术(如 L1 和 L2 正则化)可以帮助控制模型复杂度,防止过拟合。L1 正则化倾向于产生稀疏的权重矩阵,而 L2 正则化则鼓励权重值接近零但非零分布 [^5]。 9. **特征选择(Feature Selection)** 特征选择旨在从原始输入特征中挑选出最具代表性和相关性的子集,以简化模型结构并提高泛化能力。常用的方法包括递归特征消除(RFE)、基于重要性评分的选择等 [^5]。 综上所述,机器学习模型调优是一个涉及多种技术和策略的过程,旨在通过合理配置超参数和其他手段来最大化模型性能。不同的应用场景可能需要采用不同的调优方法,因此理解每种技术的特点及其适用条件非常重要。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值