1、回归问题
1.1、线性回归
感觉这个没啥好写的,就是用最小二乘法的方差最小,线性模型y=kx+b,在已知大量y跟大量x的情况下,求出k跟b,使得拟合方法最小。
求解方法:感觉也挺简单的,假设x是m维,y是1维(感觉这种比较常见),有n组数据。得到矩阵Y增加一维,变成2维,另一维全用1表示,矩阵X也是一样,就能得到系数矩阵A,A是m+1维。就有
YT=AXT.
T表示矩阵的转置,如果XT有逆,可以同乘XT就能直接求出A,可以同乘X,然后同乘(XTX)-1,就能得到A.总结就是:
A=YTX(XTX)-1
还有加权线性回归,这个比较简单,我们普通的线性回归相当于每个权重相等,可以想成都是一,而加权线性回归每个权重不一定一样。跟普通的线性回归一样,只是在回归最小方差前面加了个权重系数,依然对A求导,可以得到:
A=(XTWX)-1XTWY
1.2、非线性回归
比较常见的有多项式回归模型,指数回归模型,幂函数回归模型,对数回归模型等等的。损失函数一般都是用最小方差。有些不好求的,用泰勒级数展开近似。
泰勒级数展开式:
还有个人感觉可能不是很常见的,高斯过程回归:
高斯过程的一个特点就是,对于每个x都有一个对应的高斯分布,而对于一组X={x1,x2,…,xt},存在一个联合高斯分布,这个高斯分布满足
其中
则有:
如果来了一个新样本x(t+1),那么高斯分布为:
1.3、优化类
逐步回归:加入一个数据就进行一次F检验这类,通过需要判断数据加不加入,相当于做个数据清洗这类。
岭回归:就是线性回归加一个L2正则化项
套索回归:就是线性回归加一个L1正则化项。
弹性回归:就是线性回归同时加入L1正则化项跟L2正则化项。
霍夫变换:把参数变变量,变量变成参数,这样每加入一个数据就会画一条线,相交线最多的那个点就是k跟b。
感觉目前能想到的关于回归问题的就这些。
2、分类问题
2.1、逻辑回归
逻辑回归是线性回归演化出来的解决分类问题的方法,线性回归是y=kx+b,逻辑回归变成了y=s(kx+b),加了一个sigmoid函数来映射到0-1的区间,这个就表示概率。解决一个二分类问题,是这个类或者不是这个类。
比如下面这个0-1二分类问题,我们人是可以很简单的在中间画一条直线,把数据分成两个部分。但是电脑不知道这条线该怎么画,逻辑回归就是解决怎么画这条线,线性划分把数据分成两部分的问题。
边界直线函数为(x为n维):
预测函数为:
1这个类在预测直线右边,换句话说,只要是1这个类就大于预测直线,如果只有1一个类,保持所有数据的预测函数结果值最大就行,但是里面也有0这个类,这个类是需要小于预测直线,如果使用同样的表达式,两个类描述的方向是相反的,所以转为同一方向有:
然后就是损失函数,一般在分类问题用到的损失函数是交叉熵。交叉熵函数表达为:
A跟B分别表示两个事件,在逻辑回归中,我们可以把y想成A,表示真实的类别,把h(x)想成B,表示预测的类别,如果真实类别跟预测类别越接近,则交叉熵越小,否则,则交叉熵越大。结合得:
就是求J最小时候的参数的值(参数符号打不来,截图太。。。理解意思就成),求最大值最小值问题,最常用的就是求极值,然后通过多个极值和端点值比较,得出最大或者最小值。但是,这个复杂的公式,用求导把每个极值点都求出来是困难的。我们用梯度下降求解:
可得(a是一个超参数,是一个常量,可以设置,可以理解为如果我们想设置a,把a设置成am,所以1/m可以省略):
最后有:
其中E为:
2.2、多个逻辑回归(解决多分类问题)
这个是基于2.1逻辑回归只能解决2分类问题的改进,原理也是很简单,比如有k个类(A,B,C…),每个类别都可以看成是一个二分类问题,是这个类,或者不是这个类(比如是A类或者不是A类),然后就用逻辑回归训练k个二分类器,最后的结果返回概率最大的那个类(因为预测的结果是0-1范围内,越接近1表示越像这个类)。
感觉也比较简单。没啥好说的。
2.3、softmax
这个同样是在逻辑回归上的推广。
只是逻辑回归是二分类,但是sofmax是多分类,在表示时候就不是简单的h和1-h就能表示完成,而是:
损失函数为:
其中{y=j}表示如果y跟j相等,也就是y是j类,则为1,否则,则为0.
得到梯度公式:
跟多个逻辑回归一样,一样是要训练k*n个参数,k表示类的数量,n表示x的特征维度。
2.4 、SVM
还是假设在一个二维问题上(因为二维问题可视化,看的明白)
把蓝色点和红色点分成两部分的直线有很多,在SVM中,是找到能尽可能分开这两个类的那条直线。我们假设中间的这条最优直线为y=kx+b,就存在着每个点到达这条直线的距离,我们用di表示每个点到达这条直线的距离,那就变成了一个,求di累加的值最大的问题。但是,如果只谈论最大,也不可取,如果出现一条直线,在这堆点很远的位置,或者无限的位置,那不就是di的累加变成无限大了吗?所以要有约束,规定方向,应该说距离的方向,蓝点跟红点距离直线的距离方向是相反的。
统一描述:
这样就变成了,在上述约束条件下求间隔距离最大的问题,用数学表达式可以表示为:
在约束条件下的最值问题,用拉格朗日求解。
对了,这个最小值,是因为:
wx+y的绝对值是一定大于1的,所以中间的式子式一定大于最右边的式子的,又是一个希望d最大的式子,我们只要求最有边的式子尽可能大,中间的式子也一定是尽可能大(因为中间的式子是大于右边的式子的)
同样的,求右边的式子尽可能大,转换为它的倒数,就是希望它的倒数尽可能小,这样转换的目的就是为了更好的计算。(因为能达到同样的效果,为什么不用更简单容易计算的呢?)
拉格朗日函数:
有:
求偏导:
带入L(w,y,a)有:
有:
根据上述求出w:
分类函数(都是网上拼拼凑凑的公式截图):
加入核函数后:
然后sigmoid(f(x))就是得到最后的分类,这里面a是未知的,通过SMO算法来求,只要a已知,则w跟b就能通过a求出。
SMO算法只能求出a的近似解。
2.5、朴素贝叶斯
朴素贝叶斯比较简单,基本思想:
对于给出的待分类项,求解此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类属于哪个类别。通过P(A|B),P(A),P(B)来求P(B|A)。
朴素贝叶斯比较简单,举例一个很简单例子,如果有n组数据,每组数据的特征为x,标签为y。可以理解为y就是A,x就是B,求的就是在已知有x特征下,是y类的概率,如果有k个类别,就会求k个P(yi|x),里面最大的那个就是x的类别,至于P(x|yi),由于我们这是朴素贝叶斯,有个假定条件,就是P(AB)=P(A)P(B),就是相互独立,不然也不会叫朴素贝叶斯了,x里面是有多个特征的,就有P(x|yi)=p(x1|yi)*p(x2|yi)…*p(xm|yi),然后就是对每个类别计算p(yi),对每个特征计算所划分条件概率。
2.6、决策树
决策树由结点和有向边组成。结点有两种类型:内部结点和叶结点,其中内部结点表示一个特征或属性,叶结点表示一个类。
决策树的原理很简单,就是输入n组数据x,标签y,可能有m个特征,把每个特征作为内部节点,构建一棵树,每一层一个特征。叶子节点为类别。构建好树后,输入一个新数据x,会从上到下依次做决策,最终会到一个叶子节点中,这个叶子节点所表示的类别就是这个新数据x的标签。
接下来就是有m个特征,哪些特征先做决策,哪些特征后做决策?
我们用信息增益来选择哪些特征先做决策,哪些特征后做决策,这就是ID3算法。
信息增益定义为整个数据集的熵减去给定的这个特征下的条件熵。
数据集D的熵:
在特征A下的条件熵:
信息增益:
信息增益大的就先决策,信息增益小的就后决策。
C4.5就不是用信息增益来选择哪个先决策,哪个特征后决策,而是选择信息增益比最大的先做决策,信息增益比小的后做决策。
信息增益比:
只是在信息增益的基础上再除以数据集D的熵。
还有一种,就是CART算法,这种算法用基尼指数来决定哪个特征先决策,哪个特征后做决策。
数据集D的基尼指数为:
对于属性a的基尼指数为:
2.7、集成学习
这个原理很简单,就是多个弱分类器合在一起变成一个强分类器,关键就在于怎么“合”在一起。比较主流的两种简单的方法合在一起。
第一种是boosting,就是给每个弱分类器一个权重,通过数据更新权重,这样把多个弱分类器合在一起。多个决策树跟boosting结合就变成提升树。
另一种方法就是bagging,是对每个弱分类器又放回的随机抽取数据进行训练,用投票的方式来决定属于哪一类,bagging更进一步就是随机森林。不过随机森林是随机选择k个属性组成属性集,然后从这里面选择最优的那个。
2.8、k近邻算法
差点忘了。。这个也是一个很简单的方法,就是找出与当前点距离最近的k个点,这k个点中,最多的点属于哪个类别,这个点就属于哪个类别。
3、聚类问题
3.1、k-means聚类
很经典的一个聚类方法。方法也很简单,随机选择k个点作为聚类的初始点,然后当前点与这k个类的中心点谁更近,就加入这个类,然后更新中心点,中心点的更新方法就是类中所有点的平均值,这样,直到中心点趋于稳定。
3.2、k-media聚类
这个跟k-means聚类非常非常像,只是k-means聚类是选取平均值作为中心点,而k-media聚类是选取中间点来作为中心点,除此之外,其他的都一样。
3.3、层次聚类
这个聚类方法也很简单,就是n个数据,就认为有n个类别,如果我们需要n-1个类,就把距离最近的两个类别合成一个类别,如果需要n-2个,再把最近的两个合成一个,这样一步一步下去,就能把数据聚类。
3.4、密度聚类(DNSCAN)
这个算法也简单,随机选取一个点,判断这个点是否为核心点,判断核心点的依据是提前设置阈值,在这个点一个范围内有多少点,这个点才能算得上是核心点,如果不是核心点,则认为是噪声点,舍弃,如果是核心点,则建立第一个类,然后以这第一个核心点为起始点,把这个起始点周围阈值范围内的点全部加入这个类,这个类中的其他点也是把阈值范围内的点加入这个内,加完后。再去随机选取点(那些还没处理过的点集中),再选取核心点,接着再这样做。直至所有点都被访问一遍。