协同过滤算法始末记录

测试环境:
mysql 5.7.25
python 3.6.5
本机 内存16G

一 、原始数据准备

1.sql准备抽样测试 

        原始数据(txt格式)因数据量巨大(单日10G),不适合于算法初期阶段。故将数据进行抽样获取样例数据进行分析之后再用于原始数据。利用txt分割工具分割为100份,选取其中1份作为kettle原始数据进行处理,去掉无意义字段,抽样获取10000行原始数据存入本地mysql中。(以下sql仅用于个人数据的处理,ID和Code存在重复值,但是seconds不同情况,求和即可。并不适用于其他。)

CREATE TABLE XX as 
(select ID,Code,sum(seconds) 
from xx_temp 
group by ID,Code);

 

2.Python原始预期数据处理:

推荐使用jupyter nootbook操作。

连接本地mysql,并将数据结果作为变量存入result。

db = MySQLdb.connect("192.168.xx.xx","root","xxx","xx",charset="utf8")
cursor = db.cursor()
sql = "select * from xx"
cursor.execute(sql)
result = cursor.fetchall()

    根据seconds对数据进行分组评分:

data_list = []
for i in result:
    i = list(i)
    if i[2] >= 0 and i[2] <=60:
        i[2] =1
    elif i[2] >60 and i[2] <=180:
        i[2] = 2
    elif i[2] >180 and i[2] <=600:
        i[2] = 3
    elif i[2] >600 and i[2] <=1800:
        i[2] = 4
    elif i[2] >1800 and i[2] <=3600:
        i[2] = 5
    else:
        i[2] = 6
    data_list.append(i)

 数据量哪怕之后10000行在处理起来还是很费劲,故再下面的散点图中再次进行了随机抽取数据。

随机抽取确保seed的一致性,这样每次随机抽取之后的结果不会发生变化。

import random
random.seed(1)
data_list = random.sample(data_list,100)
data_list = np.array(data_list)
plt.scatter(data_list[:,0],data_list[:,1])
plt.show()

图片展示如下图所示:

 3.共现矩阵处理

数据格式如下图所示:

data_list = [['usera','tva',1],
            ['usera','tvb',3],
            ['userb','tvb',2],
            ['userb','tvc',3],
            ['userc','tva',1],
            ['userc','tvb',3],
            ['userc','tvd',3],
            ['userd','tvd',2],
            ['usere','tvc',3],
            ['usere','tvf',3],
            ['userf','tve',1],
            ['userg','tva',1],
            ['userg','tvb',3]]

涉及到小知识点:

1)构建二维矩阵:

    i = len(ind_tv) + 1
    # 创建二维矩阵方法
    tv_list_2d = [[0 for col in range(i)] for row in range(i)]    
    # 填充行元素
    n = 1
    for _row in ind_tv:
        tv_list_2d[0][n] = _row
        n += 1
        if n == i:
            break  
    # 填充列元素
    m = 1
    for _col in ind_tv:
        tv_list_2d[m][0] = _col
        m += 1
        if m == i:
            break

2) 根据样例数据,创建用户为key,tv为value的字典类型数据。

    dict_tv = {}
    for m in data_list:
        key = m[0]
        if key in dict_tv:
            dict_tv[key] += [m[1]]
        else:
            dict_tv[key] = [m[1]]

3)共同出现的条件判断:

    for row in range(1,len(ind_tv)):
        for col in range(1,len(ind_tv)):
            if row == col:
                continue
            else:
                counter = 0
                for i in tv_dict:
                    # 共现判断条件
                    if tv_list_2d[col][0] in tv_dict[i] and tv_list_2d[0][row] in tv_dict[i]:
                        counter += 1
                tv_list_2d[row][col] = counter

4)笛卡尔积操作:

import itertools
for i in itertools.product(dict_a.values()):
    print(i)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章