意见传播模型初试

来源:互联网 发布:猎豹安全浏览器mac 编辑:程序博客网 时间:2024/05/16 01:44

算法概述

在意见领袖中寻找路径的方法是将每个领袖拓展一定范围的节点,来判断是否存在路径可以连接,根据实际情况我们选择了并查集(union-find sets)算法并确定拓展的节点为2(实际上拓展到3就会几乎包括到数据内的所有节点,而大部分路径其实在邻居节点就能找到)、

而并查集算法是快速判断两个节点是否在统一集合和集合合并的经典算法,具体方法大概是构建树并将根节点固定,递归查询并进行路径压缩

尝试和初版

先将所有的意见领袖并入一个队列,然后逐层扩展队列,扩展时初始化并查集,在扩展时如果遇到该节点在队列内,则有可能是两个节点的‘交点’,则进行判断然后合并集合,如果到最后所有意见领袖同在一个集合,则路径存在,找路径的方法根据交点层数有所不同,大部分为:
领袖—交点—领袖—交点—领袖……
少部分为:
领袖—邻居—交点—邻居—领袖……
所以代码如下

import stringdef load_data(filepath):    v_dict = {}    with open(filepath) as f:        for line in f.readlines():            line = line.strip().split('\t')            #print (line)            for i in range(2):                if line[i] not in v_dict:                    sv_dict = {}                    sv_dict[line[1-i]] = 1                    v_dict[line[i]] = sv_dict                else:                    sv_dict = v_dict[line[i]]                    if line[1-i] not in sv_dict:                        sv_dict[line[1-i]] = 1                        v_dict[line[i]] = sv_dict                    else:                        sv_dict[line[1-i]] = sv_dict[line[1-i]]+1                        v_dict[line[i]] = sv_dict    return v_dictdef findx(x, fnd):    if x == fnd[x]:        return x    else:        fnd[x] = findx(fnd[x], fnd)        return fnd[x]if __name__ == "__main__":    v_dict = load_data('C:/Users/ASUS-PC/Desktop/data.txt')    """    top_list = []    with open('', 'r') as f:        for line in f.readlines():            top_list.append(line)    """    top_list = ['69433112', '87834473', '18451956', '49590472', '14136608', '92869265', '75282315', '81083101', '89023334', '63845859', '91372070', '21034313', '10313578', '106672906', '41331964', '2389780', '13087802', '5475410', '10167559', '6877822']    print ('data load ok')    fnd = {}    for u in v_dict:        fnd[u] = u    queue = []    union1 = []    union1.append(top_list[0])    for top in top_list:        queue.append(top)        print ('queue append ' + top)    for i in range(2):        for u in queue:            for v in v_dict[u]:                if v in top_list:                    pass                elif v not in queue:                    queue.append(v)                    fnd[v] = u                    if v not in union1 and findx(u, fnd) == top_list[0]:                        union1.append(v)                    #print (v + ' add queue')                elif v in union1:                    x = findx(queue[0], fnd)                    y = findx(u, fnd)                    if x != y:                        fnd[y] = x                        print ('in the ', i, 'th, ' + v + ' already exists and top <' + y + '> has added')                    #else:                        #print (v + ' is in the union')    #print (fnd)

结果大致如下


这里写图片描述


对下一步的思考大概是能否从这个模型中寻找一个共通点从而找出普遍性规律在以后的干涉中加以应用