協同過濾算法始末記錄

測試環境:
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)

 

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