矩阵分解(一):奇异值分解

数据挖掘李新春 发表了文章 • 2 个评论 • 75 次浏览 • 2017-04-29 12:40 • 来自相关话题

    由于涉及到大量数学公式,用Latex生成pdf文件,这里贴出pdf转换出来的png图片。附件里面有完整的pdf和代码文件。



















  pdf里面并没有贴出代码,这里贴出源文件的代码,代码很简单,只是简单地对svd进行了测试。下面是代码文件和输出结果:
  svd.py文件:
import numpy as np
import time
# 利用numpy包自带的svd实现,第二个参数表示是否打印出矩阵
def np_svd(matrix,printInfo=True):
    print('np_svd:')
    start = time.clock()
    u,sigma,v = np.linalg.svd(matrix)
    end = time.clock()
    print('shape:',matrix.shape,'=',u.shape,'*',sigma.shape,'*',v.shape)
    print('time:',end-start)
    if(printInfo):
        print(matrix)
        print(u)
        print(sigma)
        print(v)
if __name__ == "__main__":
    # 测试矩阵秩为行满秩或列满秩的情况
    a = np.array([[-1,3,4],
                  [2,-5,8],
                  [-3,-7,-2],
                  [2,4,-3]])
    np_svd(a)
    
    # 测试秩小于行数和列数的矩阵
    b = np.array([[-1,3,4],
                  [2,-5,8],
                  [-2,6,8],
                  [0,1,16]])
    np_svd(b)
    
    # 测试矩阵分解的时间
    for ex in range(1,4):
        m = 3 * 10 ** ex         # 3乘以10的ex次方
        n = 4 * 10 ** ex         # 4乘以10的ex次方
        matrix = np.random.normal(size=(m,n))  # 正态分布
        np_svd(matrix,False)
    测试结果:       
'''
# 满秩情况下的测试:输入矩阵为4*3
np_svd:
shape: (4, 3) = (4, 4) * (3,) * (3, 3)
time: 0.001563813577831752
[[-1  3  4]
 [ 2 -5  8]
 [-3 -7 -2]
 [ 2  4 -3]]
[[ 0.03492724  0.50564699 -0.74831887  0.42792532]
 [ 0.80692855  0.38784734  0.40536499  0.18471597]
 [ 0.37135366 -0.7637849  -0.22588836  0.47718292]
 [-0.45797693  0.10260697  0.47399636  0.74502107]]
[ 11.06047807   8.73915881   3.36049521]
[[-0.0407835  -0.75595687  0.65334977]
 [ 0.31657696  0.61042791  0.72605564]
 [ 0.94768968 -0.23644657 -0.21442314]]
# 不满秩的分解,可以看出sigma矩阵[  2.00999029e+01   8.71744817e+00   2.11044410e-16](由于是对角矩阵,采用向量存储),可以看出第三个奇异值已经趋于零了,可以说就是零
np_svd:
shape: (4, 3) = (4, 4) * (3,) * (3, 3)
time: 0.0001338945396582858
[[-1  3  4]
 [ 2 -5  8]
 [-2  6  8]
 [ 0  1 16]]
[[ 0.21486784  0.31094848  0.90774033 -0.18207238]
 [ 0.3668635  -0.71292939  0.03774797 -0.59642095]
 [ 0.42973567  0.62189696 -0.41612219 -0.50538476]
 [ 0.79659917 -0.09103243 -0.03774797  0.59642095]]
[  2.00999029e+01   8.71744817e+00   2.11044410e-16]
[[-0.01694596  0.10872188  0.99392776]
 [-0.34191212  0.93351191 -0.10794265]
 [-0.93957913 -0.34166514  0.02135407]]
# 测试30*40 300*400 3000*4000 30000*40000矩阵的分解时间(s),分别为0.0011336715375591666、 0.03374235704779949、37.49550263636945。可见3000*4000已经用了半分钟,当测试30000*40000时,计算机全卡了,结果等了大概五分钟没有出结果,所以直接强制关机。可见矩阵分解操作计算了特别大。
np_svd:
shape: (30, 40) = (30, 30) * (30,) * (40, 40)
time: 0.0011336715375591666
np_svd:
shape: (300, 400) = (300, 300) * (300,) * (400, 400)
time: 0.03374235704779949
np_svd:
shape: (3000, 4000) = (3000, 3000) * (3000,) * (4000, 4000)
time: 37.49550263636945
'''

  查看全部
    由于涉及到大量数学公式,用Latex生成pdf文件,这里贴出pdf转换出来的png图片。附件里面有完整的pdf和代码文件。
奇异值分解1.png


奇异值分解2.png


奇异值分解3.png


奇异值分解4.png

  pdf里面并没有贴出代码,这里贴出源文件的代码,代码很简单,只是简单地对svd进行了测试。下面是代码文件和输出结果:
  svd.py文件:
import numpy as np
import time
# 利用numpy包自带的svd实现,第二个参数表示是否打印出矩阵
def np_svd(matrix,printInfo=True):
    print('np_svd:')
    start = time.clock()
    u,sigma,v = np.linalg.svd(matrix)
    end = time.clock()
    print('shape:',matrix.shape,'=',u.shape,'*',sigma.shape,'*',v.shape)
    print('time:',end-start)
    if(printInfo):
        print(matrix)
        print(u)
        print(sigma)
        print(v)
if __name__ == "__main__":
    # 测试矩阵秩为行满秩或列满秩的情况
    a = np.array([[-1,3,4],
                  [2,-5,8],
                  [-3,-7,-2],
                  [2,4,-3]])
    np_svd(a)
    
    # 测试秩小于行数和列数的矩阵
    b = np.array([[-1,3,4],
                  [2,-5,8],
                  [-2,6,8],
                  [0,1,16]])
    np_svd(b)
    
    # 测试矩阵分解的时间
    for ex in range(1,4):
        m = 3 * 10 ** ex         # 3乘以10的ex次方
        n = 4 * 10 ** ex         # 4乘以10的ex次方
        matrix = np.random.normal(size=(m,n))  # 正态分布
        np_svd(matrix,False)
    测试结果:       
'''
# 满秩情况下的测试:输入矩阵为4*3
np_svd:
shape: (4, 3) = (4, 4) * (3,) * (3, 3)
time: 0.001563813577831752
[[-1  3  4]
 [ 2 -5  8]
 [-3 -7 -2]
 [ 2  4 -3]]
[[ 0.03492724  0.50564699 -0.74831887  0.42792532]
 [ 0.80692855  0.38784734  0.40536499  0.18471597]
 [ 0.37135366 -0.7637849  -0.22588836  0.47718292]
 [-0.45797693  0.10260697  0.47399636  0.74502107]]
[ 11.06047807   8.73915881   3.36049521]
[[-0.0407835  -0.75595687  0.65334977]
 [ 0.31657696  0.61042791  0.72605564]
 [ 0.94768968 -0.23644657 -0.21442314]]
# 不满秩的分解,可以看出sigma矩阵[  2.00999029e+01   8.71744817e+00   2.11044410e-16](由于是对角矩阵,采用向量存储),可以看出第三个奇异值已经趋于零了,可以说就是零
np_svd:
shape: (4, 3) = (4, 4) * (3,) * (3, 3)
time: 0.0001338945396582858
[[-1  3  4]
 [ 2 -5  8]
 [-2  6  8]
 [ 0  1 16]]
[[ 0.21486784  0.31094848  0.90774033 -0.18207238]
 [ 0.3668635  -0.71292939  0.03774797 -0.59642095]
 [ 0.42973567  0.62189696 -0.41612219 -0.50538476]
 [ 0.79659917 -0.09103243 -0.03774797  0.59642095]]
[  2.00999029e+01   8.71744817e+00   2.11044410e-16]
[[-0.01694596  0.10872188  0.99392776]
 [-0.34191212  0.93351191 -0.10794265]
 [-0.93957913 -0.34166514  0.02135407]]
# 测试30*40 300*400 3000*4000 30000*40000矩阵的分解时间(s),分别为0.0011336715375591666、 0.03374235704779949、37.49550263636945。可见3000*4000已经用了半分钟,当测试30000*40000时,计算机全卡了,结果等了大概五分钟没有出结果,所以直接强制关机。可见矩阵分解操作计算了特别大。
np_svd:
shape: (30, 40) = (30, 30) * (30,) * (40, 40)
time: 0.0011336715375591666
np_svd:
shape: (300, 400) = (300, 300) * (300,) * (400, 400)
time: 0.03374235704779949
np_svd:
shape: (3000, 4000) = (3000, 3000) * (3000,) * (4000, 4000)
time: 37.49550263636945
'''

 

开工之笔:机器学习小论

其他李新春 发表了文章 • 0 个评论 • 46 次浏览 • 2017-04-29 12:30 • 来自相关话题

    机器学习是一门综合性很高的课程,有幸能够参加周志华老师的《机器学习导论》课程,的确学到了很多有价值的知识。机器学习涉及到数学、算法、编程。
    从数学来说,信管的学生处于劣势,没有良好的数学功底就去看那些算法证明简直是一件很痛苦的事情,这件事在我大二期间看李航老师的《统计学习方法》颇有感触。所以大三一年有60%的时间致力于提升自己的数学功底,当然都是自学(这无疑也是一件很痛苦的事情),但是如果一件事情是很容易可以做到的,那么其价值何在呢?秉承这个理念,坚持看了很多数学书,先从复习《概率论》、《运筹学与最优化》做起,再到《矩阵论》、《复变函数》等,然后《优化方法》、《现代优化方法》、《数理统计》还没看完。周志华老师曾在课堂上提到过线性代数、优化理论、概率和统计是机器学习必须的课程,然后其余的可以看一下群论、解析几何等数学。所以数学之重要也就不言而喻了。
     同时,只关注于数学并不是一件很好的事情,专注于数学而疏于机器学习领域的知识,这是不可取的,因为数学是工具,机器学习里的算法才是经典。所以也在看一些机器学习的资料,比如还是在看《统计学习方法》、《机器学习》,除此之外还看了《模式识别》、《模式分类》等,还有最近再次重新学习229和231的公开课,对深度学习也要加强学习。当然这些相比花费在数学上的时间大概有一半左右,相信这个学期可以把数学知识大概掌握,接下来就可以专注地学习机器学习的知识了,个人比较倾向于去学习图像、语音等比较复杂的相关知识。
    算法实现主要是python编程,因为现在有很多开源库可以直接调用,所以并没有花费很多时间在这上面,大概就只是学习了一下《机器学习实战》并敲了部分代码。还有就是稍微花费了一点时间做了几个项目。还有令我最困惑的是深度学习现在有很多开源库caffe、tensorflow、torch、theano、keras等,还有很多现成的模型可以直接调用。这就导致了大家做应用时只要“傻瓜”似得搭建个模型,然后调参跑数据。这大概就是各大IT企业之所以要分配调参任务了吧?周老师也曾说过,大概花十天的时间就可以基本上搞懂各种深度学习开源库,如果不论项目经验的话,大概就可以和各大IT企业的深度学习工程师差不多了。虽然有点夸张,但是这的确反映了一个问题,现在开源库都把大概的框架搭建好了,所以真正了解其内部运作原理并能够在新的问题上 加以完善以适应新问题的又有几人呢?个人认为就是谷歌、微软,当然还有开源库的开发者。这就导致了在各种比赛中很多队伍只是简单地调整一下深度学习的网络结构,然而并没有加入新的元素或新的思想,这样的话大家都会使用开源库,那么队伍之间的差别是什么呢?上述对深度学习开源库的评论只是个人看法,可能自己没有真正参加过大型项目或比赛,并没有真正了解到开源库的价值所在,可能会有评论不当之处。
    学习的过程也是遗忘的过程,特别是当同时学习很多东西的时候,很容易学了这一章的东西之后并不清楚究竟讲了什么。所以学习还需总结,一方面,笔记是总结的一种方式,以前从不做笔记的我现在认识到了笔记的重要性,这个学期才开始应该不算晚。另一种方式就是写博客,然而博客的一种不便之处就是大量的数学公式,幸好学习了Latex的使用,可以很方便的编辑公式,然而如何将内容呈现到博客上来又是一个问题。所以就只是将pdf转换成图片来呈现了,附件会附有pdf源文件。
    即便用Latex也是一件很困难的事情,有的定理证明甚至需要几页的数学推导,所以这些知识的总结就放在笔记上了。博客用来总结一些比较简单但常用的知识吧,如果能将相关的知识尽量总结进一篇博客,那么是最好不过了。 查看全部
    机器学习是一门综合性很高的课程,有幸能够参加周志华老师的《机器学习导论》课程,的确学到了很多有价值的知识。机器学习涉及到数学、算法、编程。
    从数学来说,信管的学生处于劣势,没有良好的数学功底就去看那些算法证明简直是一件很痛苦的事情,这件事在我大二期间看李航老师的《统计学习方法》颇有感触。所以大三一年有60%的时间致力于提升自己的数学功底,当然都是自学(这无疑也是一件很痛苦的事情),但是如果一件事情是很容易可以做到的,那么其价值何在呢?秉承这个理念,坚持看了很多数学书,先从复习《概率论》、《运筹学与最优化》做起,再到《矩阵论》、《复变函数》等,然后《优化方法》、《现代优化方法》、《数理统计》还没看完。周志华老师曾在课堂上提到过线性代数、优化理论、概率和统计是机器学习必须的课程,然后其余的可以看一下群论、解析几何等数学。所以数学之重要也就不言而喻了。
     同时,只关注于数学并不是一件很好的事情,专注于数学而疏于机器学习领域的知识,这是不可取的,因为数学是工具,机器学习里的算法才是经典。所以也在看一些机器学习的资料,比如还是在看《统计学习方法》、《机器学习》,除此之外还看了《模式识别》、《模式分类》等,还有最近再次重新学习229和231的公开课,对深度学习也要加强学习。当然这些相比花费在数学上的时间大概有一半左右,相信这个学期可以把数学知识大概掌握,接下来就可以专注地学习机器学习的知识了,个人比较倾向于去学习图像、语音等比较复杂的相关知识。
    算法实现主要是python编程,因为现在有很多开源库可以直接调用,所以并没有花费很多时间在这上面,大概就只是学习了一下《机器学习实战》并敲了部分代码。还有就是稍微花费了一点时间做了几个项目。还有令我最困惑的是深度学习现在有很多开源库caffe、tensorflow、torch、theano、keras等,还有很多现成的模型可以直接调用。这就导致了大家做应用时只要“傻瓜”似得搭建个模型,然后调参跑数据。这大概就是各大IT企业之所以要分配调参任务了吧?周老师也曾说过,大概花十天的时间就可以基本上搞懂各种深度学习开源库,如果不论项目经验的话,大概就可以和各大IT企业的深度学习工程师差不多了。虽然有点夸张,但是这的确反映了一个问题,现在开源库都把大概的框架搭建好了,所以真正了解其内部运作原理并能够在新的问题上 加以完善以适应新问题的又有几人呢?个人认为就是谷歌、微软,当然还有开源库的开发者。这就导致了在各种比赛中很多队伍只是简单地调整一下深度学习的网络结构,然而并没有加入新的元素或新的思想,这样的话大家都会使用开源库,那么队伍之间的差别是什么呢?上述对深度学习开源库的评论只是个人看法,可能自己没有真正参加过大型项目或比赛,并没有真正了解到开源库的价值所在,可能会有评论不当之处。
    学习的过程也是遗忘的过程,特别是当同时学习很多东西的时候,很容易学了这一章的东西之后并不清楚究竟讲了什么。所以学习还需总结,一方面,笔记是总结的一种方式,以前从不做笔记的我现在认识到了笔记的重要性,这个学期才开始应该不算晚。另一种方式就是写博客,然而博客的一种不便之处就是大量的数学公式,幸好学习了Latex的使用,可以很方便的编辑公式,然而如何将内容呈现到博客上来又是一个问题。所以就只是将pdf转换成图片来呈现了,附件会附有pdf源文件。
    即便用Latex也是一件很困难的事情,有的定理证明甚至需要几页的数学推导,所以这些知识的总结就放在笔记上了。博客用来总结一些比较简单但常用的知识吧,如果能将相关的知识尽量总结进一篇博客,那么是最好不过了。

[转载]降维方法t-SNE

数据挖掘王开新 发表了文章 • 0 个评论 • 59 次浏览 • 2017-04-16 20:43 • 来自相关话题

http://lvdmaaten.github.io/tsne/
 
第一眼就被MNIST上的效果震撼住了 查看全部
http://lvdmaaten.github.io/tsne/
 
第一眼就被MNIST上的效果震撼住了

[转载]词向量和语言模型

数据挖掘王开新 发表了文章 • 1 个评论 • 15 次浏览 • 2017-04-16 19:42 • 来自相关话题

好文转载
http://licstar.net/archives/328

[转载]推荐系统算法小结

数据挖掘王开新 发表了文章 • 0 个评论 • 16 次浏览 • 2017-04-15 16:58 • 来自相关话题

好文转载
http://bdsc.lab.uic.edu/docs/survey-critique-deep.pdf
 

[转载]CS231n卷积神经网络Lecture notes

数据挖掘王开新 发表了文章 • 0 个评论 • 42 次浏览 • 2017-04-10 11:20 • 来自相关话题

http://cs231n.github.io/convolutional-networks/
写的很详细,适合先看过一遍视频后再去复习一遍(视频在网易云课堂上有)
同时上传了份PDF版的
http://cs231n.github.io/convolutional-networks/
写的很详细,适合先看过一遍视频后再去复习一遍(视频在网易云课堂上有)
同时上传了份PDF版的

第三篇--加法模型与提升方法boost

数据挖掘韩韬 发表了文章 • 3 个评论 • 92 次浏览 • 2017-03-24 23:43 • 来自相关话题

    开始记录算法,和前两篇相比是不是有点太突然?(本文断断续续写了一天,今天上三节课都迟到了……老油条的感慨)
    了解一个领域最重要的就是知道它的思维方式以及它在做什么事情。通过一些积累和总结,我们知道了机器学习就是认为:在掌握的数据和我们的任务之间存在某一个模式,我们要利用机器,学习出这个模式。
     我们仔细审视这句话。问题一:这些数据可以表达出这样的模式吗?问题二:机器怎怎么学习?问题三:怎样判断学出的这个模式的好坏?
     这几个问题会引申出很多讨论。问题一的回答引向数据清洗、特征工程,这决定了学习机器表现的上限;问题二的回答引出算法与优化,重要性不言而喻;问题三的回答引出性能评价方法,通常从具体任务的特性中抽象出来。

     上面的话基本……额……不是今天主要的内容。
     今天想讨论问题二——算法与优化,内容并不符合正常的学习顺序





一、加法模型
(注意:不同于统计学时间序列处理的加法模型)
基本逻辑:
      生活中有很多复杂的事情,单项较弱的个人能力,解决起来总是会有盲点,因此我们就想找人商量商量,组合成强的能力——“三个臭皮匠顶个诸葛亮”嘛(一只小企鹅不行,四个小企鹅就很(。・∀・)ノ゙嗨了)。这是下面我们开展工作的自然的逻辑。数学抽象为:





(M个人每个人的重要性是β(m),γ(m)是这个人的特点,x是这个问题,此人的建议就是b(x;γ(m)))
好的,以上就是加法模型, 的确就是这么简单。下面变换个说法,用基学习器代替人,用学习器权重代替重要性,每个人的特点就是学习器的参数,x就是训练数据集。
       有时候做分类任务时,弱分类器好做,强分类器难做,就适用加法模型了。但是弱分类器不能太差(比如精度小于50%),那说明和随机猜测没什么分别,不能饥不择食。
       不过实质上,还有更多的事情需要处理。显然的两个问题:第一、找什么样人讨论?(基学习器怎么生成)第二、每个人重要性怎么定(权重怎么确定)?这就是我们需要做的真正复杂的工作。
      思考:如果学习器都有同样的优缺点,那就造成冗余,而且没有提高的可能。所以最好是什么情况:各有所长,互缺点互补。(就算是十个臭皮匠,组合之后最多也是开一个臭·皮匠の店)
       好,那我们就利用数学和算法实现这个想法。
       首先,我们量化一下所谓的缺点,它的表示形式应当是训练中预测值与真实值的差距,也就是损失函数  L( y,f(x) ) (loss between real y and prediction f(x)).我们要把它降到最小,也就是:




       这个东西怎么求最小?有求和的公式,很复杂。利用算法思想——前向分步算法。前向就是沿着计算方向向前进行,不断加入新的学习器,分步就是一步一步优化总学习器。我们只需要在第m步(m>=1)求解参数β和γ,这就方便使得新加进学习器之后模型损失最小:




(一步步积累模型,在已有的f(m-1)基础上优化 f(m-1)+βb(x;γ). 显然这是一个greedy strategy)
以下算法描述来自《统计学习方法》




损失函数如何求最小值,这就需要数学解答了。通常没有约束容易求导,会使用梯度下降;有约束条件,常用拉格朗日橙子(杠掉)乘子,转化为对偶问题(dual problem)。




二、提升方法(boost)
当你理解加法模型后,你就知道,加法模型本身就是一种提升方法。
事实上,著名的Adaboost本身就是加法模型的特例。不过Adaboost我更感觉像是从一个学习器出发,根据他的弱点构造互补型学习器,最后将其进行加权线性组合。如何根据他的弱点构造呢?就是将前任做错的事情强迫他更“认真地”去做(加大分类错误样本惩罚权重)。具体的过程很有意思,可以看一看。
提升方法中对于树模型的提升研究较多。对于错误(损失函数)和"有错就改"这个思想的表达的不同分为很多boost算法。如下图所示:




需要说明的是,提升方法太多了,后面可能会讲的模型融合方法bagging、stacking、boosting……这是一个很广泛的理念。
 
不过这里实在是写不下了,我就不写了(费马脸.jpg)
其实整个学习过程就是一个自我教育的过程,机器学习应当归属教育学。
微信阅读不是很深刻,所以留条活路,写得轻松一点。
转载请 联系 注明(字字看来皆是困,一天辛苦不寻常)
不是很烦,可以关注





  查看全部
    开始记录算法,和前两篇相比是不是有点太突然?(本文断断续续写了一天,今天上三节课都迟到了……老油条的感慨)
    了解一个领域最重要的就是知道它的思维方式以及它在做什么事情。通过一些积累和总结,我们知道了机器学习就是认为:在掌握的数据和我们的任务之间存在某一个模式,我们要利用机器,学习出这个模式。
     我们仔细审视这句话。问题一:这些数据可以表达出这样的模式吗?问题二:机器怎怎么学习?问题三:怎样判断学出的这个模式的好坏?
     这几个问题会引申出很多讨论。问题一的回答引向数据清洗、特征工程,这决定了学习机器表现的上限;问题二的回答引出算法与优化,重要性不言而喻;问题三的回答引出性能评价方法,通常从具体任务的特性中抽象出来。

     上面的话基本……额……不是今天主要的内容。
     今天想讨论问题二——算法与优化,内容并不符合正常的学习顺序

0.png

一、加法模型
(注意:不同于统计学时间序列处理的加法模型)
基本逻辑:
      生活中有很多复杂的事情,单项较弱的个人能力,解决起来总是会有盲点,因此我们就想找人商量商量,组合成强的能力——“三个臭皮匠顶个诸葛亮”嘛(一只小企鹅不行,四个小企鹅就很(。・∀・)ノ゙嗨了)。这是下面我们开展工作的自然的逻辑。数学抽象为:

1.png

(M个人每个人的重要性是β(m),γ(m)是这个人的特点,x是这个问题,此人的建议就是b(x;γ(m)))
好的,以上就是加法模型, 的确就是这么简单。下面变换个说法,用基学习器代替人,用学习器权重代替重要性,每个人的特点就是学习器的参数,x就是训练数据集。
       有时候做分类任务时,弱分类器好做,强分类器难做,就适用加法模型了。但是弱分类器不能太差(比如精度小于50%),那说明和随机猜测没什么分别,不能饥不择食。
       不过实质上,还有更多的事情需要处理。显然的两个问题:第一、找什么样人讨论?(基学习器怎么生成)第二、每个人重要性怎么定(权重怎么确定)?这就是我们需要做的真正复杂的工作。
      思考:如果学习器都有同样的优缺点,那就造成冗余,而且没有提高的可能。所以最好是什么情况:各有所长,互缺点互补。(就算是十个臭皮匠,组合之后最多也是开一个臭·皮匠の店)
       好,那我们就利用数学和算法实现这个想法。
       首先,我们量化一下所谓的缺点,它的表示形式应当是训练中预测值与真实值的差距,也就是损失函数  L( y,f(x) ) (loss between real y and prediction f(x)).我们要把它降到最小,也就是:
3.jpg

       这个东西怎么求最小?有求和的公式,很复杂。利用算法思想——前向分步算法。前向就是沿着计算方向向前进行,不断加入新的学习器,分步就是一步一步优化总学习器。我们只需要在第m步(m>=1)求解参数β和γ,这就方便使得新加进学习器之后模型损失最小:
4.2_.png

(一步步积累模型,在已有的f(m-1)基础上优化 f(m-1)+βb(x;γ). 显然这是一个greedy strategy)
以下算法描述来自《统计学习方法》
5.jpg

损失函数如何求最小值,这就需要数学解答了。通常没有约束容易求导,会使用梯度下降;有约束条件,常用拉格朗日橙子(杠掉)乘子,转化为对偶问题(dual problem)。
6.jpg

二、提升方法(boost)
当你理解加法模型后,你就知道,加法模型本身就是一种提升方法。
事实上,著名的Adaboost本身就是加法模型的特例。不过Adaboost我更感觉像是从一个学习器出发,根据他的弱点构造互补型学习器,最后将其进行加权线性组合。如何根据他的弱点构造呢?就是将前任做错的事情强迫他更“认真地”去做(加大分类错误样本惩罚权重)。具体的过程很有意思,可以看一看。
提升方法中对于树模型的提升研究较多。对于错误(损失函数)和"有错就改"这个思想的表达的不同分为很多boost算法。如下图所示:
7.jpg

需要说明的是,提升方法太多了,后面可能会讲的模型融合方法bagging、stacking、boosting……这是一个很广泛的理念。
 
不过这里实在是写不下了,我就不写了(费马脸.jpg)
其实整个学习过程就是一个自我教育的过程,机器学习应当归属教育学。
微信阅读不是很深刻,所以留条活路,写得轻松一点。
转载请 联系 注明(字字看来皆是困,一天辛苦不寻常)
不是很烦,可以关注

8.png

 

各家笔试经历

求职经验王开新 发表了文章 • 0 个评论 • 73 次浏览 • 2017-03-21 20:08 • 来自相关话题

美团点评-机器学习
没好好复习,应该是挂了。
-----------------------------------------------------
美团笔试除了智力题和性格题外,专门的技术题有一个小时的时间:16道单选,10道多选,一道简答,一道编程
(1)单选:稳定的排序算法,快排,图遍历,优化方法,基础的分类聚类算法(好多),出栈顺序判断,一些算法OJ中的题(总共只刷过3道leetcode,竟然都能碰上一道)
(2)多选:出栈可能顺序判断,机器学习基础算法(好多)
(3)简答:给定决策树的一些参数,求决策树学习的时间复杂度
(4)编程:有向图用邻接表存储,编程判断图中是否含有环
 
笔试题很重基础,还是要多刷题
 
今日头条-机器学习算法
​2个小时,四道普通编程题,难度和课后作业差不多,只支持Python2.7(用python3的我表示调试得好难受)
可惜只AC了一道,其它都只AC了30%样例,搞不清楚为啥
输入输出比牛客网友好多了,然而是Python2的raw_input,不能本地调试 T T
 
微软预科生
两个半小时,四道编程题,题比较难,需要刷题基础,想了一道,看了一下剩下的几道,放弃
 
京东算法与数据分析岗
总共两个小时,30道选择(有单选和多选),2道编程,时间可以自由分配
选择题与机器学习有关的题非常简单,其它与linux,网络,操作系统有关的题一脸懵逼
编程题难度不均,第一题10分钟就做完AC了,第二题写了一个半小时还是只能写出O(n2)的算法,果然超时,而且只AC了70%
PS:看了下题解,发现第一道编程题简单只是运气好
Update:4.10笔试通过
 
携程机器学习岗
两个小时,终于终于没有编程题了!前30个选择题是智力数学题,20个选择题考机器学习的知识。两道简答题:一道与编码和信息熵有关,比较简单;另一道是手推逻辑回归梯度下降公式(跪。。。真的想不起来了,总是卡在求导)。一道附加题,考正负样本不平衡怎么处理。
PS:估计是挂了 查看全部
美团点评-机器学习
没好好复习,应该是挂了。
-----------------------------------------------------
美团笔试除了智力题和性格题外,专门的技术题有一个小时的时间:16道单选,10道多选,一道简答,一道编程
(1)单选:稳定的排序算法,快排,图遍历,优化方法,基础的分类聚类算法(好多),出栈顺序判断,一些算法OJ中的题(总共只刷过3道leetcode,竟然都能碰上一道)
(2)多选:出栈可能顺序判断,机器学习基础算法(好多)
(3)简答:给定决策树的一些参数,求决策树学习的时间复杂度
(4)编程:有向图用邻接表存储,编程判断图中是否含有环
 
笔试题很重基础,还是要多刷题
 
今日头条-机器学习算法
​2个小时,四道普通编程题,难度和课后作业差不多,只支持Python2.7(用python3的我表示调试得好难受)
可惜只AC了一道,其它都只AC了30%样例,搞不清楚为啥
输入输出比牛客网友好多了,然而是Python2的raw_input,不能本地调试 T T
 
微软预科生
两个半小时,四道编程题,题比较难,需要刷题基础,想了一道,看了一下剩下的几道,放弃
 
京东算法与数据分析岗
总共两个小时,30道选择(有单选和多选),2道编程,时间可以自由分配
选择题与机器学习有关的题非常简单,其它与linux,网络,操作系统有关的题一脸懵逼
编程题难度不均,第一题10分钟就做完AC了,第二题写了一个半小时还是只能写出O(n2)的算法,果然超时,而且只AC了70%
PS:看了下题解,发现第一道编程题简单只是运气好
Update:4.10笔试通过
 
携程机器学习岗
两个小时,终于终于没有编程题了!前30个选择题是智力数学题,20个选择题考机器学习的知识。两道简答题:一道与编码和信息熵有关,比较简单;另一道是手推逻辑回归梯度下降公式(跪。。。真的想不起来了,总是卡在求导)。一道附加题,考正负样本不平衡怎么处理。
PS:估计是挂了

各家面经

求职经验王开新 发表了文章 • 1 个评论 • 94 次浏览 • 2017-03-09 15:51 • 来自相关话题

滴滴-数据分析(直招)
前几天投了个滴滴的数据分析岗实习,没想到第二天就打电话来约面试,今天去面试了下,发现岗位不太合适,于是拒了。把经历分享一下(其实就是想发个笔试题)
 
滴滴的数据分析岗非常偏运营,说是数据分析,其实就是从数据中看出问题,想办法激励司机及招聘新司机(因为目前遇到的问题主要是司机供不应求)。用到的主要工具是EXCEL,偶尔会用一些SQL,信管的同学应该都没问题。这个实习不是走网申通道的,好像是部门直接招,面试官就是将来的leader。现场给了一套题让做做,内容和平时工作场景差不多,想了解的可以看看。(发现好多东西都能用Python一句解决啊,为什么要用EXCEL呢,于是就拒了。)
 
凑不出来字数了,今天天气不错,就当春游了。
 
酷家乐-机器学习(内推)
一面打来电话的并不是搞机器学习的,只问了一些基础的算法知识(就是需要刷题的那种),答得不好,一面被拒。
 
边锋-AI项目实习生(直招)
和浙大合作的一个项目,找人进去写python,打了两次电话问了下基本情况,后来又当面面试了下,问了python基础知识。可能是觉得我代码量不够,被刷。
 
京东-算法工程师
过了笔试,却没想到一面竟然是问基础算法,电面,30分钟。第一部分远程写代码,15分钟,快写完了发现不能覆盖所有样例;第二部分问知道哪些排序算法,让讲一下计数排序,又问了什么是稳定排序,于是————第N次跪在了稳定排序上。搞不懂为什么要问这个。最后我问他为什么没有机器学习方向的问题,他说二面会问。但。。。估计是没有二面了。
 
蘑菇街-算法工程师
内推直接面试,因为在杭州,所以就去公司现场面。手写了一个简单的str2int,问了很多机器学习方面的知识,随机森林,adaBoost,Xgboost,逻辑回归等等都问到了,答得还行,一面就挂还是有点意外。它们公司用Scala比较多,会Scala可能会有加分吧。
 
---------------------------------------------------------------------------
 
春招差不多结束了,0 offer。归根到底还是水平不足,最大的教训就是:那些所谓“面试/笔试”常考问题是真的会被问出来的,不能觉得那些没意思而不去准备。
 
继续刷PRML/LeetCode​ 查看全部
滴滴-数据分析(直招)
前几天投了个滴滴的数据分析岗实习,没想到第二天就打电话来约面试,今天去面试了下,发现岗位不太合适,于是拒了。把经历分享一下(其实就是想发个笔试题)
 
滴滴的数据分析岗非常偏运营,说是数据分析,其实就是从数据中看出问题,想办法激励司机及招聘新司机(因为目前遇到的问题主要是司机供不应求)。用到的主要工具是EXCEL,偶尔会用一些SQL,信管的同学应该都没问题。这个实习不是走网申通道的,好像是部门直接招,面试官就是将来的leader。现场给了一套题让做做,内容和平时工作场景差不多,想了解的可以看看。(发现好多东西都能用Python一句解决啊,为什么要用EXCEL呢,于是就拒了。)
 
凑不出来字数了,今天天气不错,就当春游了。
 
酷家乐-机器学习(内推)
一面打来电话的并不是搞机器学习的,只问了一些基础的算法知识(就是需要刷题的那种),答得不好,一面被拒。
 
边锋-AI项目实习生(直招)
和浙大合作的一个项目,找人进去写python,打了两次电话问了下基本情况,后来又当面面试了下,问了python基础知识。可能是觉得我代码量不够,被刷。
 
京东-算法工程师
过了笔试,却没想到一面竟然是问基础算法,电面,30分钟。第一部分远程写代码,15分钟,快写完了发现不能覆盖所有样例;第二部分问知道哪些排序算法,让讲一下计数排序,又问了什么是稳定排序,于是————第N次跪在了稳定排序上。搞不懂为什么要问这个。最后我问他为什么没有机器学习方向的问题,他说二面会问。但。。。估计是没有二面了。
 
蘑菇街-算法工程师
内推直接面试,因为在杭州,所以就去公司现场面。手写了一个简单的str2int,问了很多机器学习方面的知识,随机森林,adaBoost,Xgboost,逻辑回归等等都问到了,答得还行,一面就挂还是有点意外。它们公司用Scala比较多,会Scala可能会有加分吧。
 
---------------------------------------------------------------------------
 
春招差不多结束了,0 offer。归根到底还是水平不足,最大的教训就是:那些所谓“面试/笔试”常考问题是真的会被问出来的,不能觉得那些没意思而不去准备。
 
继续刷PRML/LeetCode​

【公告】ImTech 平台网址变更通知

其他刘伙玉 发表了文章 • 0 个评论 • 26 次浏览 • 2017-02-27 17:05 • 来自相关话题

本着节约至上的精神,自2月27日起,该平台迁移至我院服务器上,网址变更为:http://im.nju.edu.cn/imtech。
同时,域名www.imtechcenter.com 也即将停止使用,如果要发表文章或者评论,请使用新网址,以免数据丢失。
麻烦大家重新保存书签,给大家带来不便,还请见谅!
  查看全部
本着节约至上的精神,自2月27日起,该平台迁移至我院服务器上,网址变更为:http://im.nju.edu.cn/imtech
同时,域名www.imtechcenter.com 也即将停止使用,如果要发表文章或者评论,请使用新网址,以免数据丢失。
麻烦大家重新保存书签,给大家带来不便,还请见谅!