趙琳 徐明昊



摘 要: 高校社團(tuán)管理系統(tǒng)所采用的B/S方式鮮有智能推薦功能,推廣效率低,資源浪費(fèi)明顯,依賴(lài)熟人系統(tǒng)。為了克服這些問(wèn)題,應(yīng)用聚類(lèi)和KNN算法集成為元算法,并設(shè)計(jì)和實(shí)現(xiàn)了基于Django框架的智能社團(tuán)推薦系統(tǒng)。
關(guān)鍵詞: Django; 聚類(lèi); KNN算法; 社團(tuán)推薦
中圖分類(lèi)號(hào): TP277
文獻(xiàn)標(biāo)志碼: A
文章編號(hào):1007-757X(2019)06-0122-04
Abstract: There are few intelligent recommendation functions in the B/S mode used in college community management systems. The way isolated introduced by the president campus publicity results in inefficiency and obvious waste of resources. For this reason, this paper chooses clustering KNN algorithm, and designs and implements an intelligent community recommendation system based on Django framework.
Key words: Django; Python language; Clustering; KNN algorithm; Community recommendation
0?引言
社團(tuán)在大學(xué)生第二課堂成長(zhǎng)中起著重要作用。目前,高校社團(tuán)系統(tǒng)管理模式多采用B/S方式。王翠香、邵星等人[1]設(shè)計(jì)了一種基于Android 手機(jī)OS平臺(tái)的社團(tuán)管理系統(tǒng).鈕永莉、戴子?xùn)|等人[2]使用JSP技術(shù)設(shè)計(jì)了一種MVC框架的社團(tuán)管理系統(tǒng)。張明東、戴丹丹等人[3]提出了一種基于Java EE的社團(tuán)管理方案。王金龍、孫月興等人[4]實(shí)現(xiàn)了一種基于Python的社團(tuán)管理系統(tǒng)。這些系統(tǒng)通過(guò)主流技術(shù)滿足了社團(tuán)管理增、刪、改、查等基本要求,對(duì)于大學(xué)生個(gè)性化智能推薦的需求沒(méi)有涉及。
李嘉琪、李俊、李婷、付麟惠等人[5]通過(guò)為每個(gè)社團(tuán)添加類(lèi)型標(biāo)簽匹配學(xué)生用戶愛(ài)好的方法實(shí)現(xiàn)社團(tuán)推薦。該方法策略單一不能滿足多需求精準(zhǔn)推薦。石鎧、任濼錕、彭一鳴、李慧嘉等人[6]通過(guò)圖理論構(gòu)建最優(yōu)的重疊社團(tuán)結(jié)構(gòu)的方法聚類(lèi)領(lǐng)袖社團(tuán)實(shí)現(xiàn)推薦,但計(jì)算復(fù)雜度受限于特定帶寬,影響了應(yīng)用范圍。王玙、劉東蘇等人[7]提出了聯(lián)合聚類(lèi)協(xié)同過(guò)濾算法,通過(guò)提取相似用戶偏好的方法建立屬性相似性與打分相似性相結(jié)合的推薦算法,此方法用戶與社團(tuán)屬性的耦合還不高,依賴(lài)于熟人環(huán)境,對(duì)于新生群體的陌生群體應(yīng)用效果有限。
綜上所述,本文針對(duì)現(xiàn)有社團(tuán)管理系統(tǒng)智能推薦功能薄弱,著眼強(qiáng)化用戶與社團(tuán)屬性耦合,提出了一種將聚類(lèi)、kNN算法集成為元算法的Django架構(gòu)下的智能社團(tuán)推薦系統(tǒng),針對(duì)大學(xué)生群體,提高推薦效率。
1?相關(guān)技術(shù)
1.1?系統(tǒng)架構(gòu)
Django是Python web中最流行和應(yīng)用最多的輕量級(jí)開(kāi)發(fā)框架之一[9]。他是一種基于MTV模式的架構(gòu),核心包括:數(shù)據(jù)模型(ORM)映射器,請(qǐng)求路由(url分發(fā)器),視圖(請(qǐng)求響應(yīng)處理模塊)和前端模板(用戶交互)。預(yù)設(shè)的用戶系統(tǒng)、賬號(hào)管理、安全防范等系統(tǒng)功能為web開(kāi)發(fā)帶來(lái)很大方便,大量減少了代碼編寫(xiě)量,提高了各類(lèi)應(yīng)用系統(tǒng)的開(kāi)發(fā)效率,其架構(gòu)如圖1所示。
1.2?其他技術(shù)
Bootstrap是一款基于HTML、CSS、JavaScript的前端開(kāi)發(fā)框架,擁有大量完備的Web組件。Jquery封裝了JavaScript常用的功能代碼。SQLite是一款輕量級(jí)嵌入型關(guān)系數(shù)據(jù)庫(kù)。Redis數(shù)據(jù)庫(kù)是一款高性能鍵-值數(shù)據(jù)庫(kù)。
2?需求設(shè)計(jì)[8]
從本應(yīng)用的具體需求看,智能社團(tuán)推薦系統(tǒng)需要社團(tuán)發(fā)布、新生注冊(cè)、愛(ài)好交流、匹配社團(tuán)推薦、系統(tǒng)管理等5個(gè)功能需求。核心功能為根據(jù)新生的信息進(jìn)行個(gè)性社團(tuán)推薦。如圖2所示。
3?元算法
3.1?算法思想
聚類(lèi)算法是一種無(wú)監(jiān)督的學(xué)習(xí),適合在未知分類(lèi)的情況下進(jìn)行全自動(dòng)分類(lèi)。該算法試圖將相似對(duì)象歸入同一簇。
本文采用k-均值聚類(lèi)算法。其具體思想是:隨機(jī)確定未知樣本集合中k個(gè)初始點(diǎn)作為質(zhì)心。為每個(gè)點(diǎn)找距離其最近的質(zhì)心,并將每個(gè)點(diǎn)分配至所對(duì)應(yīng)的簇中。然后更新該簇所有點(diǎn)的平均值。
K鄰近算法是指存在一個(gè)樣本數(shù)據(jù)集合,且樣本集中每個(gè)數(shù)據(jù)都存在標(biāo)簽,即我們知道樣本集中每一數(shù)據(jù)與所屬分類(lèi)的對(duì)應(yīng)關(guān)系。輸入沒(méi)有標(biāo)簽的新數(shù)據(jù)后,將新數(shù)據(jù)的每個(gè)特征與樣本集中數(shù)據(jù)對(duì)應(yīng)的特征進(jìn)行比較,然后算法提取樣本集中特征最相似數(shù)據(jù)(最近鄰)的分類(lèi)標(biāo)簽。一般只選擇樣本數(shù)據(jù)集中前k個(gè)最相似的數(shù)據(jù)。出現(xiàn)次數(shù)最多的分類(lèi),作為新數(shù)據(jù)的分類(lèi)。其缺點(diǎn)在于計(jì)算未知分類(lèi)樣本時(shí)要和已知集合中每個(gè)樣本進(jìn)行距離計(jì)算,對(duì)于大樣本空間時(shí)間復(fù)雜度高。
本文將以上兩種算法集成為元算法,首先在大學(xué)新生數(shù)據(jù)集上應(yīng)用k-均值聚類(lèi)算法進(jìn)行預(yù)分類(lèi)。再在每個(gè)子類(lèi)中的新生與社團(tuán)樣本集中與該類(lèi)新生類(lèi)別相似的社團(tuán)上應(yīng)用KNN算法,降低KNN算法應(yīng)用時(shí)的樣本數(shù)量,達(dá)到提高算法效率,在不依賴(lài)熟人的情況下進(jìn)行有效推薦。
3.2?關(guān)鍵問(wèn)題
(1) 新生數(shù)據(jù)抽象。新生關(guān)鍵屬性由用戶ID,興趣愛(ài)好,投入時(shí)間組成。數(shù)據(jù)模型偽代碼如下:
模型中User對(duì)象為Django內(nèi)置對(duì)象。
(2) 社團(tuán)數(shù)據(jù)抽象,社團(tuán)屬性主要由以下字段組成如表1所示。
(3) K-均值聚類(lèi)算法[10]
本應(yīng)用中,每個(gè)類(lèi)的聚類(lèi)中心取該類(lèi)樣本的平均值。用歐式距離式如式(1)進(jìn)行聚類(lèi)中心與樣本相似性計(jì)算,以各聚類(lèi)平方和最小為聚類(lèi)目標(biāo),如式(2)。
S1:隨機(jī)選取k個(gè)新生樣本作為聚類(lèi)中心
S2:按照公式(1)計(jì)算所有新生樣本的歐式距離
S3:將每個(gè)新生分配至與其距離最近的聚類(lèi)中
S4:用聚類(lèi)中所有新生樣本的均值更新聚類(lèi)中心,按照公式(2)計(jì)算目標(biāo)函數(shù)值;
S5:根據(jù)目標(biāo)函數(shù)值判斷結(jié)束事件觸發(fā)。
(4) 距離計(jì)算
分別從新生數(shù)據(jù)模型中和社團(tuán)數(shù)據(jù)模型中建立新生三元組和社團(tuán)三元組按照公式(1),進(jìn)行距離D=新生(Hobby, Inputtime, Clusterlabel)-社團(tuán)(Hobby, Inputtime, Class)計(jì)算。
(5) 聚類(lèi)中k值確定
由于預(yù)先不知新生數(shù)據(jù)可分為幾類(lèi),因此,本文根據(jù)肘部法則對(duì)聚類(lèi)數(shù)量進(jìn)行估計(jì)。隨機(jī)選取不同專(zhuān)業(yè)新生數(shù)據(jù)中的10人進(jìn)行評(píng)估,分別對(duì)這10個(gè)同學(xué)進(jìn)行k值為1-9的分類(lèi),以平均半徑做為簇指標(biāo),不同k值與其平均半徑的關(guān)系如圖3所示。
隨著k值的增大,平均半徑的畸變程度會(huì)減小;每個(gè)類(lèi)中的學(xué)生數(shù)伴隨減少,相反,隨著k值繼續(xù)增大,平均半徑畸變程度的改善效果會(huì)不斷減低。畸變程度下降幅度最大的位置即為肘部。從圖3中可估計(jì)得k為4。
3.3?算法分析
聚類(lèi)算法中k值即為預(yù)分類(lèi)的聚類(lèi)個(gè)數(shù),本文取4,KNN算法中k值是指被測(cè)分類(lèi)樣本最近的前k個(gè)樣本的個(gè)數(shù),本文為了提供更多選擇k取12。由于通過(guò)聚類(lèi)操作進(jìn)行了預(yù)分類(lèi),因此在進(jìn)行新生社團(tuán)推薦時(shí),不需要將所有新生與社團(tuán)進(jìn)行距離計(jì)算,只在每個(gè)新生子類(lèi)并與該類(lèi)標(biāo)簽相似的社團(tuán)上進(jìn)行距離計(jì)算,從而降低了KNN算法的時(shí)間復(fù)雜度。
3.4?算法流程圖
如圖4所示。
4?系統(tǒng)設(shè)計(jì)
社團(tuán)推薦系統(tǒng)框圖如圖5所示。
5?系統(tǒng)開(kāi)發(fā)
5.1?開(kāi)發(fā)環(huán)境:
(1) 操作系統(tǒng)及主語(yǔ)言:Windows 7 64位,python 3.7.2。
(2) 系統(tǒng)框架及第三方庫(kù):Django 2.1.5,numpy 1.16.1,matplotlib 3.0.2。
(3) 前端技術(shù):JavaScript,bootstrap-3.3.7-dist,jquery-1.11.1。
(4) 后端數(shù)據(jù)庫(kù):SQLite3,Redis-x64-3.2.100。
5.2?開(kāi)發(fā)過(guò)程
(1) 建立工程:創(chuàng)建名為mysite的工程項(xiàng)目并進(jìn)行項(xiàng)目manage.py,settings.py,
urls.py等文件配置;
(2) 創(chuàng)建應(yīng)用:本項(xiàng)目共創(chuàng)建兩個(gè)應(yīng)用,即Freshmen應(yīng)用和Association應(yīng)用;
(3) 設(shè)計(jì)Modle:本項(xiàng)目分別在Freshmen和Association應(yīng)用中設(shè)計(jì)新生數(shù)據(jù)模型和社團(tuán)數(shù)據(jù)模型;
(4) 創(chuàng)建數(shù)據(jù)庫(kù):設(shè)置settings數(shù)據(jù)庫(kù)屬性,SQLite3數(shù)據(jù)庫(kù)為主主數(shù)據(jù)庫(kù)用于兩個(gè)應(yīng)用的數(shù)據(jù)存儲(chǔ),Redis數(shù)據(jù)庫(kù)用于社團(tuán)瀏覽次數(shù)的鍵值對(duì)數(shù)據(jù)存儲(chǔ);
(5) 設(shè)計(jì)前端模板:在Freshmen應(yīng)用和Association應(yīng)用中分別設(shè)計(jì)用戶管理、社團(tuán)管理、社團(tuán)瀏覽、社團(tuán)介紹、社團(tuán)推薦等前端頁(yè)面。通過(guò)bootstrap技術(shù)和query技術(shù)用于前端頁(yè)面布局、樣式設(shè)計(jì)以及數(shù)據(jù)提交等功能實(shí)現(xiàn);
(6) 視圖處理:分別在兩個(gè)應(yīng)用的Views.py文件中編寫(xiě)視圖處理函數(shù),響應(yīng)request請(qǐng)求,并進(jìn)行處理;
(7) url路由:本別在項(xiàng)目url、Freshmen應(yīng)用url和Association應(yīng)用url中分配前端頁(yè)面請(qǐng)求和處理代碼之間的映射。
6?系統(tǒng)測(cè)試
本文以某學(xué)院80名新生為例進(jìn)行測(cè)試,對(duì)這80名新生進(jìn)行統(tǒng)一注冊(cè),首先應(yīng)用k均值聚類(lèi)算法進(jìn)行預(yù)分類(lèi)(k取4),聚類(lèi)結(jié)果如圖6所示。分類(lèi)后每個(gè)新生記錄會(huì)產(chǎn)生一個(gè)類(lèi)別標(biāo)簽,用于和社團(tuán)集合中的向量進(jìn)行距離計(jì)算。
本系統(tǒng)通過(guò)該學(xué)院的50個(gè)社團(tuán)進(jìn)行測(cè)試供新生選擇。經(jīng)對(duì)新生進(jìn)行聚類(lèi)預(yù)分類(lèi)后,將每個(gè)類(lèi)別的新生與社團(tuán)集合
中相應(yīng)類(lèi)別的向量應(yīng)用KNN算法,將推薦的社團(tuán)數(shù)量降低,結(jié)果如表2所示。
本系統(tǒng)新生社團(tuán)推薦結(jié)果頁(yè)面如圖7所示。
7?總結(jié)
本文針對(duì)現(xiàn)有B/S社團(tuán)管理系統(tǒng)中智能推薦功能不足的缺點(diǎn),通過(guò)python web技術(shù)設(shè)計(jì)了一款基于Django框架的社團(tuán)推薦系統(tǒng)。并以降低歐式距離為基礎(chǔ)的KNN算法計(jì)算樣本量為目的,將k均值聚類(lèi)算法與kNN算法集成為元算法,同時(shí)彌補(bǔ)了傳統(tǒng)社團(tuán)推薦依賴(lài)于熟人系統(tǒng)的不足,擴(kuò)大了社團(tuán)推薦在新生群體的應(yīng)用范圍。經(jīng)測(cè)試,算法有效降低了計(jì)算樣本量,社團(tuán)推薦系統(tǒng)功能有效。
參考文獻(xiàn)
[1]?王翠香,邵星. 面向Android應(yīng)用的大學(xué)生社團(tuán)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J]. 國(guó)際IT傳媒品牌,2015(36):52-55.
[2]?鈕永莉,戴子?xùn)|. 基于MVC框架的高校社團(tuán)管理系統(tǒng)研究與實(shí)現(xiàn)[J].西安文理學(xué)院學(xué)報(bào)(自然科學(xué)版),2018(7):84-87.
[3]?張明東,戴丹丹. Java EE下學(xué)生信息管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 才智,2018(3):164.
[4]?王金龍,孫月興. 基于Python的高等學(xué)校社團(tuán)信息管理系統(tǒng)[J]. 數(shù)字技術(shù)與應(yīng)用,2017(8):105-107.
[5]?李嘉琪,李俊,李婷,等. 基于大數(shù)據(jù)的社團(tuán)個(gè)性化推薦系統(tǒng)[J]. 電腦知識(shí)與技術(shù),2017(13):60-71.
[6]?石鎧,任濼錕,彭一鳴,等. 基于多節(jié)點(diǎn)社團(tuán)意識(shí)系統(tǒng)的屬性圖聚類(lèi)算法[J]. 計(jì)算機(jī)科學(xué),2017(6):433-437.
[7]?王玙,劉東蘇. 基于聯(lián)合聚類(lèi)與用戶特征提取的協(xié)同過(guò)濾推薦算法[J]. 情報(bào)學(xué)報(bào),2017(8):853-858.
[8]?雷曉薇. 基于Django框架的教學(xué)管理系統(tǒng)的研究與實(shí)現(xiàn)[J]. 電子設(shè)計(jì)工程,2018(18): 39-43.
[9]?楊志慶. 基于的系統(tǒng)的開(kāi)發(fā)與實(shí)現(xiàn)[J]. 機(jī)電一體化,2013(9):70-72.
[10]?Peter Harrington,《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》[M]. 北京:人民郵電出版社,2017:187-188.
[11]?張俊暉. Django框架在web開(kāi)發(fā)中的應(yīng)用[J]. 農(nóng)業(yè)網(wǎng)絡(luò)信息,2015(2):51-52.
(收稿日期: 2018.11.23)