基于图的PersonalRank算法原理及Python实现

PersonalRank算法是一种基于随机游走的推荐算法,用于在图模型中计算节点的相关性。在二分图中,它用于为用户推荐未直接评分的电影。算法从用户节点出发,通过概率α决定是否继续游走,将重要性分散到其他节点。文章介绍了算法原理,并提供了两种实现方式:随机游走多次和矩阵化实现。
摘要由CSDN通过智能技术生成

1 相关说明

  • TopN推荐问题
  • 在基于图模型的推荐算法中,二分图(u,i)表示用户u对电影i评分过,即用户u观看了电影i。那么给用户u推荐电影的任务可以转化为度量用户顶点Vu和Vu没有边直接相连的电影节点在图上的相关性。
  • 相关性高的顶点一般有如下特性:两个顶点有很多路径相连;连接两个顶点之间的路径长度比较短;连接两个顶点之间的路径不会经过出度较大的顶点。

2 PersonalRank算法原理

从用户u节点开始随机游走,游走到一个节点时,首先按照概率α决定是否继续游走,还是停止这次游走并从Vu节点开始重新游走。如果决定继续游走,那么就从当前节点指向的节点中按照均匀分布随机选择一个节点作为下次经过的节点,每个电影节点被访问的概率收敛到一个数,这个数越大,这个电影就越被推荐。

可以理解成用户u节点的重要性是1,通过随机游走将u节点的重要性分给了其他节点。

在执行算法之前,我们需要初始化每个节点的初始概率值。如果我们对用户u进行推荐,则令u对应的节点的初始访问概率为1,其他节点的初始访问概率为0,然后再使用迭代公式计算。迭代公式如下,其中i代表某个节点,α代表每次游走的概率。
在这里插入图片描述
以上随机游走的算法难点是时间复杂度高,可以通过矩阵论重新设计算法,对稀疏矩阵快速求逆。
在这里插入图片描述
rij代表节点i对于节点j的PR值;r0是对角线为1,其他元素为0的矩阵;M是概率转移矩阵,Mij代表节点j分得节点i的访问概率,如果i指向j的话,取值为i出度的倒数,否则取值为0。在这里插入图片描述
其中(E-αM^T )^(-1) (1-α)可以看做所有顶点的推荐结果,删除所有用户节点行和电影节点列,就可以得到以用户为列、电影为行的访问概率矩阵r。对于每位用户,取对应列的所有行,按照PR值排序即可为其推荐。

3 代码

3.1 随机游走多次实现

import pandas as  pd
import numpy as np
import math
import pickle
import random
import time

#写数据
def writeFile(data,path):
    with open(path, "wb") as f:
        pickle.dump(data, f)

#读数据
def readFile(path):
    with open(path, "rb") as f:
        return pickle.load(f)


#获得用户电影 的两个字典
def getDict(train_data):
    user2mv={
   }
    mv2user={
   }
    for index,item in train_data.iterrows():
        uid,mid=item['UserID'],item['MovieID']
        user2mv.setdefault(uid,[]).append(mid)
        mv2user.setdefault(mid,[]).append(uid)
    return user2mv,mv2user

#随机游走
def personalRank(train_data,alpha,N):
    user2mv,mv2user=getDict(train_data)
    users=list(user2mv.keys())
    movies=list(mv2user.keys())
    #一个columns代表 一个用户
    PR_movie=pd.DataFrame(data=np.zeros([len(movies),len(users)]),index=movies,columns=users)#mu 代表m对于u的重要性
    PR_user=pd.DataFrame(data=np.eye(len(users)),index=users,columns=users)#u1u2 代表u1对于u2的重要性
    num,sum=0,len(users)
    #对于每一个用户进行N次随机游走
    for user in users:
        start
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: k-means聚类算法是一种常用的无监督学习算法,它将数据样本划分为不同的簇,并且簇内数据相似度高、簇间相似度低。Python实现k-means聚类算法的方法有很多,其中比较常用的是使用scikit-learn库中的KMeans类。具体实现方法可以先通过计算欧氏距离来初始化每个数据样本的聚类中心点,并且反复迭代调整各个聚类的中心点,直到聚类结果达到稳定。 ### 回答2: k-means聚类是一种无监督机器学习算法,用于将数据点分组成不同的类别。它的原理是通过计算数据点之间的距离,将它们分为k个不同的类别,并将类别中心移动到每个类别的平均值处。算法迭代直到收敛,即类别中心不再移动。 Python语言是一种非常流行的开发语言,常用于机器学习、数据分析、数据挖掘等领域。在Python中,k-means聚类算法可以使用scikit-learn、numpy等机器学习库来实现。 以下是一份k-means聚类算法Python实现: 1. 首先,导入必要的库: ```python import numpy as np from sklearn.cluster import KMeans import matplotlib.pyplot as plt ``` 2. 生成随机数据: ```python X = np.random.rand(100, 2) ``` 3. 执行k-means聚类算法: ```python kmeans = KMeans(n_clusters=3, random_state=0).fit(X) ``` 这里将数据分为3个不同的类别。 4. 显示聚类结果: ```python plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_) plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='^', s=200, linewidths=3, color='red') plt.show() ``` 这里使用散点来显示数据点,不同颜色代表不同的类别,红色方框表示每个类别的中心点。 k-means聚类算法是一种非常有用的机器学习算法,它可以帮助我们对数据进行分类。在Python中,它的实现也是非常简单的,只需要几行代码就可以搞定。 ### 回答3: K-means聚类算法是一种数据挖掘技术,是一种非监督学习算法。它的主要思想是将数据集分成k个不同的簇,其中每个簇代表一个类。簇内的数据点之间相似度较高而簇与簇之间的相似度较低。K-means聚类算法被广泛应用于像分割、文本聚类和异常检测等领域。 K-means聚类算法原理是先选择k个随机的点作为簇的中心,然后将数据集中的每个点分配到最近的中心簇中,最终计算出每个簇的新中心。循环执行这个过程,直到簇的中心不再发生变化,即聚类结果收敛。 Python中提供了许多K-means聚类算法实现。其中,scikit-learn库中的KMeans函数是比较常用的实现。下面是一个简单的Python实现K-means聚类算法的示例代码: ``` from sklearn.cluster import KMeans import numpy as np # 生成数据 X = np.random.rand(100, 2) # 聚类 kmeans = KMeans(n_clusters=3, random_state=0).fit(X) # 获取聚类结果和中心点 labels = kmeans.labels_ centers = kmeans.cluster_centers_ # 绘制结果 import matplotlib.pyplot as plt for i in range(len(X)): if labels[i] == 0: plt.scatter(X[i,0], X[i,1], color='red') elif labels[i] == 1: plt.scatter(X[i,0], X[i,1], color='green') elif labels[i] == 2: plt.scatter(X[i,0], X[i,1], color='blue') plt.scatter(centers[:, 0], centers[:, 1], color='black', marker='*', s=200) plt.show() ``` 以上代码首先生成了一个含有100个二维随机坐标点的数据集。接着通过调用KMeans函数指定聚类的个数K,这里设置为3,设置一个随机状态种子来保证聚类结果的重复性,使用fit函数对数据进行聚类操作。接着分别获取每个数据点的聚类标记和每个簇的中心点。最后通过matplotlib绘制出聚类结果和中心点。在绘制结果时,我们使用三种颜色来表示不同的簇,用黑色的星号表示簇的中心点。 总的来说, K-means聚类算法是比较实用和简单的无监督学习方法。在Python中,Scikit-learn库提供了一些方便的函数,可以轻松地进行聚类分析和可视化结果。因此,K-means聚类算法是在数据挖掘和机器学习领域不可缺少的工具之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值