精华内容
下载资源
问答
  • 英语总结系列(四):换一心情充满趣味二月

    万次阅读 多人点赞 2016-02-28 11:42:20
    俗话说计算机CPU和人大脑极其相似,大家平常使用计算机都有一个体会,他能实时响应自己操作,但是当东西多就卡死;同样人大脑一样,既不能长时间只干一件事也不能干好多事。所以自己在这个月英语、项目和...

     

    【前言】

        伴随着ITOO4.1的后期以及5.0的开启,整体的气氛还是延续上个月,大家伙儿都积极的融入到做项目的大队中。当然自己也在其中;俗话说计算机的CPU和人的大脑极其相似,大家平常使用计算机都有一个体会,他能实时响应自己的操作,但是当东西开的多就卡死;同样人大脑一样,既不能长时间只干一件事也不能干好多事。所以自己在这个月英语、项目和计算机进度轮流来。

    【不一样的二月】

        在月初的时候就回顾上个月自己的不足,以便在这个月进行提高。在这个月做了如下改进:

        上个月情况—做项目等其他事情占用时间多,而英语学习时间少;

        本月调整—固定保障每天早上8点—9点固定时间学,零碎时间【来回机房的路上】;提高学习效率,每次学习英语都先放空心态,暗示自己心里啥都不想,自然儿然就入神到英语中了;也随着听小乌龟听的边数多了,有感觉,所以每天早上来心里都有种莫名的小激动想去听它,从而达到良性循环。

        本月学习资料《小乌龟》,记得从刚开始接触到它时的陌生,到现在的熟悉和喜欢这是个过程。就如同新旧美似的,多听用心听是学习英语的不二法门。

            

    【总结】

               经过对一月份的总结站在一月份的基础上再去学习,会提高很多;同时随着自己对计算机的深入许多道理也明白,而这些道理是放之四海而皆准;比如在ITOO4.1时研究的多线程,悟出提高效率要适可而止,根据不同的情况去应用,应用到了本月的学习英语中。同时在做这些研究的时候免不了需要去看英语资料,从而也激励自己。

    展开全文
  • 本文提出一无监督学习方法,用于深度半非负矩阵分解,因为半监督非负矩阵分解和k均值聚类很相似,。 本文创新点:1、借助于深度学习思想,提出贪婪半非负矩阵分解方法,其思想与栈式自编码网络一样训练...

    基于深度矩阵分解的属性表征学习

    原文地址:http://blog.csdn.net/hjimce/article/details/50876956

    作者:hjimce

    一、相关概念

    本篇博文主要讲解文献《A deep matrix factorization method for learning attribute representations》。这篇主要借助于深度学习的思想,提出贪婪的半非负矩阵分解SNMF方法,其思想与栈式自编码网络一样的训练方法,首先通过逐层分解作为预分解结果,然后再整体微调训练。因为这篇文献我看到后面,感觉计算量非常大,不是很喜欢这文献,所以我也没有全部细看。

    虽然文献一开始讲的是深度半非负矩阵分解,属于线性分解。不过作者对目标优化函数进行了多次进化,同时还结合了半监督约束项,因此到了最后算法基本上就跟神经网络非常类似了(也包含了非线性激活函数映射)。

    开始讲解paper前,先学一些基础概念:

    (1)矩阵分解简单概述

    在机器学习领域,矩阵分解家族是经常遇到的一类算法,如:PCAK-meansNMFSNMF、谱聚类、稀疏编码、SVD、白化、ICA等,它们的目标基本上都是对X矩阵进行分解:

    X=Z*H

    然后不同的算法,采用不同的约束条件(对Z、H进行约束),具体请参考文献《The Advanced Matrix Factorization》。在机器学习中,特征这个词具体是什么东西?如果从矩阵分解的角度来讲的话:

    X=Z*H

    X是训练样本。矩阵Z根据不同的应用场景,又可以称之为:权值矩阵、基矩阵(如PCA)、字典(如稀疏编码、k-means)、变换矩阵。

    矩阵H也称之为:特征矩阵、投影坐标、系数矩阵、编码矩阵(如稀疏编码、k-means)。矩阵分解家族基本上都是无监督学习算法,而所谓的无监督表征学习,说的简单一点就是求解H矩阵。

    (2)非负矩阵分解NMF定义

    非负矩阵分解定义:给定样本矩阵X=[x1,x2……xn],其中该矩阵的每一列表示一个样本,矩阵的所有元素都是非负的(比如x的每一列是一张图片样本,x中的元素都是非负的),非负矩阵分解的目标就是要对X进行分解,公式如下:

     

    并且分解后的矩阵Z、H都是非负矩阵(矩阵元素都是非负的),其中Z称之为基矩阵,H称之为系数矩阵。

    (2)半非负矩阵分解SNMF定义

    为了扩展非负矩阵的应用场景,有时候我们的样本矩阵X并不是非负矩阵,于是就有了半非负矩阵:

     

    半非负矩阵只是要求H为非负矩阵,对于数据矩阵X和基矩阵Z并没有要求。这个思想和聚类量化一样,Z的每一列表示聚类中心并不需要做非负约束,H表示特征矩阵,这使得我们可以从原始数据中学习到低维的特征。

    二、基础回顾

    这一部分先简单复习一下单层的半非负矩阵分解算法。

    1、与k-means的关系

    半监督非负矩阵分解和k均值聚类很相似。半非负矩阵分解中,我们允许数据矩阵X和因子矩阵Z中的元素可正可负,同时约束H矩阵为非负矩阵:

     

    从聚类的角度来讲,Z=[z1,z2……zn]的每一列就是我们的聚类中心,H的每一列就是我们的编码矢量。如果对半非负矩阵分解,加入约束条件H是行正交矩阵,即H*H^T=I,同时H的每一列只有一个正数,其它的都为0:

     

    半非负矩阵与k均值聚类的区别在于:半非负矩阵分解并没有要求H矩阵的行向量是相互正交的,我们也可以把它看成是软聚类,k-means可以看成是SNMF的特例。

    2、半非负矩阵求解算法

    目标函数:

     

    我们的目标是求解Z、H,可以采用固定其中的一个,然后更新另外一个变量:

    (1)首先固定H矩阵,那么我们就可以求解Z:

     

    其中H+表示H矩阵的伪逆矩阵。

    (2)更新H矩阵:


    因为我们要求H矩阵是非负矩阵,因此我们就需要采用上面的矩阵进行更新,其中Apos矩阵表示:

     

    Apos表示把矩阵所有负值元素全部置0,剩下的非负矩阵。反之,Aneg就表示负矩阵,也就是矩阵中正的元素全部置0

    具体matlab源码实现如下:

        Z = X * pinv(H);%更新Z矩阵
    
        A = Z' * X;%求Z的转置乘以X
        Ap = (abs(A)+A)./2;
        An = (abs(A)-A)./2;
        
        B = Z' * Z;%Z^T*Z
        Bp = (abs(B)+B)./2;
        Bn = (abs(B)-B)./2;
        
        H = H .* sqrt((Ap + Bn * H) ./ max(An + Bp * H, eps));%更新H矩阵总公式

    三、算法概述

    虽然一开始文献讲解的是深度半非负矩阵的分解,不过到了最后算法经过了好几个阶段的进化,结合了非线性激活函数、半监督学习约束,所有到了最后公式基本已经跟最初的半非负矩阵分解区别很大了。文献算法的讲解从多层线性分解-》非线性分解-》半监督非线性分解,进行算法的进化,下面先简单讲解文献的总体思路。

    1、第一次进化:深度线性分解

    文献首先先提出了深度半非负矩阵分解公式:


    这部分需要我们学习的主要是:逐层贪婪分解、整体损失微调。

    2、第二次进化:深度非线性分解

    因为线性分解不能表达复杂的特征,所以在步骤1的基础上,引入了非线性激活函数:

     

     

    g表示非线性激活函数,这样就跟神经网络非常相似了。

    3、第三次进化:弱监督非线性分解

    在步骤2的基础上,加入了约束项,结合先验知识在里面,使得每一层分解的特征矩阵H符合我们所需要的属性(如果没有监督,那么是自动分解X):


    也就是引入了约束项Tr(H^T*L*H)。

    四、第一次进化——深度线性分解

    1、相关描述

    OK,终于到了关键部分了。对于SNMF我们的目标是求解一个低维H+矩阵,用于表征原始的数据X。在大部分情况下,我们所要分析的数据X属性是未知的,其包含着多种属性,比如paper所要处理的人脸图片是各种角度、光照、表情、以及不同的人。因此我们采用多层分解,相比于单层的SNMF来说,更能表达出人脸的多种属性。下面是单层分解与多层分解示意图:


    文献提出了深度半非负矩阵分解模型,给定数据X我们把它分解层M+1个因子:


    这个也可以写成:

     

    通过每一层的分解,每一层提取到的特征Hi,然后我们可以对每一层H实现相应的任务。比如文献示意图如下,其对每一层的H做了k-means聚类,可以聚类出不同的属性。

     

    这个具体可以看一下最上面聚类结果。

    2、算法实现

    采用类似于栈式自编码网络一样的训练方法,分成逐层预训练、整体微调两个阶段。

    (1)预训练阶段

    A、把X=Z1*H1,完成第一层分解;

    B、对H1继续分解H1=Z2*H2,完成第二层分解;

    如此循环下去,把所有的层都进行了预训练。

    (2)整体微调。通过最小化损失函数:

     

    这一步通过求解偏导数,然后继续进行梯度下降,具体公式推导看文献。最后的伪代码实现为:


    主要分为逐层预分解和整体微调两个阶段。

    后面文献还了引入非线性、半监督,因为我感觉计算量越来越大,学到的东西不是很多,所以就没有具体细看后面各种公式的推导。最后文献算法的伪代码为:


    个人总结:这篇文献主要是把深度学习的方法,引入矩阵分解中,实现深度无监督表征学习,思想值得我们学习;然而这篇文献的整个过程,感觉完全不考虑计算量,对于学术研究是不错的文献,但是对于工程应用那就……

    参考文献:

    1、《A deep matrix factorization method for learning attribute representations》

    **********************作者:hjimce   时间:2016.3.13  联系QQ:1393852684   原创文章,转载请保留原文地址、作者等信息***************

    展开全文
  • 所以我打算利用今后的闲暇时间写一些这方面的东西,既可以同 大家交流,也是作为自己这七年工作的总结。 还是在上大学的时候,有一次老师让编写一段软件,用来模拟一个控制系统:给它一个激励信号,然 后显示出它...
  • Web上数据的增长使得在完整的数据集上使用许多机器...CF是一推荐系统技术,能够帮助人们发现感兴趣的东西。在Facebook,这些东西包括页面、兴趣组、事件、游戏等等。CF的核心思想是,最好的推荐来自品味相似的人...

    Web上数据的增长使得在完整的数据集上使用许多机器学习算法变得更加困难。特别是对于个性化推荐问题,数据采样通常不是一种选择,需要对分布式算法设计进行创新,以便我们能够扩展到这些不断增长的数据集。

    协同过滤(CF)是其中一个重要的应用领域。CF是一种推荐系统技术,能够帮助人们发现感兴趣的东西。在Facebook,这些东西包括页面、兴趣组、事件、游戏等等。CF的核心思想是,最好的推荐来自品味相似的人换句话说,它通过使用相似的人对历史物品的评分来预测某人会如何评价一件物品。

    1. CF and Facebook scale

    一般情况下,Facebook CF的数据集有1000亿的评分,超过10亿的user,以及数百万的item。相比之下,著名的Netflix奖项推荐大赛拥有1亿收视率、48万user、17770部电影(项)的大型行业数据集。从那以后,这个领域有了更多的发展,但是,我们读到的最大的数字至少比我们正在处理的数字小两个数量级。

    我们面临的一个挑战是需要设计一种分布式算法,可以扩展到这些海量的数据集,以及如何克服由于数据的某些属性(如ttem的倾斜度分布,或隐式的参与信号而不是评分)而引起的问题。

    正如我们将在下面讨论的,现有解决方案中的方法不能有效地处理我们的数据大小。简而言之,我们需要一个新的解决方案。我们以前已经介绍过Apache Giraph,这是一个用于分布式迭代和图形处理的强大平台,以及我们为使其符合我们的需求所做的工作。我们还写了关于图分区的应用程序。Giraph在海量数据集上工作得非常好,易于扩展,而且我们在开发高性能应用程序方面有很多经验。因此,Giraph是我们解决这一问题的首选。

    2. Matrix factorization

    CF的一种常见方法是矩阵分解。在分解过程中,我们将问题视为拥有一组users和一组item,以及表示已知user-to-item评分的一个非常稀疏的矩阵。我们想预测这个矩阵中缺失的值。为了做到这一点,我们将每个user和每个item表示为潜在特征的向量,以便这些向量的点积与已知的user-to-item的评分非常匹配。预测未知的user-to-item评分也可以近似为对应的特征向量的点积。因此,我们要最小化下面的目标函数:

     

    这里,r是已知的user-to-item的评分,x和y是我们试图找到的user和item特征向量。由于自由参数较多,需要正则化部分来防止过拟合和数值问题,其中gamma是正则化因子。

    目前在合理的时间内找到上述公式的最优解是不可行的,但有一些迭代方法是从随机特征向量出发,逐步改进求解。经过一定次数的迭代,特征向量的变化变得非常小,达到收敛。有两种常用的迭代方法。

    2.1 Stochastic gradient descent optimization

    随机梯度下降法(SGD)在许多其他问题中得到了成功的应用。该算法以随机顺序遍历训练数据中的所有评分,对于每一个已知的评分r,通过预测r*(基于向量x和y的点积),计算预测误差e。当改变x和y时,将它们向梯度的反方向移动,得到x和y的每个特征的某些更新公式。

    2.2 Alternating least square

    交替最小二乘(ALS)是非线性回归模型的另一种方法,当有两个因变量(在我们的例子中是向量x和y)时,该算法修复一个参数(user向量x),同时通过最小化二次形式优化求解另一个参数(物品向量y)。该算法在固定user向量和更新物品向量、固定物品向量和更新user向量之间交替,直到满足收敛条件。

    3. Standard approach and problems

    为了以一种分布式的方式有效地计算上述公式,我们首先研究了在设计上与Giraph相似的系统是如何做到这一点的(使用消息传递而不是map/reduce)。标准的方法是将user和item都作为图的顶点,边表示已知的评分。然后SGD/ALS的迭代计算将发送user 和/或 tem特征向量到图的所有边,并进行本地更新。

    这个解决方案有几个问题:

    1. 海量的网络流量:这是所有分布式矩阵分解算法的主要瓶颈。由于我们通过图形的每条边发送一个特征向量,所以在一次迭代中通过线路发送的数据量与# rating * #Features成比例(在这里以及稍后的文本中,我们使用#作为“number of”的表示法)。对于1000亿个评分和100个双重特性,这将导致每次迭代产生80 TB的网络流量。在这里,我们假设user和item是随机分布的,并且我们忽略了一个事实,即一些评分可以存在于同一个worker上(平均来说,应该乘以因子1 (1 / #Workers))。请注意,智能分区不能大幅减少网络流量,因为这些item的规模很大,这并不能解决我们的问题。
    2. 我们数据集中的一些items非常流行,所以item的度分布是高度倾斜的:这可能会导致内存问题,每个item都接收到degree * #Features 的数据。例如,如果一个item有1亿个已知评分,并且使用了100个双重功能,那么仅这个item就可以占据80 GB的数据。大度item还会导致处理瓶颈(因为每个顶点都是原子处理的),每个人都会等待完成几个最大度items。
    3. 这并没有在原来的公式中完全实现SGD:每个顶点都使用迭代开始时接收到的特征向量,而不是它们的最新版本。例如,:例如,假设item A对uesr B和uesr  C进行评分。在一个连续的解决方案中,我们首先更新A和B,得到A' 和 B',然后更新A'和C。通过这个解决方案,B和C都将被更新为A,即迭代开始时item的特征向量。(这是一些无锁并行执行算法的实践,可以减慢收敛速度。)

    4. Our solution — rotational hybrid approach

    主要问题是在每次迭代中发送所有更新,因此我们需要一种新的技术来组合这些更新并发送更少的数据。首先,我们试图利用聚合器并使用它们来分发item数据,但是我们试图组合item特征向量上的部分更新的公式都不能很好地工作。

    我们最终提出了一种方法,它要求我们使用 worker-to-worker 的消息传递来扩展Giraph框架。user仍然显示为图形的顶点,但是item被划分为#Workers不相交的部分,每个部分存储在一个worker的全局数据中。我们将所有worker放入一个圆圈中,并在每个超步骤之后顺时针方向旋转item,方法是将包含item的worker到worker的消息从每个Workers发送到行中的下一个Workers。

    通过这种方式,在每个超步骤中,我们为当前在超步骤上的item处理worker的部分user评分,因此在#Workers超步骤之后处理所有评分。让我们分析一下之前的解决方案存在的问题:

    1. 网络流量:对于SGD,在一次迭代中通过线路发送的数据量与#Items * #Features * #Workers成比例,它不再依赖于已知评分的数量。对于1000万个item、100个双功能和50个工作人员,这总共带来了400 GB,比标准方法小20倍。因此,对于#Workers <= #Ratings / #Items,旋转方法的性能要好得多,即,如果工人人数低于平均item学位。在我们使用的所有数据集中,度小的item被忽略了,因为这些并不代表好的建议,可能只是噪音,所以平均项度很大。我们将在下面更多地讨论ALS。
    2. 倾斜item度:这不再是一个问题,user顶点是唯一做处理的,item从来没有保存关于他们的user评分的信息。
    3. SGD的计算:这与顺序解是一样的,因为在任何时间点上都只有一个版本的特征向量,而不是将它们的副本发送给许多工作者,并在此基础上进行更新。

    使用ALS的计算比使用SGD要复杂,因为为了更新一个user/item,我们需要它的所有item/user特征向量。更新在ALS实际上是我们解决一个类型的矩阵方程a * X = B,一个是X # #功能特征矩阵和B是1 X #特征向量,并根据user/ a和B是计算item特征向量形成所有已知的评分item/user。因此,在更新item时,我们不仅可以旋转它们的特征向量,还可以旋转A和B,在每个#Workers超步骤中更新它们,最后计算新的特征向量。这会将网络流量增加到#Items * # features s2 * #Workers。根据所有数据维之间的比例,对于某些item,这比标准方法好,对于某些item,则不是。

    这就是为什么我们的旋转方法和标准方法的混合可以得到更好的解决方案。通过在一定程度上查看item,在标准方法中,与之关联的网络通信量是degree * #Features,而在我们的轮换方法中,是#Workers * #Features^2。我们仍将使用标准方法更新degree < #Workers^ * #Features 的item,并将对所有更高级别的item使用轮换方法,从而显著提高性能。例如,对于100个双功能和50个worker,选择方法的项度限制在5000左右。

    为了求解矩阵方程A * X = B,我们需要找到A-1的逆矩阵,为此我们使用了开源库JBLAS,它对矩阵逆有最有效的实现。

    由于SGD和ALS具有相同的优化公式,也可以将这些算法进行组合。ALS在计算上比SGD更复杂,我们包含了一个选项,即对SGD进行若干次迭代,然后对ALS进行一次迭代。对于一些数据集,这有助于离线度量(例如,均方根误差或平均秩)。

    我们遇到了大程度item的数字问题。有几种方法可以绕过这个问题(忽略这些item或对它们进行取样),但是我们使用的是基于item和user级别的正则化。这使得user和item向量的值保持在一定的数值范围内。

    5. Evaluation data and parameters

    为了度量推荐的质量,在运行实际的A/Btest之前,我们可以使用现有数据的一个示例来计算一些离线指标,这些指标反映了我们的估计与实际user首选项之间的差异。上述两种算法都有许多超参数需要通过交叉验证进行优化,以获得最佳推荐,我们还提供了其他选项,如添加user和item偏差。

    输入评分可以分为两个数据集(训练和测试)。在测试数据由所有培训实例之后的时间间隔内的所有user操作组成的情况下,这一点非常有用。否则,为了构建测试数据,我们随机选择每个user的T=1个item,并将它们与训练分开。在算法中,对于一定比例的user,我们对所有未评分的item(即,并观察培训和测试item在建议的排名列表中的位置。然后我们可以评估以下指标:指的是平均排名(位置在排名列表中,平均超过所有测试item)、精密位置1/10/100,意味着所有测试item的平均精度(MAP),等。另外我们计算均方误差(RMSE),而放大的贡献之间的绝对误差预测和真正的价值。为了帮助监控结果的收敛性和质量,在每次迭代之后,我们都会打印所有这些指标。

    在一个有350亿加权训练评分和2亿测试评分的样本数据集上,下图显示了RMSE是如何在#Features=8或#Features=128的训练和测试集上减少的,而其他参数是固定的。

    6. Item recommendation computation

    为了得到所有user的真实推荐,我们需要为每个user找到预测评分最高的item。在处理庞大的数据集时,检查每个(user、item)对的点积是不可行的,即使我们将问题分发给更多的workers。我们需要一种更快的方法来找到每个user的前K个推荐,或者一个很好的近似。

    一种可能的解决方案是使用球树数据结构来保存item向量。球树是一种二叉树,其中叶节点包含item向量的某个子集,每个内部节点定义一个球,该球包围其子树中的所有向量。使用查询向量和球内任何向量的点积的上界的公式,我们可以做贪婪树遍历,首先到更有前途的分支,并修剪不能包含比我们已经找到的更好的解决方案的子树。这种方法比查找每一对数据快10-100倍,可以在合理的时间内完成对数据集的搜索。我们还添加了一个选项,允许在寻找TOP建议时出现指定的错误,从而进一步加快计算速度。

    另一种近似求解该问题的方法是基于item特征向量对item进行聚类,将问题简化为寻找TOP cluster推荐,然后根据TOP cluster提取实际item。这种方法加快了计算速度,同时略微降低了基于实验结果的推荐质量。另一方面,集群中的item是相似的,通过从每个集群中获取有限数量的item,我们可以得到一组不同的建议。注意,我们在Giraph之上也有k-means集群实现,将这一步合并到计算中非常容易。

    7. Comparison with MLlib

    Spark MLlib是一个非常流行的机器学习库,它包含该领域中领先的开源实现之一。2014年7月,Databricks团队在Spark上发布了ALS实现的性能数据。实验是在亚马逊评论数据集的按比例复制的基础上进行的,该数据集最初包含3500万个评分,运行了5次迭代。

    在下面的图,我们相比rotational hybrid方法(我们在Giraph中实现的)的标准方法(火花MLlib中实现,包括一些额外的优化,比如发送一次最多特征向量机),在相同的数据集。由于硬件差异(我们每台机器的处理能力的2倍),为了使一个公平的比较我们看总CPU分钟。旋转混合溶液大约快10倍。

    此外,使用标准方法进行实验的最大数据集有35亿个评分。使用旋转混合方法,我们可以轻松处理超过1000亿的评分。请注意,结果的质量对于这两种情况都是相同的,并且所有性能和可伸缩性收益都来自不同的数据布局和减少的网络流量。

    8. Facebook use cases and implicit feedback

    我们在Facebook的多个应用程序中使用了这种算法,例如推荐你可能喜欢的页面或你应该加入的群组。如前所述,我们的数据集由10多亿user组成,通常有数千万个items。实际上有更多的页面或组,但是我们将自己限制在通过某个质量阈值的item上——最简单的版本是item度大于100。(有趣的是,另一方面,我们有一些非常大的页面——“Facebook for Every Phone”页面实际上被Facebook近一半的user喜欢。

    我们的第一个迭代包括页面喜欢/组连接作为积极信号。Facebook上的负面信号并不常见(负面信号包括不喜欢某个页面或在一段时间后离开某个群组)。而且,这并不意味着user对该item有负面反馈;相反,他或她可能对主题或接收更新失去了兴趣。为了获得好的推荐,需要从集合中未评分对中添加负面item。以前的方法包括从未评分的item中随机抽取负的训练样本(导致有偏差的非最优解),或者将所有未知的评分都视为负的,这极大地增加了算法的复杂性。在这里,我们实现了添加随机负面评分考虑user和item度(负面评分比例添加到user基于item度分布),和权衡负面评分不到积极的,我们没有一个好的模型学习与统一的随机抽样方法。

     另一方面,我们有来自user的隐式反馈(user是否在积极查看页面、喜欢或评论组中的帖子)。我们还为隐式反馈数据集实现了一种著名的基于als的算法。这种方法没有尝试直接对评分矩阵建模,而是将数据视为二进制首选项和置信度值的组合。然后,评分与观察到的user首选项的可信度有关,而不是与对item的显式评分有关。

    在运行矩阵分解算法之后,我们还有一个Giraph工作,即为所有user计算TOP推荐。

    下面的代码展示了使用我们的框架、优化参数和插入不同数据集是多么容易:

    CFTrain(
        ratings=CFRatings(table='cf_ratings'),
        feature_vectors=CFVectors(table='cf_feature_vectors'),
        features_size=128,
        iterations=100,
        regularization_factor=0.02,
        num_workers=5,
    )
    CFRecommend(
        ratings=CFRatings(table='cf_ratings'),
        feature_vectors=CFVectors(table='cf_feature_vectors'),
        recommendations=CFRecommendations(table='cf_recommendations'),
        num_recommendations=50,
        num_workers=10,
    )

    此外,可以通过扩展SGD或ALS计算来简单地实现其他目标函数(例如秩优化或邻近模型)。

    9. Scalable CF

    推荐系统正在成为预测user偏好的重要工具。我们的矩阵分解和计算TOP user推荐的框架能够有效地处理Facebook拥有1000亿评分的海量数据集。它很容易使用和扩展其他方法。

    我们正在考虑许多改进和算法,包括:

    • 结合社交图和user联系,提供一组更好的推荐
    • 从以前的模型出发,代替随机初始化,进行循环学习
    • 自动参数拟合与交叉验证,以优化不同指标的给定数据集
    • 尝试更好的分区和跳过机器,这些机器在旋转过程中不需要某些item数据

    我们正积极致力于推荐和Giraph之上的许多其他应用程序,所以请继续关注这个领域中更令人兴奋的特性和开发。

     

    转载于:https://www.cnblogs.com/wkang/p/10014191.html

    展开全文
  • 当我写完这个系列所需要所有章节后,我回顾了一些,颇与软件开发相似。我希望这篇文章能够锻炼大家关联性思维。这种思维很重要,许多创新高手在关联性思维方面极强,他们往往能把许多随时随处随地看到一些...

     当我写完这个系列所需要的所有章节后,我回顾了一些,颇与软件开发相似。我希望这篇文章能够锻炼大家的关联性思维。这种思维很重要,许多创新的高手在关联性思维方面极强,他们往往能把许多随时随处随地看到的一些东西与自己的工作或手头问题联系在一起。不管我们是在开发、管理、创业上,我们都非常需要这种关联性思维。

    许多网友缺乏这种关联性思维,我说一种现象,是为了说明某个方法或方向。但是他却看不到我的用意,非要跟我讨论这种现象本身。例如,我曾经讲过这样一个事:“给客户行业引入了许多新模式,如DELL直销模式、DELL销售管理模式、宝洁乡村展销模式都让客户惊喜不已”。有的网友看到了,就跟我较真:“如果是小公司跟一个新客户聊,肯定被认为是扯淡”。我最后纠正说:“我说了多少次,你不能死搬硬套,你非要拿我行业特点强复制,我讲的是一个方法思路,又不是一个可以让你复制的东西”。这才作罢。

    我今天就拿写文章和写软件做对比,让大家从这两件不相干的事情上锻炼自己的关联性思维。

    我一开始写这个系列,本来是心中有一个完整的流程思路的。

    咨询业有一个很好的分析企业管理方法的模型,就是:组织结构、职责、流程、考核。

    本来我就打算按这个思路写下去。但是我每每想这么写,都被网友的力量打败。网友们想看的,最近关注的,我没有写,我还按部就班的按自己的思路写,最终,当然的结果就是写了没人看,点击量日益下滑。最后不得已,立即根据网友评论反馈奉献出网友们关注的问题文章,点击量才回升。

    这就和我们写软件一样,必须要以客户为中心,按照客户的需求来设计软件,要有一种途径和方法与客户做第一手的互动。你越是自己闭门造车,越就远离客户,客户最终就会抛弃你,你只能自己自言自语。我这次写作,就采用了博客发表草稿,然后读者评论的需求交互形式,给自己文章内容的充实、问题重心调整、叙述风格、需求落实上都带来质的影响。

    没有办法,只能按照网友们的需求来写。网友们喜欢看哪一章,我就提前把哪一张先写出来。这就颇似拍电影,今天到了哪些大腕演员,今天的哪些景已经准备好,今年就拍哪个镜头。所以我们常常看到电影这样拍摄:拍摄前有场记,记录下这是第几场第几次。大量的电影都是这样被拍摄完成的,并不是从第一场戏开始拍,直到拍完最后一场戏才算杀青。如果这样拍,早就浪费了大量的时间和成本了。比如说《闯关东》,故事历经好多年,重复过了多少春夏秋冬。如果真要一场场连着拍,这就没法拍了,只能集中把冬季的戏集中拍,然后在后期剪辑的时候,把这些戏按照剧本再串联在一起,就形成了我们现在看到的连贯的剧情。

    我设计开发软件的时候也是这样,先把第一优先级的,互相关联的功能先设计出来,然后边开发边进行第二优先级的功能设计,这样就保证了设计、开发、测试、文案在同时工作,将串行变成了并行。

    我写的时候,实际心中只有这么一个框架思路,里面每个章节的内容也只是有个那么个大概1、2、3点,细节也没有多想,觉得讲的是一个独立的主题,就应该独立出来成一章。所幸,过去这么多年,我爱做笔记,看到什么想到什么都随手记下来,有的记在了纸上,有的记在了手机上,最后我还得把它们誊到笔记本电脑上。我平时也喜欢润物细无声的培训、指导、影响,所以经常给员工给老板写不少邮件,这次写作,很多内容都来自这些平时的邮件和积累的笔记。如果没有这些平时的积累,我想要从第一个字写起,一年都写不完。

    所以对于我们开发软件,平时就要注意客户需求,关注客户行业的变化趋势,经常性阅读、讨论、思考。需要有需求管理系统来明确的记录需求,等下一版本开发的时候,很自然就能决定开发的周期、开发的重点、开发的工作量。

    我记得香港导演王家卫,拍摄《堕落天使》《花样年华》《东邪西毒》,都是没有剧本,只是有一个大概故事框架。拍摄一点,王家卫逐渐对自己心中想要的故事有一点清晰的理解,随着拍摄的不断进展,他终于明白了自己想要的东西细节。所以,王家卫拍片,往往越拍到后面工作量越大,尤其导演,白天拍天晚上写第二天的剧本,而且往往很多经典台词都是这么来的。到了最后,回过头来看自己第一阶段拍的镜头,就不满意了,于是常常重拍第一阶段的戏。

    我在写这个系列的时候也是这样,细节没有,看着一个主题,想想应该要讲到1、2、3、4这几个点。但是讲完了,这个主题就太单薄了,也很突兀,让人看着也很枯燥,就想着怎么把这几个点串起来。好不容易想了些串词,一写,发现这个主题的描述需要事情的背景、基础、前提,否则大家不知道为什么要提出这个问题,这个问题有什么意义,到底要解决什么问题,这个问题能不能被这些点解决掉。于是我就回过头来把这些背景再加上。写完后,又发现结尾结的干脆,1、2、3、4点讲完,就完了。到底效果如何,有没有后遗症,该注意什么常见的执行问题,都没有说到。于是把结尾后果又写了出来。终于写完发布了博客,网友一评论,发现还是少东西了,于是又修改完善。有时候网友提出来的问题非常准确,没法见缝插针的修改,所以有的网友看见我的博文上有后续记,来专门针对网友的某个具体问题进行回答。这样看起来整篇文章就不连贯,因为往往是博文发布了两三天,我都在不断完善这篇博文,致使我第一次一气合成写就的文字,和后来的补遗,从心态到笔锋都不一致。所以,我在后来成书的时候,为了能使所有段落一致,花了大力气进行的改稿,经常把某段话搬来搬去,最后实在无奈,单独拿出来,看有机会再塞到哪篇文章中,或者干脆再另起一章。

    我在设计软件的时候也出现这样的问题,尤其对于一个新的产品,而非一个新的项目。新产品,谁也看不好说不好,具体要什么具体要做什么层次什么地步,客户也说不好。大家都是抱着探索的心态去思考。但是总得要有一个开始呀,不能老在那里调研交流思考啊。怎么开始,做的多深合适。于是,我设计软件的时候,也是先把1、2、3、4功能点设计出来,然后围绕这几个点进行周边的完善,第一版出来后,对需求就比较准确把握了,但是看看开发出来的第一版,觉得过去写的确实不满意,真要真正做以后的产品,要作为公司未来现金牛的主力产品,肯定不能这么干。所以,我研发新产品的时候,不会在许多方面要求这个那个。第一版往往是按照粗框设计,实现的时候是为了快速实现看效果,只能算一个原型版本。正式做软件的时候就需要重新写一版。这并浪费时间,由于需求准确了,大家过去写第一版的时候也只是当作练手代码而已,并没有下多大功夫,利用价值也不大,所以重写很快,也没有包袱。大家都知道,白纸上画画最好做,最难做的就是维护已有代码,大刀阔斧改还不让,不改又不爽。为了让大家没这种后顾之忧,所以我还是建议重写的好,能利用过去就利用过去,利用不上也无所谓。

    我写完这个系列后,想根据大家的反馈来修改每一篇文章。由于大家都是针对每一篇文章写的读后感,所以我一开始的思路就是按照每篇文章来修改。越修改我越无法下手了。因为大家问的问题,往往和当前文章有关,但又是当前文章没有说到的,而具体解决网友们的问题的文章,可能是下一篇或其他的文章来专门论述的。我如果按照一篇篇文章后的评论来单独修改每一篇文章,就把该文章的主题就冲淡了。尤其是,软件开发过程管理,各个环节都是相连相扣的,所以我实在改不下去了。就把所有大家的反馈评论收集起来,别收集别分类,分为讨论人力资源的、讨论需求管理的、讨论进度控制的、讨论质量管理的,等等。然后,我遇到相应的主题的时候,就把这些大家反馈加进去,这样就合缝了。

    开发软件也是一样。我们经常会面对客户各种各样的需求。我们也会经常这么干:客户说一条,我们感觉能编程实现就答应了。就这样修改来修改去,最后发现,有的客户要这样,有的客户要那样,软件不断被改来改去,新签一家客户,老让抱怨,怎么你们软件这么奇怪的操作手法。我们只能干笑:都是根据客户需求来的,我们为了兼容每家客户的需求,所以只能做成这样。这个就类似把杨玉环的脸,貂蝉的鼻子,王昭君的眉都放在了一起,组成了一个看似美人又不是美人的怪胎。说起来是笑话,但经历过这种痛苦的程序员是绝对笑不起来的,因为尴尬自知。所以,我提出来系统性思维,从产业来看,从竞争格局来看,从行业趋势、挑战、机遇来看。有句话叫“流星走过的地方,必留下它的痕迹”。这句话我想说的是:虽然你只能不见森林只见树木,你只能看到每个具体客户的每个具体的很细节的需求,但是当你把4-5年的需求都拿出来过目的时候,你会发现其中的规律性和趋势性。如果你没有这样一个需求管理系统,建议你还是建立一个。这会让你大处着眼小处着手,高低伸缩自如。

    在香港,往往会有这样一个现象:这集拍完后,然后导演、演员、主创人员,都会到电台电视台去做节目,然后跟现场观众互动。观众会提出不少问题,创作人员会在接下来的时间快速根据观众的反馈修改剧本。下一星期下一集播放的时候,观众就看到了自己想看的内容,于是观众的观看热情更加高涨。而且,有时还邀请观众来演,还海选配角,把一部肥皂剧搞的风风火火,不畅销都难。我们常常看到香港的一个二流明星,唱功和内地歌星比简直不能比,但现场和观众互动绝对棒,所以港台歌星的报酬总是高于内地歌手,让人眼红咬牙又无可奈何。

    我这次写作的时候,也是采用了这种方式,我文章中的许多案例都是来自网友们的交流,网友们自己的故事,所以许多人都看着亲切。我也开通了自己的邮箱、QQ,许多网友很轻松的加入了我的好友,可以和我直接交流,我因此获得了不少新鲜的观点与案例,为文章增色不少,我的文章也因网友们的反馈而踏实了许多。

    我们开发软件,也经常会采用用户大会的形式来一起讨论需求,我们还日常开通了用户服务支持QQ群,可以随时交流,我们也开通了WEB需求管理入口,可以随时,每个人都可以提交需求。有时候,销售在外地打单,客户提出来一个需求,售前人员都无法回答,就随时提交到了需求库中,无须回到工作地才总结报告,否则早就可能忘了。

    现在就连写文章出版书都发生了很大的变化。过去写书,是把自己关在屋子里不断的写不断的修改,要出版一部书很难,写成后出版了销售效果如何也不知道,读者怎么想也不知道,到处在听天由命。现在WEB2.0自由的草根之风,现在BLOG这种简单技术的应用,让我也可以把这个系列不断写完。这是一种很新的写书方法。在网上名噪一时的《明朝那些事儿》、《鬼吹灯》、《诛仙》都是这样炼成的。

    我们的软件开发,和我们过去的写书何其相似。这种模式如何能适应市场的变化呢?所以我曾经提过未来的软件研发模式,虽然很多网友还不太相信,感觉都是楼主在痴人说梦。但市场,我们不要忘了,月亮的脸偷偷的在改变,我们千万不能笑温水里的青蛙。很有可能,我们自己就是那个可怜鬼。

    我这次写作,很遗憾没有使用的一个香港导演方法就是上下集预告的方法。香港、韩国电视剧往往会有这个桥段。这样,随便一个人,随便从哪集看起,都能继续看下去,不至于半路地插不进来。这样,那会损失多少观众啊。我这次写作,还专门注意了这一点,希望每个章节都能主要解决一个问题,而所有章节又都是互相关联的,合起来就是一个完整的解决方案。香港电视剧就是这样,每一集都有一个核心故事情节,又能连起来。这和香港电视剧的生产方式有关。香港电视剧的创作方式,也许很早起源于香港武侠小说连载。当年金庸就是每天写一篇,他也是心中只有一个大概框架,想到哪里就写到哪里。有一次,金庸出差,但连载不能断,于是金庸就请他的朋友倪匡代笔,倪匡呢,故意给金庸找点麻烦,想看看金庸有什么才能把故事说圆了。最后,金庸一回来,呀,怎么好好一个故事被写成了神话,实在没法收场啊。怎么办?还得继续连载下去,因为前几期都已经连载发表了,不续写不行了。于是,金庸好不容易绕了一大圈才把故事又说回自己的主线去,这部小说就是大家如今看到的《天龙八部》。

    我在设计规划软件的时候也是这样,功能之间环环相扣。我的实施人员就差些,尤其是一些新手,喜欢把菜单打开,一个功能一个功能的讲。我曾经说过他们多次,不要给客户展示所有的功能,客户不需要所有的功能,客户只关心自己所关心的那一点。所以,我会从这一点切入,然后讲到它的前置条件,然后讲到它的后续分析,这样,一个单薄的点就被讲丰满了,而且客户也知道了我所讲的每个功能都很重要,都有存在的理由。这样讲就生动了许多。

    我们经常看好莱坞的电影,往往会有这么一个印象,就是每部电影结束以后,总会有意识的留一个悬念小尾巴,让人以为还有续集。其实,制作方并没有续集的具体计划,只觉得如果票房好,可以接着拍续集。

    我在规划产品线的时候也是如此。客户提了各种各样的需求,我会把需求分离,哪些需求这一版本满足,哪些需求是下一版本满足,哪些需求就根本不会出现在这个产品中。如果把所有需求都加到一个产品中,那你说这个产品该叫什么名字呢,或许它不叫维修系统不叫服务系统不叫进销存系统,它很可能叫ERP系统,说不清道不明。有些客户和我们是老关系,一见面,当我介绍完产品,老调侃一句话:坏蛋。呵呵,他们想要的功能,却在另一个系统中。几个系统互相关联,你用了A产品,你就想B产品,你用了B产品,你就想C产品,就跟哈尔滨红肠一样一串一串的。

    现在大家已经对电影宣传见怪不怪了。我过去特别爱看电影大片的发布会,如《十面埋伏》的发布会,请来了当年很红却从未见过面的刀郎,还让国际巨星章子怡开口一唱,实在惊艳。尤其从去年开始《头名状》,今年的《赤壁》,片子还未拍,演员还未定,剧本还没写,投资还没落,在媒体上就能看到吹风了。电影刚开拍,就看到了片花。我想,我这次写博发表文章,大概也是一种片花吧。

    在软件开发中,我也曾经采用过这种片花的形式。软件还在开发过程中,我已经安排文案在制作类似片花的东西,PPT,演示视频录像,展现的很是精采,让人特别期待软件的推出。虽然每次都毁誉参半,但这种商业性的软件运作推广是必不可少的,这是当前市场环境所决定的。就如同参加各种技术大会,微软请来了摇滚乐队,IBM找来不少清凉MM,看着养眼。现在的IT娱乐化的趋势越来越明显,我们经常会看到某个明星开始代言IT产品。

    电影,是艺术,也是个商品,这个特性和软件颇为类似。香港电影生产,快的可以达到15天一部电影。但是电影的质量并没有下降到很烂的地步。其原因就是:温馨的都市生活、一点点搞笑、一点点哲理、一点点感动,一点点幻想,就OK了。地下铁、花好月圆、大肢佬、瘦身男女、河东狮吼,都是如此。恰到好处。电影,其目的就是让大家放轻松。国内某些导演非要拍的很深刻,看的让人很压抑,这思想那思想让人喘不过气来。

    和软件开发颇为相似。我也总是在成本与质量与销售三者情况下不断权衡。毕竟,开发软件不是为了娱乐自己,而是为了客户利益,为了公司利益。许多人把自己手中的任务开发当作自己的软件,离开公司居然把软件源代码也带走了,这就太不职业化了。

    就连我这写书,这种文雅之事,居然也是以迎合读者口味希望出版社大卖为目标,这种如影随形的习惯思维一直渗透在我的每个行为中,想扔掉都不可能。我曾经试图脱离这种影响,但越是如此越无从下手,或者写出来的东西味如嚼蜡,最后放弃,顺其自然,居然又写下去了。人真是不能和自然搏斗,不能和自己的性格搏斗。习惯决定性格,性格决定命运。怪不得我在上大学的时候,老师就对我怒斥:不要总是钱、钱的。至今让我羞愧。

    这个市场需要陈凯歌,也需要冯小刚,也需要孟京辉,也需要刘伟强,也需要徐克。

    那到底我会是谁呢?

    展开全文
  • 2018.11.15 作业

    2018-11-18 21:21:00
    聚类是我们把相似的东西集中在一起。 分类要事先定义好类别 ,类别数不变 。聚类的类别是在聚类过程中自动生成的。 分类器的构造方法有统计方法、机器学习方法、神经网络方法等等。 常见的聚类算法包括:K-均值...
  • 当我写完这个系列所需要所有章节后,我回顾了一些,颇与软件开发相似。我希望这篇文章能够锻炼大家关联性思维。这种思维很重要,许多创新高手在关联性思维方面极强,他们往往能把许多随时随处随地看到一些...
  • AXure大家都知道,项目经理及主管在进行开发之前,需要用到需求收集及整理东西。...但这个插件里,却集成了几十种类似好用和好效果插件,免去了你自己定义开发之苦,并能有效展现给用户最好DEOM原型
  • 用keras进行猫狗识别(三)

    千次阅读 2019-05-03 17:05:48
    使用特征提取的方法对样本进行训练背景准备文件 ...其中包括了我们本次要识别的东西,或者和我们识别的东西相似特征的东西,这样我们就可以利用其训练的模型运用到自己的模型中。 首先介绍一下卷积神经网...
  • 方法实现了信号和槽函数关联,第一个按钮我们直接在设计器中实现其关 联;第二个按钮我们自己写了槽函数语句,其实图形设计与直接写代码效果是 一样。 这个程序里我们实现了两类窗口打开方式,一个是自身...
  • 国内外主流三维GIS软件

    热门讨论 2011-03-14 13:38:59
    除了真实地“再现”城市的地形外,Virtual Earth 3D中也包含一些现实世界中不存在的东西。  特点:Virtual Earth 3D不要求用户在硬盘上下载应用软件,而是直接在浏览器中运行。  发展历程:在Google宣布推出...
  • 毒汤日记【持续更】

    2021-01-26 13:43:58
    凡是你想控制住的东西,其实都控制住了你 托尔斯泰讲,幸福的家庭都是相似的,不幸的家庭各有各的...一棵树最好的时间是年前,其次是现在。这句话和这一句比较像:Better late than never —— 迟做总比不去做好 .
  • // 我还没有告诉你怎样使用数组的相似支持方式吗?让我们看一看 echo "$myphonebook[0]"; // sbabu echo "$myphonebook[1]"; // 5348 其他一些对数组或哈希表有用函数包括sort(),next(),prev()...
  • 我主要是C#程序员,大约年...因为我对C#和WPF非常熟悉,所以我想对这两技术有何相似或不同之处有所了解。编辑:看到没有答案,我会尝试更具体:WPF使用XAML创建可视化树,JavaFX是否有类似的东西?WPF最好与MV...
  • 稻香村起子饼

    千次阅读 2008-09-05 10:33:00
    一下子回忆起二、三年前老爸每周末从煤矿回家里一趟,就会把一周省下来的糕点、面包票换成糕点、面包带给我们姐弟三个吃,那是七几年的事了,当时糕点可是仅有的最好吃的东西之一,其中一外型像饼一样的甜甜的...
  • 上一年记录的东西,整理下...  需要代码联系我QQ:791909235,本人不做义务咨询。 一.哈希检索概述  LSH是Locality Sensitive Hashing的缩写,也翻译为局部敏感哈希,是一通过设计满足特殊性质即局部敏感的哈希...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    三章 事件和索引指示器 .148 13.1 事 件 .148 13.2 索引指示器 .151 13.3 小 结 .154 第四章 继 承 .155 14.1 C#继承机制.155 <<page 3>> page begin==================== 14.2 多 态 性 ....
  • C#微软培训资料

    2014-01-22 14:10:17
    三章 事件和索引指示器 .148 13.1 事 件 .148 13.2 索引指示器 .151 13.3 小 结 .154 第四章 继 承 .155 14.1 C#继承机制.155 <<page 3>> page begin==================== 14.2 多 态 性 ....
  • 返美之后,花了两个月才念完这本,看了之后,有几个感想,第一,此书 深入浅出,中英文一起来,对我是受用,好几相以前想不通的东西,现 在清楚多了。第二,他举的例子,都是实实在在的真实例子,他多少年身 体力学...
  • 读书笔记 - 《秦殇》

    2016-01-09 00:13:00
    秦朝严酷推行法家方式,导致社会阶层瓦解,以致出现了“王侯将相宁有乎”声音,遍地狼烟而无诸侯镇压并导致秦帝国崩溃。这和一条鞭法导致白银短缺并最终导致明帝国崩溃何其像也。惯例形成必有原因,无倍利益...
  • our o【圈子-圈住所有的东西】,u【空间】,r【围绕】 →圈住、围绕住空间里所有的东西,所以这些东西都是我们的 they th【=t延伸】,e【向外】,y【分裂】→I是我,从I分裂出you你,再从你向外延伸分裂出他们、...

空空如也

空空如也

1 2 3
收藏数 47
精华内容 18
关键字:

十种相似的东西