在計算機術語中,基線(Baseline)是軟體文檔或源碼(或其它產出物)的一個穩定版本,它是進一步開發的基礎。
關於基線可以從以下兩個方面來理解:
1)代表多個原始碼文件的一組穩定版本。比如有三個文件,aaa.c、bbb.c和ccc.h。可以對這三個文件做一個基線,取aaa.c的版本1.1,取bbb.c的版本1.3,取ccc.h的版本1.0。(1.1,1.3,1.0)就是一個基線。
2)代表文檔的一個穩定狀態。比如有一個項目設計文檔,當設計基本完成,開發即將開始的時候,需要把這個文檔固定下來,內容不能再頻繁改變,否則開發人員就無所適從了,可能導致每個人所參照的文檔並不是同一個文檔。一個文檔如果經過討論被通過了,被固定了,就可以說這個文檔被「基線化」了,然後所有人就可以在這個「基線」的基礎上工作。
基線是項目儲存庫中每個工件版本在特定時期的一個「快照」。它提供一個正式標準,隨後的工作基於此標準,並且只有經過授權後才能變更這個標準。建立一個初始基線後,以後每次對其進行的變更都將記錄為一個差值,直到建成下一個基線。
KNNBaseline的官方說明class surprise.prediction_algorithms.knns.KNNBaseline
KNNBaseline算法在電影推薦的應用例子from __future__ import (absolute_import, division, print_function, unicode_literals)
import os
import io
from surprise import KNNBaseline
from surprise import Dataset,Reader
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S')
def getSimModle():
# Load the movielens‐100k dataset
file_path = os.path.expanduser('./u.data')
# 告訴文本閱讀器,文本的格式是怎麼樣的
#定義一個Reader對象來解析文件或數據框
reader = Reader(line_format='user item rating timestamp', sep='\t')
#從用戶文件加載數據文件
data = Dataset.load_from_file(file_path, reader)
#獲取訓練集,這裡取數據集全部數據
trainset = data.build_full_trainset()
#使用pearson_baseline方式計算相似度 False以item為基準計算相似度 本例為電影之間的相似度
# Surprise中基於近鄰的方法(協同過濾)可以設定不同的度量準則。具體如下:
# 1:cosine 用戶(items)之間的cosine相似度
# 2:msd 用戶(items)之間的均方差誤差
# 3:pearson 用戶(items)之間的皮爾遜相關係數
# 4:pearson_baseline 計算用戶(item)之間的(縮小的)皮爾遜相關係數,使用基準值進行居中而不是平均值。
sim_options = {'name': 'pearson_baseline', 'user_based': False}
bsl_options = {'method': 'als', #sgd 隨機梯度下降法 #als交替最小二乘法
'n_epochs': 20,
}
#使用KNNBaseline算法
#一種基本的協同過濾算法
# k(int):要考慮的(最大)鄰居數聚合。默認為40個
# min_k(int):他要考慮的鄰居的最少數量聚合,如果沒有足夠的鄰居聚合,設置為零(因此預測結果相當於基線)。默認值為「1」。
# sim_options:相似性度量的選項字典
# bsl_options:基線估計的選項字典計算
algo = KNNBaseline(40,1,sim_options=sim_options,bsl_options=bsl_options)
#訓練模型
algo.fit(trainset)
return algo
# 獲取id到name的互相映射 步驟:2
def read_item_names():
"""
獲取電影名到電影id 和 電影id到電影名的映射
"""
#os.path.expanduser(path) 把path中包含的"~"和"~user"轉換成用戶目錄
file_name = (os.path.expanduser('.') +'/u.item')
rid_to_name = {}
name_to_rid = {}
with io.open(file_name, 'r', encoding='ISO-8859-1') as f:
for line in f:
line = line.split('|')
rid_to_name[line[0]] = line[1]
name_to_rid[line[1]] = line[0]
return rid_to_name, name_to_rid
# 基於之前訓練的模型 進行相關電影的推薦 步驟:3
def showSimilarMovies(algo, rid_to_name, name_to_rid):
# 獲得電影Toy Story (1995)的raw_id
toy_story_raw_id = name_to_rid['Beauty and the Beast (1991)'] #Beauty and the Beast(1991) 或 Toy Story (1995)
logging.debug('raw_id=' + toy_story_raw_id)
#把電影的raw_id轉換為模型的內部id
toy_story_inner_id = algo.trainset.to_inner_iid(toy_story_raw_id)
#將信息列印到控制臺上
logging.debug('inner_id=' + str(toy_story_inner_id))
#通過模型獲取推薦電影 這裡設置的是10部
toy_story_neighbors = algo.get_neighbors(toy_story_inner_id, 10)
logging.debug('neighbors_ids=' + str(toy_story_neighbors))
#模型內部id轉換為實際電影id
#列表表達式
neighbors_raw_ids = [algo.trainset.to_raw_iid(inner_id) for inner_id in toy_story_neighbors]
#通過電影id列表 或得電影推薦列表
neighbors_movies = [rid_to_name[raw_id] for raw_id in neighbors_raw_ids]
print('The 10 nearest neighbors of Toy Story are:')
for movie in neighbors_movies:
print(movie)
if __name__=="__main__":
# 獲取id到name的互相映射
rid_to_name, name_to_rid = read_item_names()
# 訓練推薦模型
algo = getSimModle()
##顯示相關電影
showSimilarMovies(algo, rid_to_name, name_to_rid)
運行結果:
Estimating biases using als...
Computing the pearson_baseline similarity matrix...
Done computing similarity matrix.
The 10 nearest neighbors of Toy Story are:
Lion King, The (1994)
Toy Story (1995)
Cinderella (1950)
Hunchback of Notre Dame, The (1996)
Sound of Music, The (1965)
Clueless (1995)
Aladdin (1992)
E.T. the Extra-Terrestrial (1982)
Winnie the Pooh and the Blustery Day (1968)
Ghost (1990)
關注公眾號,轉粉兒不迷路
在看點這裡好文分享給更多人↓↓