版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目錄</b></p><p> 基于Knn算法的圖書推薦系統(tǒng)I</p><p> Book recommendation system based on Knn algorithmII</p><p><b> 第1章緒論1</b></p>&l
2、t;p> 1.1應(yīng)用背景1</p><p> 1.2系統(tǒng)功能2</p><p> 1.3系統(tǒng)預(yù)覽2</p><p> 1.4系統(tǒng)特點(diǎn)1</p><p> 第2章開發(fā)環(huán)境及工具2</p><p> 2.1系統(tǒng)開發(fā)環(huán)境2</p><p> 2.2系統(tǒng)架構(gòu)模型
3、2</p><p> 2.3系統(tǒng)開發(fā)技術(shù)3</p><p> 2.3.1 R語(yǔ)言簡(jiǎn)介3</p><p> 2.3.2數(shù)據(jù)庫(kù)技術(shù)簡(jiǎn)介3</p><p> 2.3.3 Java簡(jiǎn)介4</p><p> 第3章系統(tǒng)設(shè)計(jì)與數(shù)據(jù)庫(kù)5</p><p><b> 3.1系統(tǒng)
4、設(shè)計(jì)5</b></p><p> 3.1.1 系統(tǒng)功能模塊劃分5</p><p> 3.2數(shù)據(jù)庫(kù)結(jié)構(gòu)5</p><p> 第4章 K最近鄰分類(Knn)算法介紹6</p><p> 4.1 Knn算法簡(jiǎn)介6</p><p> 4.2 算法流程6</p><p>
5、; 4.3 算法優(yōu)缺點(diǎn)7</p><p> 4.3.1 優(yōu)點(diǎn)7</p><p> 4.3.2 缺點(diǎn)7</p><p> 第5章 Knn算法在圖書推薦系統(tǒng)的實(shí)現(xiàn)8</p><p> 5.1 訓(xùn)練集數(shù)據(jù)train.data8</p><p> 5.2建立讀者-書目矩陣9</p><
6、;p> 5.3計(jì)算書目距離矩陣distance10</p><p> 5.4計(jì)算讀者和書目的關(guān)系程度10</p><p> 5.5計(jì)算用戶的推薦書目id11</p><p> 5.6 查詢推薦書目的具體信息13</p><p> 第6章 SQL Server數(shù)據(jù)庫(kù)、Java語(yǔ)言與R的組合14</p>&
7、lt;p><b> 6.1 簡(jiǎn)述14</b></p><p> 6.2 SQL Server數(shù)據(jù)庫(kù)與R語(yǔ)言14</p><p> 6.3 R語(yǔ)言與Java語(yǔ)言15</p><p><b> 參考文獻(xiàn)16</b></p><p><b> 致謝17</b>
8、;</p><p><b> 附錄18</b></p><p> 基于Knn算法的圖書推薦系統(tǒng)</p><p> 摘要:互聯(lián)網(wǎng)的出現(xiàn)和普及給用戶帶來了大量的信息,滿足了用戶在信息時(shí)代對(duì)信息的需求的同時(shí),也使得用戶在面對(duì)大量信息時(shí)無法從中獲得對(duì)自己真正有用的那部分信息,而產(chǎn)生所謂的信息超載問題,推薦系統(tǒng)就這樣應(yīng)運(yùn)而生。推薦系統(tǒng)現(xiàn)已廣泛應(yīng)用
9、于很多領(lǐng)域,其中最典型并具有良好的發(fā)展和應(yīng)用前景的領(lǐng)域就是電子商務(wù)領(lǐng)域。個(gè)性化推薦系統(tǒng)是建立在海量數(shù)據(jù)挖掘基礎(chǔ)上的一種高級(jí)商務(wù)智能平臺(tái),以幫助電子商務(wù)網(wǎng)站為其顧客購(gòu)物提供完全個(gè)性化的決策支持和信息服務(wù)。同時(shí)學(xué)術(shù)界對(duì)推薦系統(tǒng)的研究熱度一直很高,逐步形成了一門獨(dú)立的學(xué)科。</p><p> 本文介紹的推薦系統(tǒng),一方面根據(jù)學(xué)校的圖書借閱情況,構(gòu)建出基于Knn算法的圖書推薦系統(tǒng),可以解決同學(xué)們借書沒有頭緒,借不到適合自
10、己的書等等問題,另一方面實(shí)現(xiàn)了數(shù)據(jù)、算法、成果展示的分離,使得程序設(shè)計(jì)、大數(shù)據(jù)處理、前端展示的分工更加明確簡(jiǎn)潔。</p><p> 本系統(tǒng)采用了統(tǒng)計(jì)領(lǐng)域廣泛使用的R軟件,適于數(shù)據(jù)存儲(chǔ)與挖掘的SQL Server 2008,以及適用于前端展示的Java語(yǔ)言,通過三者的協(xié)調(diào)互助,共同完成推薦系統(tǒng)的數(shù)據(jù)存儲(chǔ)、挖掘以及展示工作。</p><p> 關(guān)鍵詞:推薦系統(tǒng) Knn算法 專屬推薦 大數(shù)
11、據(jù)挖掘 R軟件</p><p> Book recommendation system based on Knn algorithm</p><p> Abstract: The emergence and popularization of the Internet users to bring a great deal of information, meet
12、 the users at the same time the need for information in the information age, but also makes the user in the face of a large amount of information cannot be obtained from that part of the information they really useful, a
13、nd produce the information overload the so-called problems, recommendation system comes. Recommendation system has been widely used in many fields, among which the most typi</p><p> Recommendation system is
14、 introduced in this paper, hand according to books borrowing situation of the school, build a recommendation system based on Knn algorithm library, can solve the students borrow books have no clue, borrow not suitable fo
15、r their own books and so on, on the other hand to achieve the separation of data, algorithms, the results show that the program design, large data, processing, front-end display division more clear and concise.</p>
16、<p> This system adopts the widely used R software for statistical field, data storage and data mining in SQL Server 2008, and the application of Java language in the front display, through the coordination of th
17、e three cooperation, jointly completed recommendation system for data storage, and display the work of mining.</p><p> Key words:Recommendation system; Knn algorithm; exclusive recommendation
18、 ; large data mining ; R software</p><p><b> 緒論</b></p><p> 推薦系統(tǒng)現(xiàn)已廣泛應(yīng)用于很多領(lǐng)域,其中最典型并具有良好的發(fā)展和應(yīng)用前景的領(lǐng)域就是電子商務(wù)領(lǐng)域。個(gè)性化推薦系統(tǒng)是建立在海量數(shù)據(jù)挖掘基礎(chǔ)上的一種高級(jí)商務(wù)智能平臺(tái),以幫助電子商務(wù)網(wǎng)站為其顧客購(gòu)物提供完全個(gè)性化的決策支持和信息服務(wù)
19、。</p><p> 對(duì)于我們的圖書的大量藏書,我們已經(jīng)完全沒有那么多的時(shí)間和精力去看完所有的書來尋找自己想要得到的知識(shí),所以一個(gè)有專屬個(gè)性的、合適的推薦系統(tǒng)能給我們節(jié)約不少的時(shí)間和精力。</p><p><b> 應(yīng)用背景</b></p><p> 互聯(lián)網(wǎng)的出現(xiàn)和普及給用戶帶來了大量的信息,滿足了用戶在信息時(shí)代對(duì)信息的需求,但隨著網(wǎng)絡(luò)的
20、迅速發(fā)展而帶來的網(wǎng)上信息量的大幅增長(zhǎng),使得用戶在面對(duì)大量信息時(shí)無法從中獲得對(duì)自己真正有用的那部分信息,對(duì)信息的使用效率反而降低了,這就是所謂的信息超載問題。</p><p> 解決信息超載問題一個(gè)非常有潛力的辦法是推薦系統(tǒng) ,它是根據(jù)用戶的信息需求、興趣等,將用戶感興趣的信息、產(chǎn)品等推薦給用戶的個(gè)性化信息推薦系統(tǒng)。和搜索引擎相比推薦系統(tǒng)通過研究用戶的興趣偏好,進(jìn)行個(gè)性化計(jì)算,由系統(tǒng)發(fā)現(xiàn)用戶的興趣點(diǎn),從而引導(dǎo)用戶
21、發(fā)現(xiàn)自己的信息需求。一個(gè)好的推薦系統(tǒng)不僅能為用戶提供個(gè)性化的服務(wù),還能和用戶之間建立密切關(guān)系,讓用戶對(duì)推薦產(chǎn)生依賴。</p><p> 推薦系統(tǒng)現(xiàn)已廣泛應(yīng)用于很多領(lǐng)域,其中最典型并具有良好的發(fā)展和應(yīng)用前景的領(lǐng)域就是電子商務(wù)領(lǐng)域。同時(shí)學(xué)術(shù)界對(duì)推薦系統(tǒng)的研究熱度一直很高,逐步形成了一門獨(dú)立的學(xué)科。</p><p> 對(duì)于我們的圖書的大量藏書,我們已經(jīng)沒有那么多的時(shí)間和精力去看完所有的書來尋
22、找自己想要得到的知識(shí),所以一個(gè)有專屬個(gè)性的、合適的推薦系統(tǒng)能給我們節(jié)約不少的時(shí)間和精力。</p><p><b> 系統(tǒng)功能</b></p><p> 該系統(tǒng)的具體功能如下</p><p> 1. 根據(jù)用戶的借書證號(hào)給出專屬推薦</p><p> 2. 根據(jù)書目的主鍵值給出相關(guān)推薦</p><
23、p> 3. 推薦的書目中包含書名,作者,出版社,出版日期,索書號(hào),類型等字段</p><p> 4. 可以查詢用戶的信息,以及當(dāng)前書目的信息</p><p><b> 系統(tǒng)預(yù)覽</b></p><p> 圖1-1 系統(tǒng)主界面圖</p><p> 圖1-2 系統(tǒng)副界面圖</p><p&g
24、t;<b> 系統(tǒng)特點(diǎn)</b></p><p> 系統(tǒng)界面相對(duì)簡(jiǎn)單,適合添加到web應(yīng)用程序,作為Applet嵌入到網(wǎng)頁(yè)中,但是內(nèi)部數(shù)據(jù)的運(yùn)算量相當(dāng)大,因此可能運(yùn)行較緩慢。</p><p><b> 開發(fā)環(huán)境及工具</b></p><p><b> 2.1系統(tǒng)開發(fā)環(huán)境</b></p>
25、;<p> 服務(wù)器操作系統(tǒng):Microsoft Windows操作系統(tǒng)</p><p> 數(shù)據(jù)庫(kù):SQL Server 2008</p><p> R軟件:R 3.1.2</p><p><b> JDK:1.6</b></p><p><b> 2.2系統(tǒng)架構(gòu)模型</b>&
26、lt;/p><p> 本系統(tǒng)整體框架采用了數(shù)據(jù)存儲(chǔ)、大規(guī)模計(jì)算與前端展示相分離的新型設(shè)計(jì)模式。其中SQL Server 2008 負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)與管理,R軟件負(fù)責(zé)大規(guī)模數(shù)據(jù)計(jì)算,是系統(tǒng)的核心部分,Java端采用模型-視圖-控制器(MVC)設(shè)計(jì)模型,完成數(shù)據(jù)計(jì)算結(jié)果的展示。具體的模型設(shè)計(jì)如下圖: </p><p> 圖2-1 程序結(jié)構(gòu)圖</p><p><b&g
27、t; 2.3系統(tǒng)開發(fā)技術(shù)</b></p><p> 2.3.1 R語(yǔ)言簡(jiǎn)介</p><p> R是用于統(tǒng)計(jì)分析、繪圖的語(yǔ)言和操作環(huán)境。R是屬于GNU系統(tǒng)的一個(gè)自由、免費(fèi)、源代碼開放的軟件,它是一個(gè)用于統(tǒng)計(jì)計(jì)算和統(tǒng)計(jì)制圖的優(yōu)秀工具。</p><p> R是一套完整的數(shù)據(jù)處理、計(jì)算和制圖軟件系統(tǒng)。其功能包括:數(shù)據(jù)存儲(chǔ)和處理系統(tǒng);數(shù)組運(yùn)算工具,其向量、
28、矩陣運(yùn)算方面功能尤其強(qiáng)大;完整連貫的統(tǒng)計(jì)分析工具;優(yōu)秀的統(tǒng)計(jì)制圖功能;簡(jiǎn)便而強(qiáng)大的編程語(yǔ)言:可操縱數(shù)據(jù)的輸入和輸出,可實(shí)現(xiàn)分支、循環(huán),用戶可自定義功能。</p><p> 與其說R是一種統(tǒng)計(jì)軟件,還不如說R是一種數(shù)學(xué)計(jì)算的環(huán)境,因?yàn)镽并不是僅僅提供若干統(tǒng)計(jì)程序、使用者只需指定數(shù)據(jù)庫(kù)和若干參數(shù)便可進(jìn)行一個(gè)統(tǒng)計(jì)分析。R的思想是:它可以提供一些集成的統(tǒng)計(jì)工具,但更大量的是它提供各種數(shù)學(xué)計(jì)算、統(tǒng)計(jì)計(jì)算的函數(shù),從而使使用
29、者能靈活機(jī)動(dòng)的進(jìn)行數(shù)據(jù)分析,甚至創(chuàng)造出符合需要的新的統(tǒng)計(jì)計(jì)算方法。</p><p> 該語(yǔ)言的語(yǔ)法表面上類似 C,但在語(yǔ)義上是函數(shù)設(shè)計(jì)語(yǔ)言(functional programming language)的變種并且和Lisp以及APL有很強(qiáng)的兼容性。特別的是,它允許在“語(yǔ)言上計(jì)算”(computing on the language)。這使得它可以把表達(dá)式作為函數(shù)的輸入?yún)?shù),而這種做法對(duì)統(tǒng)計(jì)模擬和繪圖非常有用。
30、</p><p> 2.3.2數(shù)據(jù)庫(kù)技術(shù)簡(jiǎn)介</p><p> SQL Server是由Microsoft開發(fā)和推廣的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS),它最初是由Microsoft、Sybase和Ashton-Tate三家公司共同開發(fā)的,并于1988年推出了第一個(gè)OS/2版本。 SQL Server近年來不斷更新版本,1996年,Microsoft 推出了SQL Server 6.5版本
31、;1998年,SQL Server 7.0版本和用戶見面;SQL Server 2000是Microsoft公司于2000年推出的最新版本。 </p><p> SQL Server 特點(diǎn):</p><p> 1.真正的客戶機(jī)/服務(wù)器體系結(jié)構(gòu)。 </p><p> 2.圖形化用戶界面,使系統(tǒng)管理和數(shù)據(jù)庫(kù)管理更加直觀、簡(jiǎn)單。 </p><p&
32、gt; 3.豐富的編程接口工具,為用戶進(jìn)行程序設(shè)計(jì)提供了更大的選擇余地。 </p><p> 4.SQL Server與Windows NT完全集成,利用了NT的許多功能,如發(fā)送和接受消息,管理登錄安全性等。SQL Server也可以很好地與Microsoft BackOffice產(chǎn)品集成。 </p><p> 5.具有很好的伸縮性,可跨越從運(yùn)行Windows 95/98的電腦到運(yùn)行
33、Windows 2000的大型多處理器等多種平臺(tái)使用。 </p><p> 6.對(duì)Web技術(shù)的支持,使用戶能夠很容易地將數(shù)據(jù)庫(kù)中的數(shù)據(jù)發(fā)布到Web頁(yè)面上。 </p><p> 7.SQL Server提供數(shù)據(jù)倉(cāng)庫(kù)功能,這個(gè)功能只在Oracle和其他更昂貴的DBMS中才有。</p><p> 2.3.3 Java簡(jiǎn)介</p><p>
34、Java是由Sun Microsystems公司推出的Java面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言(以下簡(jiǎn)稱Java語(yǔ)言)和Java平臺(tái)的總稱。由James Gosling和同事們共同研發(fā),并在1995年正式推出。Java最初被稱為Oak,是1991年為消費(fèi)類電子產(chǎn)品的嵌入式芯片而設(shè)計(jì)的。1995年更名為Java,并重新設(shè)計(jì)用于開發(fā)Internet應(yīng)用程序。用Java實(shí)現(xiàn)的Hot Java瀏覽器(支持Java applet)顯示了Java的魅力:跨平臺(tái)
35、、動(dòng)態(tài)Web、Internet計(jì)算。從此,Java被廣泛接受并推動(dòng)了Web的迅速發(fā)展,常用的瀏覽器均支持Java applet。另一方面,Java技術(shù)也不斷更新。Java自面世后就非常流行,發(fā)展迅速,對(duì)C++語(yǔ)言形成有力沖擊。在全球云計(jì)算和移動(dòng)互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,Java更具備了顯著優(yōu)勢(shì)和廣闊前景。2010年Oracle公司收購(gòu)Sun Microsystems。Java是一種可以撰寫跨平臺(tái)應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。</p&
36、gt;<p> Java 技術(shù)具有卓越的通用性、高效性、平臺(tái)移植性和安全性,廣泛應(yīng)用于個(gè)人PC、數(shù)據(jù)中心、游戲控制臺(tái)、科學(xué)超級(jí)計(jì)算機(jī)、移動(dòng)電話和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開發(fā)者專業(yè)社群。</p><p><b> 系統(tǒng)設(shè)計(jì)與數(shù)據(jù)庫(kù)</b></p><p><b> 3.1系統(tǒng)設(shè)計(jì)</b></p><p>
37、; 3.1.1 系統(tǒng)功能模塊劃分</p><p> 1. 用戶借書證號(hào)的查詢:包括個(gè)人信息以及推薦書目(專屬推薦)。</p><p> 2. 書目編號(hào)查詢:包括本書的相關(guān)信息以及關(guān)于本書的推薦。 </p><p><b> 3.2數(shù)據(jù)庫(kù)結(jié)構(gòu)</b></p><p> 歷史數(shù)據(jù)來源于華北科技學(xué)院圖書館,數(shù)據(jù)處理中
38、需要的表有流通日志表、讀者信息表、書目信息表,詳細(xì)字段含義如下:</p><p> 表3-1 流通日志表</p><p> 表4-2 讀者信息表</p><p> 表4-2 書目信息表</p><p> 第4章 K最近鄰分類(Knn)算法介紹</p><p> 4.1 Knn算法簡(jiǎn)介</p>
39、;<p> 鄰近算法,或者說K最近鄰(Knn,k-NearestNeighbor)分類算法是數(shù)據(jù)挖掘分類技術(shù)中最簡(jiǎn)單的方法之一。所謂K最近鄰,就是k個(gè)最近的鄰居的意思,說的是每個(gè)樣本都可以用它最接近的k個(gè)鄰居來代表。</p><p> Knn算法的核心思想是如果一個(gè)樣本在特征空間中的k個(gè)最相鄰的樣本中的大多數(shù)屬于某一個(gè)類別,則該樣本也屬于這個(gè)類別,并具有這個(gè)類別上樣本的特性。該方法在確定分類決策
40、上只依據(jù)最鄰近的一個(gè)或者幾個(gè)樣本的類別來決定待分樣本所屬的類別。 kNN方法在類別決策時(shí),只與極少量的相鄰樣本有關(guān)。由于Knn方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對(duì)于類域的交叉或重疊較多的待分樣本集來說,Knn方法較其他方法更為適合。</p><p><b> 4.2 算法流程</b></p><p> 1. 準(zhǔn)備數(shù)據(jù),對(duì)數(shù)
41、據(jù)進(jìn)行預(yù)處理</p><p> 2. 選用合適的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)訓(xùn)練數(shù)據(jù)和測(cè)試元組</p><p> 3. 設(shè)定參數(shù),如k</p><p> 4.維護(hù)一個(gè)大小為k的的按距離由大到小的優(yōu)先級(jí)隊(duì)列,用于存儲(chǔ)最近鄰訓(xùn)練元組。隨機(jī)從訓(xùn)練元組中選取k個(gè)元組作為初始的最近鄰元組,分別計(jì)算測(cè)試元組到這k個(gè)元組的距離,將訓(xùn)練元組標(biāo)號(hào)和距離存入優(yōu)先級(jí)隊(duì)列</p>&l
42、t;p> 5. 遍歷訓(xùn)練元組集,計(jì)算當(dāng)前訓(xùn)練元組與測(cè)試元組的距離,將所得距離L 與優(yōu)先級(jí)隊(duì)列中的最大距離Lmax</p><p> 6. 進(jìn)行比較。若L>=Lmax,則舍棄該元組,遍歷下一個(gè)元組。若L < Lmax,刪除優(yōu)先級(jí)隊(duì)列中最大距離的元組,將當(dāng)前訓(xùn)練元組存入優(yōu)先級(jí)隊(duì)列。</p><p> 7. 遍歷完畢,計(jì)算優(yōu)先級(jí)隊(duì)列中k 個(gè)元組的多數(shù)類,并將其作為測(cè)試元組
43、的類別。</p><p> 8. 測(cè)試元組集測(cè)試完畢后計(jì)算誤差率,繼續(xù)設(shè)定不同的k值重新進(jìn)行訓(xùn)練,最后取誤差率最小的k 值。</p><p><b> 4.3 算法優(yōu)缺點(diǎn)</b></p><p><b> 4.3.1 優(yōu)點(diǎn)</b></p><p> 1.簡(jiǎn)單,易于理解,易于實(shí)現(xiàn),無需估計(jì)參數(shù)
44、,無需訓(xùn)練。</p><p> 2. 適合對(duì)稀有事件進(jìn)行分類。</p><p> 3.特別適合于多分類問題(multi-modal,對(duì)象具有多個(gè)類別標(biāo)簽), kNN比SVM的表現(xiàn)要好。</p><p><b> 4.3.2 缺點(diǎn)</b></p><p> 該算法在分類時(shí)有個(gè)主要的不足是,當(dāng)樣本不平衡時(shí),如一個(gè)類的
45、樣本容量很大,而其他類樣本容量很小時(shí),有可能導(dǎo)致當(dāng)輸入一個(gè)新樣本時(shí),該樣本的K個(gè)鄰居中大容量類的樣本占多數(shù)。 該算法只計(jì)算“最近的”鄰居樣本,某一類的樣本數(shù)量很大,那么或者這類樣本并不接近目標(biāo)樣本,或者這類樣本很靠近目標(biāo)樣本。無論怎樣,數(shù)量并不能影響運(yùn)行結(jié)果。</p><p> 該方法的另一個(gè)不足之處是計(jì)算量較大,因?yàn)閷?duì)每一個(gè)待分類的文本都要計(jì)算它到全體已知樣本的距離,才能求得它的K個(gè)最近鄰點(diǎn)。</p&g
46、t;<p> 第5章 Knn算法在圖書推薦系統(tǒng)的實(shí)現(xiàn)</p><p> 5.1 訓(xùn)練集數(shù)據(jù)train.data</p><p> 以表5-1所示的華北科技學(xué)院圖書借閱記錄的用戶借閱行為,作為推薦系統(tǒng)的訓(xùn)練集數(shù)據(jù)。</p><p><b> 表5-1 數(shù)據(jù)集</b></p><p> 其中read
47、erNum(讀者編號(hào))和keyNum(書目主鍵)是相關(guān)性計(jì)算的主要數(shù)據(jù)依據(jù)。下面將上述數(shù)據(jù)通過SQL Server 2008數(shù)據(jù)庫(kù)讀取到R軟件中,然后存放于train.data數(shù)據(jù)框中,具體代碼如下:</p><p> library(RODBC)</p><p> odbcDataSources()</p><p> conn=odbcConnect(&qu
48、ot;library")</p><p> sql="select readerNum,keyNum from comLog"</p><p> train.data=sqlQuery(conn,sql)</p><p> names(train.data)=c("reader","book"
49、;)</p><p> odbcClose(conn)</p><p> 其中,前3行樣本數(shù)據(jù)如下所示:</p><p> train.data[1:3,]</p><p> reader book</p><p> 1 A00000543 111510</p><p> 2
50、A00000991 69045</p><p> 3 A00000991 82879</p><p> 5.2建立讀者-書目矩陣</p><p> 現(xiàn)在要把常規(guī)的train.data 形式的矩陣轉(zhuǎn)換為列代表不同書目,行代表不同讀者,內(nèi)部代表是否進(jìn)行過借閱的矩陣,即每列代表某一本書被哪些讀者借閱過,每行代表每一讀者借閱過的書目。具體數(shù)據(jù)如表5-2所示:&
51、lt;/p><p> 表5-2 讀者-書目矩陣</p><p><b> 實(shí)現(xiàn)代碼如下:</b></p><p> library(reshape)</p><p> user.item.matrix=cast(train.data,reader~book,value=value,fill=0,fun.aggrega
52、te=length) </p><p> row.names(user.item.matrix)=user.item.matrix[,1] </p><p> user.item.matrix=user.item.matrix[,-1]</p><p> 這里的核心函數(shù)是reshape包里的cast函數(shù),如下代碼執(zhí)行后會(huì)返回行代表的用戶。</p>
53、<p> user.item.matrix=cast(train.data,reader~book,value=value,fill=0,fun.aggregate=length)</p><p> 其中列代表書目(reader~book),元素內(nèi)容是value,默認(rèn)值NA自動(dòng)使用0替換(fill=0),以代表讀者沒有借入過該書目,首列數(shù)據(jù)(reader)是代表用戶的讀者編號(hào),</p>
54、<p> 首列數(shù)據(jù)是代表書目的鍵值編號(hào)。</p><p> 5.3計(jì)算書目距離矩陣distance</p><p> 這里使用書目之間的相關(guān)性系數(shù)來間接計(jì)算書目的距離矩陣。例如,user.item.matrix矩陣中的第1列和第3列分別代表書目669和書目8200被用戶借閱的情況,其相關(guān)性系數(shù)的計(jì)算方式代碼如下:</p><p> sim_co
55、r=cor(user.item.matrix[,1] , user.item.matrix[,3]);</p><p> sim_cor的取值范圍是[-1,1]這里使用如下規(guī)則把sim_cor轉(zhuǎn)換為distance</p><p> 1. 當(dāng)sim_cor的取值為-1時(shí),distance=inf無限大</p><p> 2. 當(dāng)sim_cor的取值為1是,di
56、stance=0</p><p> 具體計(jì)算實(shí)現(xiàn)的方式代碼如下:</p><p> distance=-log((sim_cor/2)+0.5)</p><p> 最后把distance矩陣的行名稱和列名稱設(shè)置為書目鍵值,以便可以在后續(xù)程序中的distance矩陣中定位出實(shí)際的視頻數(shù)據(jù)。</p><p> colnames(dista
57、nce)=colnames(user.item.matrix)</p><p> rownames(distance)=colnames(user.item.matrix)</p><p> 5.4計(jì)算讀者和書目的關(guān)系程度</p><p> 自定義的Knn.userid.item函數(shù)是算法的核心,它主要計(jì)算讀者reader和書目itemid的相關(guān)程度。通過di
58、stance物品間的距離矩陣,可以形象的得到一個(gè)書目二維平面分布圖。如圖5-4所示:</p><p> 圖5-1 讀者和書目的關(guān)系程度 </p><p> 其中,各個(gè)書目的分布位置由distance得出,各類點(diǎn)上的取值由讀者-書目矩陣user.item.matrix得出,分類取值0,表示未曾借閱,分類取值1表示借閱過這本書。然后根據(jù)Knn算法思想找出商品最近的K個(gè)物品,圖示中的K取值為
59、3。最后計(jì)算書目取值只和,并除以K,從而代表讀者reader和書目book之間的關(guān)系。代碼如下:</p><p> knn.userid.item=function(userid,itemid,user.item.matrix,distance,k=25){</p><p> item.index=which(rownames(distance)==as.character(itemi
60、d))</p><p> k.nearest.item.index=order(distance[item.index,])[2:(k+1)]</p><p> k.nearest.itemid=as.numeric(rownames(distance)[k.nearest.item.index])</p><p> sum(user.item.matrix[
61、as.character(userid),as.character(k.nearest.itemid)])/k</p><p><b> }</b></p><p> 下面通過distance書目距離矩陣找到與itemid距離最近的K個(gè)物品:</p><p> 1. 查找名稱是itemid的物品在distance的序列號(hào)item.inde
62、x。代碼如下:</p><p> item.index=which(rownames(distance)==as.character(itemid))</p><p> 2. 如果order(<向量a>)可以返回向量a的取值由小到大排序后元素的序列號(hào)信息,則語(yǔ)句如下:</p><p> k.nearest.item.index=order(dist
63、ance[item.index,])[2:(k+1)]</p><p> 上述語(yǔ)句可以返回distance[item.index,]中最小的第2至k+1元素的序列號(hào)。這里由于distance與itemid距離最近的書目還是itemid,所以這里取第2至k+1元素。</p><p> 3. 使用k.nearest.index反查出物品id,代碼如下</p><p>
64、; k.nearest.itemid=as.numeric(rownames(distance)[k.nearest.item.index])</p><p> 4. 使用讀者-書目距離矩陣user.item.matrix來計(jì)算距離最近的K個(gè)物品有多少個(gè)被借閱,再除以K得到一個(gè)處于[0,1]之間的數(shù)據(jù),用以表明讀者和書目的關(guān)系,代碼如下所示:</p><p> sum(user.it
65、em.matrix[as.character(userid),as.character(k.nearest.itemid)])/k</p><p> 5.5計(jì)算用戶的推薦書目id</p><p> 使用自定義的核心函數(shù)knn.userid.item,可以計(jì)算用戶userid與所有的商品的關(guān)系數(shù)據(jù),并可以取關(guān)系最大的書目,作為該用戶的推薦書目。該過程實(shí)際上就是在上述</p>
66、<p> 書目平面分布圖中,查找周圍書目與之最近的k個(gè)物品中取值為1的最多的書目。</p><p> 例如在圖5-2中,取值為零的書目,周圍的k個(gè)物品的分類取值1占多數(shù),所以它就被作為一款推薦書目。</p><p> 圖5-2 用戶推薦書目示意圖 </p><p> 該過程涉及的代碼如下:</p><p> knn.it
67、embase=function(userid,user.item.matrix,distance,k=25,return.item.num=10){</p><p> knn.userid=0</p><p> for(i in 1:nrow(distance)){</p><p> knn.userid[i]=knn.userid.item(userid,r
68、ownames(distance)[i],user.item.matrix,distance,k=k)</p><p><b> }</b></p><p> return.itemid=rownames(distance)[order(knn.userid,decreasing=T)] return.itemid=setdiff(return.itemid,c
69、olnames(user.item.matrix)[which(user.item.matrix[as.character(userid),]!=1)])</p><p> return.itemid[1:return.item.num]</p><p><b> }</b></p><p> 代碼中的knn.userid用于存儲(chǔ)用戶us
70、erid和所有書目的關(guān)系數(shù)據(jù),然后依據(jù)knn.userid取值由大到小的順序進(jìn)行排序,然后返回其編號(hào)。代碼如下</p><p> return.itemid=rownames(distance)[order(knn.userid,decreasing=T)] </p><p> 然后使用如下語(yǔ)句找到已被用戶收藏的書目的itemid:</p><p> col
71、names(user.item.matrix)[which(user.item.matrix[as.character(userid),] !=1)]</p><p> 再?gòu)纳厦娴膔eturn.itemid中提取出已經(jīng)借閱過的書目的信息。代碼如下:</p><p> return.itemid=setdiff(return.itemid,colnames(user.item.matri
72、x)[which(user.item.matrix[as.character(userid),]!=1)])</p><p> 最后依據(jù)推薦書目數(shù),來返回最后為用戶userid推薦的return.itemid個(gè)書目itemid。</p><p> 5.6 查詢推薦書目的具體信息</p><p> 根據(jù)上述步驟計(jì)算出的用戶推薦書目id,在數(shù)據(jù)庫(kù)中查找出推薦書目的
73、具體信息,返回給用戶,給用戶提取出一些有用的信息,方便用戶對(duì)推薦書目的了解以及在圖書館的檢索。代碼如下:</p><p> recFromPerson=function(readerNum,user.item.matrix1=user.item.matrix,distance1=distance){</p><p> library(RODBC)</p><p>
74、; odbcDataSources()</p><p> conn=odbcConnect("library")</p><p><b> result=""</b></p><p> rec=knn.itembase(readerNum,user.item.matrix1,distance1,k
75、=25,return.item.num=10)</p><p> rec=na.omit(rec)#缺失值處理</p><p> for(i in 1:length(rec)){</p><p> sql.rec=paste("select * from GDLIS.book where keyNum=",rec[i])</p>
76、<p> result=rbind(result,sqlQuery(conn,sql.rec))</p><p><b> }</b></p><p> odbcClose(conn)</p><p> na.omit(result)</p><p><b> }</b>&l
77、t;/p><p> 在數(shù)據(jù)庫(kù)中返回的信息有圖書的標(biāo)題,作者,出版社,出版日期,檢索號(hào)等等信息。方便用戶對(duì)推薦書目的了解和查找。其中na.omit(result),用于去空操作。</p><p> 第6章 SQL Server數(shù)據(jù)庫(kù)、Java語(yǔ)言與R的組合</p><p><b> 6.1 簡(jiǎn)述</b></p><p>
78、 R是屬于GNU系統(tǒng)的一個(gè)自由、免費(fèi)、源代碼開放的軟件,它是一個(gè)用于統(tǒng)計(jì)計(jì)算和統(tǒng)計(jì)制圖的優(yōu)秀工具。R擁有一套完整的數(shù)據(jù)處理、計(jì)算和制圖軟件系統(tǒng)。其功能包括:數(shù)據(jù)存儲(chǔ)和處理系統(tǒng);數(shù)組運(yùn)算工具,其向量、矩陣運(yùn)算方面功能尤其強(qiáng)大;完整連貫的統(tǒng)計(jì)分析工具;優(yōu)秀的統(tǒng)計(jì)制圖功能;簡(jiǎn)便而強(qiáng)大的編程語(yǔ)言。</p><p> SQLServer數(shù)據(jù)庫(kù)提供大量數(shù)據(jù)的存儲(chǔ)以及一些復(fù)雜的數(shù)據(jù)整理合并等。</p><
79、;p> Java 技術(shù)具有卓越的通用性、高效性、平臺(tái)移植性和安全性,廣泛應(yīng)用于個(gè)人PC、數(shù)據(jù)中心、游戲控制臺(tái)、科學(xué)超級(jí)計(jì)算機(jī)、移動(dòng)電話和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開發(fā)者專業(yè)社群,同時(shí)適用于開發(fā)各種良好的圖形界面。</p><p> 而數(shù)據(jù)從存儲(chǔ)到大規(guī)模計(jì)算,再到計(jì)算結(jié)果展示,這三者的組合剛好迎合了數(shù)據(jù)的一條龍式的發(fā)展與應(yīng)用。我相信這必將是大數(shù)據(jù)時(shí)代的一個(gè)利器。</p><p>
80、 6.2 SQL Server數(shù)據(jù)庫(kù)與R語(yǔ)言</p><p> R語(yǔ)言提供了RODBC包,用于基于數(shù)據(jù)源的數(shù)據(jù)庫(kù)連接,下面一個(gè)例子簡(jiǎn)單說明數(shù)據(jù)庫(kù)的連接:</p><p> library(RODBC)</p><p> odbcDataSources()</p><p> conn=odbcConnect("library&
81、quot;)</p><p> sql="select readerNum,keyNum from comLog"</p><p> train.data=sqlQuery(conn,sql)</p><p> names(train.data)=c("reader","book")</p>
82、;<p> odbcClose(conn)</p><p> 其中conn=odbcConnect("library")用于數(shù)據(jù)源的連接,train.data=sqlQuery(conn,sql)用于數(shù)據(jù)的查詢,odbcClose(conn)用于數(shù)據(jù)源連接的關(guān)閉。</p><p> 6.3 R語(yǔ)言與Java語(yǔ)言</p><p>
83、; Java語(yǔ)言提供了R應(yīng)用的REngine.jar和RServerEngine.jar包,用于Java中使用R語(yǔ)言。下面使用簡(jiǎn)單的例子來介紹RSever的使用:</p><p> 1. 需要在R軟件中下載RServe包,然后加載包,調(diào)用函數(shù)啟動(dòng)RServe</p><p> 2. 在Java端導(dǎo)入REngine.jar和RServerEngine.jar</p>&
84、lt;p> 3. 在Java端應(yīng)用如下函數(shù)</p><p> this.rc=new RConnection();</p><p> rc.eval("source(\"H:/BCS.R\")");</p><p> String s="recResult=recFromPerson(\"&
85、quot;+readerNum+"\")";</p><p> System.out.println("讀取代碼");</p><p> rc.voidEval(s);</p><p> REXP title=rc.eval("iconv(recResult$titile, \"gbk\&q
86、uot;, \"utf-8\",\"\")");</p><p> 其中this.rc=new RConnection()用于R服務(wù)器的連接,rc.eval("source(\"H:/BCS.R\")")用于加載R代碼,rc.voidEval(s)用于在R服務(wù)器端運(yùn)行R代碼,REXP title=rc.eval("
87、;iconv(recResult$titile, \"gbk\", \"utf-8\",\"\")")用于數(shù)據(jù)的返回,其中的iconv函數(shù)用于編碼的轉(zhuǎn)換,否則可能在傳輸過程中出現(xiàn)亂碼現(xiàn)象。</p><p><b> 參考文獻(xiàn)</b></p><p> [1]王珊.數(shù)據(jù)庫(kù)與數(shù)據(jù)庫(kù)管理系統(tǒng).第1版.
88、北京:電子工業(yè)出版社,1995</p><p> [2]趙子江,王丹.數(shù)據(jù)庫(kù)原理與SQL SERVER應(yīng)用.第2版.北京:機(jī)械工業(yè)出版社,2006</p><p> [3]張丹.R的極客理想-工具篇.第1版.北京:機(jī)械工業(yè)出版社,2014</p><p> [4]李明.R語(yǔ)言與網(wǎng)站分析.第1版.北京:機(jī)械工業(yè)出版社,2014</p><p&
89、gt; [5]Yanchang Zhao. R and Data Mining Examples and Case Studies.第1版.北京:機(jī)械工業(yè)出版社,2014</p><p> [6]耿祥義,張躍平,Java大學(xué)實(shí)用教程.第3版.北京:電子工業(yè)出版社,2013</p><p><b> 致謝</b></p><p> 在本文
90、結(jié)束之際,我要特別感謝我的指導(dǎo)老師**老師。**老師學(xué)識(shí)淵博、為人真誠(chéng),他在我大學(xué)學(xué)習(xí)期間給了我許多教誨。本文從選題的確定,論文的寫作、修改到最后定稿得到了**老師的悉心指導(dǎo),提出了許多寶貴建議,而且提供了大量的書籍資料。特別是他多次主動(dòng)詢問進(jìn)程,為我指點(diǎn)迷津,幫助我開拓思路,精心點(diǎn)撥,熱忱鼓勵(lì)。他嚴(yán)肅的教學(xué)態(tài)度,嚴(yán)謹(jǐn)?shù)闹螌W(xué)精神,精益求精的工作作風(fēng)深深地感染和激勵(lì)著我,使我終身受益。在此,謹(jǐn)向**老師致以誠(chéng)摯的謝意和崇高的敬意。<
91、/p><p> 此外,感謝其他諸位老師的諄諄教導(dǎo),感謝***老師對(duì)我學(xué)習(xí)上的點(diǎn)撥。同時(shí),還要感謝在大學(xué)四年中所有幫助我的人,也要感謝在論文寫作過程中,幫助過我、并且共同奮斗四年的大學(xué)同學(xué)們,與他們的討論和他們提出的諸多建議幫助我解決了很多難題,使得論文能夠順利完成。衷心感謝我的家人。在漫長(zhǎng)的求學(xué)生涯中,我的每一份成長(zhǎng)和進(jìn)步都離不開他們的支持。</p><p> 另外,需要感謝一個(gè)素未謀面的
92、老師,也就是《R的極客理想—工具篇》的作者,張丹老師。感謝他通過郵件給予的悉心指導(dǎo)。</p><p> 最后,再次衷心地向所有在我論文寫作過程中給予過我支持、幫助與關(guān)懷的各位老師、同學(xué)、親友表以誠(chéng)摯的謝意!</p><p><b> 附錄</b></p><p><b> 1.R代碼</b></p>&
93、lt;p> library(RODBC)</p><p> odbcDataSources()</p><p> conn=odbcConnect("library")</p><p> sql="select readerNum,keyNum from comLog"</p><p>
94、 train.data=sqlQuery(conn,sql)</p><p> names(train.data)=c("reader","book")</p><p> odbcClose(conn)</p><p> train.data=train.data[1:1000,]</p><p>
95、;<b> #數(shù)據(jù)處理</b></p><p> value=rep(1,length(train.data$reader))</p><p> train.data=cbind(train.data,value)</p><p> library(reshape)</p><p> user.item.mat
96、rix=cast(train.data,reader~book,value=value,fill=0,fun.aggregate=length)#重點(diǎn)代碼</p><p> row.names(user.item.matrix)=user.item.matrix[,1] </p><p> user.item.matrix=user.item.matrix[,-1]</p&
97、gt;<p> #用book之間的相關(guān)系數(shù),計(jì)算距離矩陣</p><p> sim_cor=cor(user.item.matrix)</p><p> distance=-log((sim_cor/2)+0.5)</p><p> colnames(distance)=colnames(user.item.matrix)</p>
98、<p> rownames(distance)=colnames(user.item.matrix)</p><p> #計(jì)算用戶和物品的關(guān)系成度</p><p> knn.userid.item=function(userid,itemid,user.item.matrix,distance,k=25){</p><p> item.index
99、=which(rownames(distance)==as.character(itemid))</p><p> k.nearest.item.index=order(distance[item.index,])[2:(k+1)]</p><p> k.nearest.itemid=as.numeric(rownames(distance)[k.nearest.item.index]
100、)</p><p> sum(user.item.matrix[as.character(userid),as.character(k.nearest.itemid)])/k</p><p><b> }</b></p><p> #計(jì)算書目關(guān)系程度。。。</p><p> knn.book.item=funct
101、ion(itemid,user.item.matrix,distance,k=10){</p><p> item.index=which(rownames(distance)==as.character(itemid))</p><p> k.nearest.item.index=order(distance[item.index,])[2:(k+1)]</p><
102、;p> k.nearest.itemid=as.numeric(rownames(distance)[k.nearest.item.index])</p><p> k.nearest.itemid</p><p><b> }</b></p><p><b> #選拔最近距離</b></p>
103、<p> knn.itembase=function(userid,user.item.matrix,distance,k=25,return.item.num=10){</p><p> knn.userid=0</p><p> for(i in 1:nrow(distance)){</p><p> knn.userid[i]=knn.use
104、rid.item(userid,rownames(distance)[i],user.item.matrix,distance,k=k)</p><p><b> }</b></p><p> return.itemid=rownames(distance)[order(knn.userid,decreasing=T)]#itemid的反向查找,值得考慮(向量排序
105、之后,它的索引號(hào)是不變的)</p><p> return.itemid=setdiff(return.itemid,colnames(user.item.matrix)[which(user.item.matrix[as.character(userid),]!=1)])</p><p> return.itemid[1:return.item.num]</p><
106、;p><b> }</b></p><p><b> #熱門書籍</b></p><p> hotbook=function(){</p><p> library(RODBC)</p><p> odbcDataSources()</p><p> con
107、n=odbcConnect("library")</p><p> hotbookmsg=c()</p><p> sql.hotbookid="select keyNum,count(*)amount from comLog </p><p> group by keyNum</p><p> orde
108、r by count(*) desc"</p><p> hotbookid=sqlQuery(conn,sql.hotbookid)</p><p> for(i in 1:10){</p><p> sql.getbook=paste("select * from GDLIS.book where keyNum=",hotbo
109、okid$keyNum[i])</p><p> hotbookmsg=rbind(hotbookmsg,sqlQuery(conn,sql.getbook))</p><p><b> }</b></p><p> odbcClose(conn)</p><p> na.omit(hotbookmsg)<
110、/p><p><b> }</b></p><p><b> #根據(jù)書籍名稱推薦</b></p><p> recFromBook=function(bName,user.item.matrix,distance){</p><p> library(RODBC)</p><
111、p> odbcDataSources()</p><p> conn=odbcConnect("library")</p><p> sql.reader=paste("select * from GDLIS.book where titile='",bName,"'",sep=""
112、)</p><p> data=sqlQuery(conn,sql.reader)</p><p><b> result=""</b></p><p> rec=knn.book.item(data$keyNum,user.item.matrix,distance,k=10)</p><p>
113、 rec=na.omit(rec)#缺失值處理</p><p> for(i in 1:length(rec)){</p><p> sql.rec=paste("select * from GDLIS.book where keyNum=",rec[i])</p><p> result=rbind(result,sqlQuery(co
114、nn,sql.rec))</p><p><b> }</b></p><p> odbcClose(conn)</p><p> na.omit(result)</p><p><b> }</b></p><p><b> #根據(jù)書籍編號(hào)推薦</
115、b></p><p> recFromBookNum=function(bNum,user.item.matrix,distance){</p><p> library(RODBC)</p><p> odbcDataSources()</p><p> conn=odbcConnect("library"
116、)</p><p><b> result=""</b></p><p> rec=knn.book.item(bNum,user.item.matrix,distance,k=10)</p><p> rec=na.omit(rec)#缺失值處理</p><p> for(i in 1:le
117、ngth(rec)){</p><p> sql.rec=paste("select * from GDLIS.book where keyNum=",rec[i])</p><p> result=rbind(result,sqlQuery(conn,sql.rec))</p><p><b> }</b></
118、p><p> odbcClose(conn)</p><p> na.omit(result)</p><p><b> }</b></p><p><b> #書目信息查詢</b></p><p> BookMsg=function(bookNum){</p&g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)設(shè)計(jì)---基于uml的圖書管理系統(tǒng)
- 畢業(yè)設(shè)計(jì)---圖書銷售系統(tǒng)
- 基于java的圖書館管理系統(tǒng)畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)----基于java的圖書館管理系統(tǒng)
- 基于java的圖書館管理系統(tǒng)畢業(yè)設(shè)計(jì)
- 基于KNN算法的文本分類系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于java的圖書館管理系統(tǒng).畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)----基于java的圖書館管理系統(tǒng)
- 畢業(yè)設(shè)計(jì)----圖書管理系統(tǒng)的設(shè)計(jì)
- 基于用戶評(píng)論的圖書推薦算法研究.pdf
- 畢業(yè)設(shè)計(jì)--圖書管理系統(tǒng)
- 圖書管理系統(tǒng) 畢業(yè)設(shè)計(jì)
- 圖書管理系統(tǒng)畢業(yè)設(shè)計(jì)
- 圖書借閱管理系統(tǒng)畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)---圖書管理系統(tǒng)
- 圖書管理系統(tǒng)畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)-----圖書管理系統(tǒng)
- 圖書借閱管理系統(tǒng)畢業(yè)設(shè)計(jì)
- 圖書管理系統(tǒng)畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)----圖書管理系統(tǒng)
評(píng)論
0/150
提交評(píng)論