0%

K近邻

适用于小型数据集,基准模型,容易解释。不适用于高维稀疏数据,不能外推(超出训练数据集的范围进行预测)。

线性模型(最小二乘法、岭回归、Lasso回归、弹性网络、逻辑回归、线性支持向量机)

非常可靠的首选算法,适用于非常大的数据集,也适用于高维数据,可以外推。在低维空间中泛化性能可能很差(这还要看具体问题本身的特点,还可以通过扩展特征来增加线性模型的可用性)。

其中最小二乘法、岭回归、Lasso回归、弹性网络为回归器,不需要数据缩放。逻辑回归、线性支持向量机为分类器,逻辑回归如果不进行数据缩放会导致收敛较慢需要增加迭代次数,线性支持向量机需要进行数据缩放。

朴素贝叶斯(高斯朴素贝叶斯、伯努利朴素贝叶斯、多项式朴素贝叶斯)

只适用于分类问题。适用于非常大的数据集和高维数据,比线性模型速度快,精度低于线性模型。

决策树

速度很快,不需要数据缩放,可以可视化,很容易理解。不适用于高维稀疏数据,不能外推。

随机森林

几乎总是比单棵决策树的表现要好,鲁棒性很好(可以容忍训练集中有一些错误的数据),通常不需要反复调节参数就可以给出很好的结果,不需要数据缩放,不适用于高维稀疏数据,不能外推。

梯度提升机

是监督学习中最强大也最常用的模型之一。精度通常比随机森林略高,与随机森林相比,训练速度更慢,但预测速度更快,需要的内存更少,比随机森林需要更多的参数调节,不适用于高维稀疏数据,不能外推。

核支持向量机

是非常强大的模型,允许决策边界很复杂,在低维和高维数据集上的表现都很好。对于特征含义相似的中等大小(几千~几万这样的量级)的数据集很强大。需要数据缩放,对参数敏感,可以外推。

神经网络(多层感知机)

可以构建非常复杂的模型,特别是对于大型数据集而言。对于数据缩放敏感,对参数选取敏感。大型网络需要很长的训练时间。

scikit-learn中的算法实现

算法名 所属模块 分类器 回归器 主要参数(-号表示越小越模型复杂)
K近邻(KNN) neighbors KNeighborsClassifier KNeighborsRegressor -n_neighbors=5
最小二乘法 linear_model LinearRegression
岭回归 linear_model Ridge -alpha=1
Lasso回归 linear_model Lasso -alpha=1
弹性网络 linear_model ElasticNet -alpha=1, l1_ratio=0.5
逻辑回归 linear_model LogisticRegression +C=1.0
线性支持向量机 svm LinearSVC LinearSVR +C=1.0
高斯朴素贝叶斯 naive_bayes GaussianNB
伯努利朴素贝叶斯 naive_bayes BernoulliNB -alpha=1.0
多项式朴素贝叶斯 naive_bayes MultinomialNB -alpha=1.0
决策树 tree DecisionTreeClassifier DecisionTreeRegressor +max_depth
随机森林 ensemble RandomForestClassifier RandomForestRegressor +n_estimators
梯度提升机 ensemble GradientBoostingClassifier GradientBoostingRegressor +n_estimators, +learning_rate
核支持向量机 svm SVC SVR kernel=‘rbf’, +C, +gamma
多层感知机 neural_network MLPClassifier MLPRegressor solver=‘lbfgs’, -alpha, hidden_layer_sizes

shader里面有个函数叫smoothstep,是用来做平滑插值的,dx的文档对其介绍如下

smoothstep (DirectX HLSL)

Returns a smooth Hermite interpolation between 0 and 1, if x is in the range [min, max].

ret smoothstep(min, max, x)

Parameters

  • min

    [in] The minimum range of the x parameter.

  • max

    [in] The maximum range of the x parameter.

  • x

    [in] The specified value to be interpolated.

Return Value

Returns 0 if x is less than min; 1 if x is greater than max; otherwise, a value between 0 and 1 if x is in the range [min, max].

Remarks

Use the smoothstep HLSL intrinsic function to create a smooth transition between two values. For example, you can use this function to blend two colors smoothly.

可以看介绍里说了,Smoothstep就是使用的Hermite插值,
三次Hermite插值公式是

P(t)=(2t33t2+1)P0+(t32t2+t)M0+(t3t2)M1+(2t3+3t2)P1P(t) = (2*t^3 - 3*t^2 + 1)P0 + (t^3 - 2*t^2 + t)M0 + (t^3 - t^2)M1 + (-2*t^3 + 3*t^2)P1

其中P0是起始点,P1是终结点,M0是起始点处的方向,M1是终结点处的方向。参数t从0变化到1的过程中P(t)形成的轨迹构成了从P0到P1的平滑曲线,而且这个曲线两端顶点处的切向量就是M0,M1,还要说明的就是M0,M1的大小会影响到曲线的形状,可以把这个过程想象成一个机车从P0开到P1,M0,M1更像是速度的表示,当M0比较大时,在P0附近的曲线会沿M0方向冲出去更多一些才会弯曲。
Smoothstep插值的公式是

Smoothstep(t)=2t3+3t2Smoothstep(t) = -2*t^3 + 3*t^2

对于dx文档中的参数,我们可以使用

t=(xmin)/(maxmin)t = (x-min) / (max-min)

先计算得到t再使用前面的公式。

为什么Smoothstep的公式比Hermite简化的这么多,我尝试推导了一下,
把(0,0)代入P0,(1,1)代入P1,(1,0)代入M0,(1,0)代入M1,
用Px(t)表示Hermite插值的x分量,Py(t)表示Hermite插值的y分量,则有

Px(t)=(2t33t2+1)0+(t32t2+t)1+(t3t2)1+(2t3+3t2)1=tP_x(t) = (2*t^3 - 3*t^2 + 1)*0 + (t^3 - 2*t^2 + t)*1 + (t^3 - t^2)*1 + (-2*t^3 + 3*t^2)*1 = t

Py(t)=(2t33t2+1)0+(t32t2+t)0+(t3t2)0+(2t3+3t2)1=2t3+3t2P_y(t) = (2*t^3 - 3*t^2 + 1)*0 + (t^3 - 2*t^2 + t)*0 + (t^3 - t^2)*0 + (-2*t^3 + 3*t^2)*1 = -2*t^3 + 3*t^2

再把参数t消掉就可以得到

Py=2Px3+3Px2P_y = -2*Px^3 + 3*P_x^2

和Smoothstep插值公式是一致的。

我把这篇旧博文转过来主要为了测试在网页上渲染Markdown公式的表现 😛

* boost 标准库扩展,广为人知的“准”标准库
* pthread windows下的posix线程实现
* libcurl 文件传输库,支持多种协议。
* libeay32 OpenSSL Library
* libtidy,htmlcxx 解析html的库
* zlib 数据压缩库,本数以千计的软件广泛使用,已成为一种事实上的业界标准。
* freetype C接口的type2字体处理库
* libmad 一个编解码mp3的库
* libogg 一个编解码ogg音频格式的库
* libsnd 一个开源的编解码十多种音频格式的库
* ffmpeg 一个音视频格式编解码、转换的库
* FreeImage,CxImage 图像操作类库。它可以快捷地存取、显示、转换各种图像。
* libpng,libjpeg 图片的编码解码
* angelscript 一个类似lua的脚本引擎 其脚本风格类似于标准c语言
* flac/flac++ 一个编解码flac音频格式的库
* tinyxml,rapidxml,libxml 都是关于xml解析方面的
* luaplus,luabind 都是涉及绑定lua和c的库
* ode,bullet 开源的物理引擎库
* timidity 一个可以把mid音频格式转化为wav格式的库
* vlc 一个视频播放的库
* zthread 一个类型boost-thread,pthread的c
风格的多线程库
* SDL 一个自由的跨平台的多媒体开发包,主要做音视频播放
* HGE Windows下基于d3d硬件加速的2d游戏引擎,基于DX8,已经停止维护很久了
* OpenCV 一个开源的图像处理库,实现了图像处理和计算机视觉方面的很多通用算法。
* mygui,cegui 都是游戏上使用的GUI系统
* Orge,irrlicht 都是开源的游戏中间件
* Qt,wxWidgets 开源的跨平台的C构架库,主要是做跨平台GUI
* loki 一个实验性质的c

* ace 一个网络通信库
* FMOD 游戏音频引擎
* SQLite 一款轻型的数据库
* AmHttpSocket 基于WinAPI的简便http协议应用包