文章标题

来源:互联网 发布:游戏礼包领取软件 编辑:程序博客网 时间:2024/06/09 07:19
 我学习机器学习,深度学习,数据挖掘大概有半年的时间。就把一些自己的感受和学习方法介绍给大家。 我感觉无论是R,python,matlib还是其他的工具算法是指导的核心。我自己学习的来看感觉原理很重要,只有把原理理解透就可以做到举一反三,融会贯通。借着比赛和案例我们可以很快的掌握,不妨把每个案例搞得很透彻,可以把同样的一个数据我们用不同的算法进行分析或者求解,我们可以比较其中的优劣来。我们进行求解之后的结果进行比较,也可以用交叉验证来比较算法。 我的学习资源和大家分享一下: kaggel竞赛:[这里写链接内容](https://www.kaggle.com/) 我们还可以学习kaggle上历年来比赛名次比较高的人的代码和题解让我们可以学习学习:[这里写链接内容](http://blog.csdn.net/qq_26898461/article/details/49275401) 以及我们可以在中国知网上看一些优秀的论文:[这里写链接内容](http://www.cnki.net/) 接下来我将为大家讲解最优解的几种算法。在使用选定算法进行建模时设定或得到的参数很有可能不是最优或最接近的,那么我们需要将参数优化得到更优的预测结果或模型。接下来我们讨论几个参数优化的几种算法分别是交叉验证,网络搜索,模拟退火。 交叉验证通常用于估计模型的误差,将n个对应的误差求平均作为对模型误差的估计。也可以根据这n个值,选出拟合效果更好的模型,其模型的参数也被认为是最优或接近最优的,因此交叉验证可以用来帮助确定参数。 我用了R语言实现了分割样本的函数sampleSplit
这里写代码片sampleSplit<-function(df,k){      df$I_kvalue<-sample(1+((1:dim(df)[1])%%k),dim(df)[1])      return(df)}out=sampleSplit(iris,k=10)table(out$I_kvalue)使用交叉验证得到的参数,我们使用iris数据集,建立Sepal.Length、Sepal.Width Petal.Length对Petal.Width的线性回归模型,代码如下:

这里写代码片set.seed(1234)
k=10
out=sampleSplit(iris,k)
minError=100
finalfit=NULL
for(i in 1:k)
{
trainset=out[outIkvalue!=i,1:(dim(out)[2]2)]testset=out[outI_kvalue==i,1:(dim(out)[2]-2)]
lm.fit=lm(petal.Width-Sepal.Length+Sepal.Width,data=trainset)
testsetpred=predict(lm.fit,testset)error=mean((testsetPetal.Width-testset$pred)^2)
if(error

         lm.fit=lm(petal.Width~Sepal.Length+Sepal.Length,data=iris)         print(lm.fit$coefficients)   网络搜索:   基本原理:将各参数变量值得区间划分为一系列的小区间,并按照顺序计算出对应各参数变量组合所确定的目标,逐一择优,以得到区间的最小目标值及其对应的最佳参数。以确保得到的搜索解释全局最优的或接近最优的,可避免产生重大误差。
对于Sepal.Length、Sepal.Width Petal.Length对Petal.Width的线性回归模型,除了上面的方法,还可以在有限的实数域内进行网络搜索,将参数范围设定在[-1,1]内,进行网    minMSE=1000f_a0=NULLf_b0=NULLf_c0=NULLf_d0=NULLk=55for(a in 0:k) { for(b in 0:k) {     for(c in 0:k)    {      for(d in 0:k)          {               a0<-(-1)+2*a/k               b0<-(-1)+2*b/k               c0<-(-1)+2*c/k               d0<-(-1)+2*d/k               y<-a0+b0*iris$Sepal.Length+c0*iris$Sepal.Width+d0*iris$Sepal.Length               mse<-mean((iris$Petal.Width-y0)^2)               if(mse<minMSE)                  {                      minMSE<-mse                        f_a0<-a0                      f_b0<-b0                      f_c0<-c0                      f_d0<-d0                                          }          }     }  }}print(minMSE)print(c(f_a0,f_b0,f_c0,f_d0))

比较以上两种算法的运行结果可以知道,网络搜索得到的最优参数与通过一般方法的最优参数得到的系数很接近。

退火算法:
原理:是一种通用的概率算法,用来在一个大的搜索空间内寻找命题的最优解。它来源于固体退火之冷却,最后分子以低能状态排列,固体加热到足够高的温度,使分子呈随机排列状态,然后逐步降温使逐步降温与求解最优的关系,从爬山算法说起。爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择最优解作为当前解,直达一个局部最优解,却不一定搜索全局最优解。
退火模拟算法其实也是一种贪心算法,它与爬山相比,是随机的,以一定的概率接受一个比当前解要差的解,所以可能跳出这个局部最优解达到全局最优解。

“`
这里写代码片C<-function(s)
{
1/(s*sin(s)+12)

stmp=NULL
for (i in 1:100)
stmpM<-(stmp,runif(1,0,12.55))
t0<-var(C(stmp))
s0<-runif(1,0,12.55)
iters<-3000
ccnt<-200
hisbest<-12.55
ccntVc<-NULL
for(t in 1:iters)
{
s1<-rnorm(1,mean=s0,sd=2)
while(s1<0||s1>12.55)
{
s1<-rnorm(1,mean=s0,sd=3)

    }     deta_t<-C(s1)-C(s0)     if(delta_t<0)     {        s0<-s1        ccntVc<-c(ccntVc,1)     }else{       p=exp(-delta_t/t0)       if(runif(1,0,1)<p)       {           s0<-s1           ccntVc<-c(ccntVc,1)       }else{          ccntVc<-c(ccntVc,0)       }     }

hisbest<-ifelse(C(s1)<-C(hisbest),s1,hisbest)
hisbest<-ifelse(C(s0)<-C(hisbest),s0,hisbest)
t0<-t0/log(1+t)
if(NROW(ccntVc)>ccnt&& sum(ccntVc)-ccnt+1:NROW(ccntVc)==0)
{
print(paste(“连续”,ccnt,”次没有接受新解,算法终止!”))
break;
}
}
print(s0)
print(t)
print(hisbest)

运行代码之后可以知道模拟退火算法可以接受差解,因此不至于陷入局部最优解,可能是结果向全局最优发展。

0 0