做阿里云网站空间,国内打开google网页的方法,wordpress 3.9 性能,c 网站建设教程视频教程[ pca算法用于原始数据维数较高时对数据进行降维 关于pca算法的学习#xff0c;有一篇分析特别详细的论文http://www.cs.otago.ac.nz/cosc453/student_tutorials/principal_componen基本原理NMF#xff0c;非负矩阵分解#xff0c;它的目标很明确#xff0c;就是将大矩阵分…[ pca算法用于原始数据维数较高时对数据进行降维 关于pca算法的学习有一篇分析特别详细的论文http://www.cs.otago.ac.nz/cosc453/student_tutorials/principal_componen基本原理NMF非负矩阵分解它的目标很明确就是将大矩阵分解成两个小矩阵使得这两个小矩阵相乘后能够还原到大矩阵。而非负表示分解的矩阵都不包含负值。 从应用的角度来说矩阵分解能够用于发现两种实体间的潜在特征一个最常见的应用就是协同过滤中的预测打分值而从协同过滤的这个角度来说非负也很容易理解打分都是正的不会出现负值。在例如Netflix或MovieLens这样的推荐系统中有用户和电影两个集合。给出每个用户对部分电影的打分我们希望预测该用户对其他没看过电影的打分值这样可以根据打分值为其做出推荐。用户和电影的关系可以用一个矩阵来表示每一行表示用户每一列表示电影每个元素的值表示用户对已经看过的电影的打分矩阵看起来如下D1D2D3D4U1 5 3 - 1U2 4 - - 1U3 1 1 - 5U4 1 - - 4U5 - 1 5 4而使用矩阵分解来预测评分的思想来源于我们可以通过矩阵分解来发现一些用户打分的潜在特征。比如两个人都喜欢某一演员那他们就倾向于给TA演的电影打高分或者两个人都喜欢动作片。假如我们能够发现这些特征我们就能够预测特定用户对特定电影的打分。为了发现不同的特征我们假设特征的数量少于用户和电影的数量(要是每个用户都有一个独立特征那代价也太大啦)。数学基础首先我们定义U为用户的集合D为电影的集合R U * D为评分的集合。假设我们需要寻找K个特征则我们的目标是找到两个矩阵P和Q使得它们相乘近似等于R。即这样P的每一行表示用户每一列表示一个特征它们的值表示用户与某一特征的相关性值越大表明特征越明显。同理Q的每一行表示电影每一列表示电影与特征的关联。最后为了预测用户ui对特定电影dj的评分我们可以直接计算ui和dj对应的特征向量的点积即现在我们就来计算P和Q。最简单的方法就是梯度下降该方法先初始化P和Q为特定的值计算它们的乘积与真实矩阵的误差然后通过迭代逐渐减小误差直至收敛。由于误差可大可小这里使用平方根误差(squared error)来计算计算公式如下即循环地计算每一条目的误差最后相加。为了最小化误差我们需要知道怎么改变Pik和Qkj的值(在梯度下降中表现为下降的方向)。我们对这个公式求偏微分即得计算出梯度之后我们逐步更新Pik和Qkj[KNN算法的Python实现] 上面公式中为梯度下降常数通常取一个较小的值(防止无法收敛)如0.0002。 有人可能会问一个问题假如我们计算出P和Q使得P*Q近似等于R那么那些未评分的不全是0了么首先我们并不要求P*Q精确等于R其次我们输入的数据是所有已评分的数据(或它的子集)即训练集而并不包含未评分的数据。因此它能够对未评分的做出不等于0的预测。通过上面的更新规则我们就可以逐步减小误差直至收敛规范化上面的算法只是最简单的一个实现实际使用中可能复杂得多。一个最常见的修改就是引入规范化以防止过度拟合。这通过加入另外一个参数来修改误差公式 参数用来控制用户特征向量与条目特征向量的比例以避免出现特征向量中出现特别大的值。实际应用中通常设置为0~0.02之间的值。因此更新公式变成 一个简单的python实现如下(需要安装numpy)import numpydef matrix_factorisation(R, P, Q, K, steps5000, alpha0.0002, beta0.02):Q Q.Tfor step in range(steps):for i in range(len(R)):for j in range(len(R[i])):if R[i][j] 0:eij R[i][j] - numpy.dot(P[i,:],Q[:,j])for k in range(K):P[i][k] P[i][k] alpha * (2 * eij * Q[k][j] - beta * P[i][k])Q[k][j] Q[k][j] alpha * (2 * eij * P[i][k] - beta * Q[k][j])eR numpy.dot(P,Q)e 0for i in range(len(R)):for j in range(len(R[i])):if R[i][j] 0:e e pow(R[i][j] - numpy.dot(P[i,:],Q[:,j]), 2)for k in range(K):e e (beta/2) * (pow(P[i][k],2) pow(Q[k][j],2))if e 0.001:breakreturn P, Q.T使用示例如下R [[5,3,0,1],[4,0,0,1],[1,1,0,5],[1,0,0,4],[0,1,5,4],]R numpy.array(R)N len(R)M len(R[0])K 2P numpy.random.rand(N,K)Q numpy.random.rand(M,K)nP, nQ matrix_factorisation(R, P, Q, K)nR numpy.dot(nP, nQ.T)print(nR)最后P*Q还原出的矩阵如下D1D2D3D4U1 4.97 2.98 2.18 0.98U2 3.97 2.40 1.97 0.99U3 1.02 0.93 5.32 4.93U4 1.00 0.85 4.59 3.93U5 1.36 1.07 4.89 4.12可以看到还原后的矩阵跟原矩阵很接近并且对原来空缺的值作出了预测。在这个例子中我们可以看到U1和U2口味比较接近他们都喜欢D1和D2。而其他的用户则喜欢D3,D4和D5。[Apriori算法是数据挖掘中频发模式挖掘的鼻祖从60年代就开始流行其算法思想也十分简单朴素首先挖掘出长度为1的频繁模式然后k2将这些频繁模式合并组成长度为k的频