天天最資訊丨幫師妹開(kāi)發(fā)一個(gè)系統(tǒng)過(guò)濾小程序
項(xiàng)目介紹
本期介紹一個(gè)基于協(xié)同過(guò)濾算法的商品推薦系統(tǒng),主要包括以下功能
(資料圖片僅供參考)
后臺(tái)管理系統(tǒng)功能:
后臺(tái)登錄
獲取微信小程序登錄的用戶(hù)信息
配置上架商品的屬性,分類(lèi),價(jià)格
獲取用戶(hù)在小程序端下的訂單列表
個(gè)人用戶(hù)配置,賬號(hào)修改;
微信小程序功能:
用戶(hù)授權(quán)實(shí)現(xiàn)微信登陸
首頁(yè)展示商品輪播圖+商品列表
商品詳情頁(yè),獲取商品詳細(xì)sku
一鍵加入購(gòu)物車(chē),直接購(gòu)買(mǎi)
維護(hù)用戶(hù)的收獲地址
訂單列表;
全部訂單,待收貨,確認(rèn)收貨,退貨
用戶(hù)微信授權(quán)登錄后,根據(jù)每個(gè)用戶(hù)收藏的商品數(shù)據(jù),根據(jù)算法,找到有相似收藏愛(ài)好的用戶(hù),已推薦相應(yīng)額商品。為了更方便大家的理解,如下圖:
該系統(tǒng)為每一個(gè)用戶(hù)都分配了一個(gè)用戶(hù)賬號(hào),用戶(hù)通過(guò)賬號(hào)的登錄可以在系統(tǒng)中查看商品推薦信息及對(duì)個(gè)人信息進(jìn)行修改等功能。
系統(tǒng)截圖
不止這些,基于協(xié)同過(guò)濾開(kāi)發(fā)了很多的系統(tǒng):
現(xiàn)在對(duì)著算法的開(kāi)發(fā)的思路還是比較成熟的,更多系統(tǒng)基于推薦算法功能的更新需求,或者系統(tǒng)開(kāi)發(fā),可以私信評(píng)論區(qū)留言哦
協(xié)同過(guò)濾算法簡(jiǎn)介
協(xié)同過(guò)濾算法是一種基于用戶(hù)行為數(shù)據(jù)的推薦算法,其基本思想是通過(guò)分析用戶(hù)行為數(shù)據(jù),找到不同用戶(hù)之間的相似性,從而預(yù)測(cè)用戶(hù)對(duì)未知物品的評(píng)分或偏好,從而給用戶(hù)提供個(gè)性化推薦。
協(xié)同過(guò)濾算法分為兩種:基于用戶(hù)的協(xié)同過(guò)濾和基于物品的協(xié)同過(guò)濾。
基于用戶(hù)的協(xié)同過(guò)濾基于用戶(hù)的協(xié)同過(guò)濾算法是通過(guò)分析用戶(hù)的歷史行為數(shù)據(jù),找到與目標(biāo)用戶(hù)行為相似的其他用戶(hù),從而推薦目標(biāo)用戶(hù)可能感興趣的物品。
具體步驟如下:
計(jì)算用戶(hù)之間的相似度,如皮爾遜相關(guān)系數(shù)、余弦相似度等。找到與目標(biāo)用戶(hù)相似度最高的K個(gè)用戶(hù)。綜合K個(gè)用戶(hù)對(duì)某個(gè)物品的評(píng)分,預(yù)測(cè)目標(biāo)用戶(hù)對(duì)該物品的評(píng)分或偏好。推薦目標(biāo)用戶(hù)評(píng)分最高的N個(gè)物品。協(xié)同過(guò)濾算法的優(yōu)點(diǎn)是可以處理任何類(lèi)型的物品和用戶(hù)行為,同時(shí)還可以提供高度個(gè)性化的推薦。但是,它也存在一些問(wèn)題,如數(shù)據(jù)稀疏性、冷啟動(dòng)問(wèn)題、可擴(kuò)展性等。因此,在實(shí)際應(yīng)用中需要根據(jù)具體情況進(jìn)行優(yōu)化和改進(jìn)。
皮爾森(pearson)相關(guān)系數(shù)公式
皮爾森相關(guān)系數(shù)是用來(lái)衡量變量之間的線性相關(guān)性。但是有一個(gè)明顯的缺陷就是,它只對(duì)線性關(guān)系敏感。如果關(guān)系是非線性的,哪怕兩個(gè)變量之間是一一對(duì)應(yīng)的關(guān)系,皮爾森相關(guān)系數(shù)也可能接近0.
如果有兩個(gè)變量:X、Y,最終計(jì)算出的相關(guān)系數(shù)的含義可以有如下理解:
(1)、當(dāng)相關(guān)系數(shù)為0時(shí),X和Y兩變量無(wú)關(guān)系。
(2)、當(dāng)X的值增大(減小),Y值增大(減?。瑑蓚€(gè)變量為正相關(guān),相關(guān)系數(shù)在0.00與1.00之間。
(3)、當(dāng)X的值增大(減?。?,Y值減?。ㄔ龃螅?,兩個(gè)變量為負(fù)相關(guān),相關(guān)系數(shù)在-1.00與0.00之間。
通常情況下通過(guò)以下取值范圍判斷變量的相關(guān)強(qiáng)度:
相關(guān)系數(shù) 0.8-1.0 極強(qiáng)相關(guān)
0.6-0.8 強(qiáng)相關(guān)
0.4-0.6 中等程度相關(guān)
0.2-0.4 弱相關(guān)
0.0-0.2 極弱相關(guān)或無(wú)相關(guān)
公式一:
公式二:
公式三:
公式四:
Java代碼實(shí)現(xiàn)
package com.jun.entity;
/**
* @author 不會(huì)寫(xiě)文檔的程序員
*/
public class Movie implements Comparable<Movie> {
public String movieName;
public int score;
public Movie(String movieName, int score) {
this.movieName = movieName;
this.score = score;
}
@Override
public String toString() {
return "Movie{" +
"movieName="" + movieName + "\"" +
", score=" + score +
"}";
}
@Override
public int compareTo(Movie o) {
return score > o.score ? -1 : 1;
}
}
package com.jun.entity;
import java.util.ArrayList;
import java.util.List;
/**
* @author 不會(huì)寫(xiě)文檔的程序員
*/
public class User {
public String username;
public List<Movie> movieList = new ArrayList<>();
public User() {}
public User(String username) {
this.username = username;
}
public User set(String movieName, int score) {
this.movieList.add(new Movie(movieName, score));
return this;
}
public Movie find(String movieName) {
for (Movie movie : movieList) {
if (movie.movieName.equals(username)) {
return movie;
}
}
return null;
}
@Override
public String toString() {
return "User{" +
"username="" + username + "\"" +
"}";
}
}
Recommend邏輯計(jì)算類(lèi):
/**
* 計(jì)算2個(gè)打分序列間的pearson距離
* 選擇公式四進(jìn)行計(jì)算
* @param rating1
* @param rating2
* @return
*/
private double pearson_dis(List<Movie> rating1, List<Movie> rating2) {
int n=rating1.size();
List<Integer> rating1ScoreCollect = rating1.stream().map(A -> A.score).collect(Collectors.toList());
List<Integer> rating2ScoreCollect = rating2.stream().map(A -> A.score).collect(Collectors.toList());
double Ex= rating1ScoreCollect.stream().mapToDouble(x->x).sum();
double Ey= rating2ScoreCollect.stream().mapToDouble(y->y).sum();
double Ex2=rating1ScoreCollect.stream().mapToDouble(x->Math.pow(x,2)).sum();
double Ey2=rating2ScoreCollect.stream().mapToDouble(y->Math.pow(y,2)).sum();
double Exy= IntStream.range(0,n).mapToDouble(i->rating1ScoreCollect.get(i)*rating2ScoreCollect.get(i)).sum();
double numerator=Exy-Ex*Ey/n;
double denominator=Math.sqrt((Ex2-Math.pow(Ex,2)/n)*(Ey2-Math.pow(Ey,2)/n));
if (denominator==0) return 0.0;
return numerator/denominator;
}
public List<Movie> recommend(String username, List<User> users) {
//找到最近鄰
Map<Double, String> distances = computeNearestNeighbor(username, users);
String nearest = distances.values().iterator().next();
System.out.println("最近鄰 -> " + nearest);
//找到最近鄰看過(guò),但是我們沒(méi)看過(guò)的電影,計(jì)算推薦
User neighborRatings = new User();
for (User user:users) {
if (nearest.equals(user.username)) {
neighborRatings = user;
}
}
System.out.println("最近鄰看過(guò)的電影 -> " + neighborRatings.movieList);
User userRatings = new User();
for (User user:users) {
if (username.equals(user.username)) {
userRatings = user;
}
}
System.out.println("用戶(hù)看過(guò)的電影 -> " + userRatings.movieList);
//根據(jù)自己和鄰居的電影計(jì)算推薦的電影
List<Movie> recommendationMovies = new ArrayList<>();
for (Movie movie : neighborRatings.movieList) {
if (userRatings.find(movie.movieName) == null) {
recommendationMovies.add(movie);
}
}
Collections.sort(recommendationMovies);
return recommendationMovies;
}
}
運(yùn)行結(jié)果:
協(xié)同過(guò)濾算法的問(wèn)題分析
目前,協(xié)同過(guò)濾技術(shù)得到了廣泛應(yīng)用。但是隨著網(wǎng)站商品信息量和用戶(hù)人數(shù)的不斷攀升,網(wǎng)站的結(jié)構(gòu)也越來(lái)越復(fù)雜,如果你有需要基于協(xié)同算法開(kāi)發(fā)的需求,評(píng)論區(qū)留言呦,我們一起討論。通過(guò)對(duì)協(xié)同過(guò)濾技術(shù)以及推薦系統(tǒng)的研究,我們發(fā)現(xiàn)協(xié)同過(guò)濾技術(shù)的實(shí)現(xiàn)中存在的問(wèn)題主要有以下幾點(diǎn)。
5.1 稀疏性問(wèn)題
稀疏性問(wèn)題是推薦系統(tǒng)面臨的主要問(wèn)題。比如在一些大型電子商務(wù)購(gòu)買(mǎi)系統(tǒng),用戶(hù)購(gòu)買(mǎi)過(guò)的數(shù)量相對(duì)網(wǎng)站中商品數(shù)量可謂是冰山一角,這就導(dǎo)致了用戶(hù)評(píng)分矩陣的數(shù)據(jù)非常稀疏,進(jìn)行相似性計(jì)算耗費(fèi)會(huì)很大,也難以找到相鄰用戶(hù)數(shù)據(jù)集,從而使得推薦系統(tǒng)的推薦質(zhì)量急劇下降。
5.2 冷啟動(dòng)問(wèn)題
因?yàn)閭鹘y(tǒng)的協(xié)同過(guò)濾推薦是基于用戶(hù)/物品的相似性計(jì)算來(lái)得到目標(biāo)用戶(hù)的推薦,在一個(gè)新的項(xiàng)目首次出現(xiàn)的時(shí)候,因?yàn)闆](méi)有用戶(hù)對(duì)它作過(guò)評(píng)價(jià),因此單純的協(xié)同過(guò)濾無(wú)法對(duì)其進(jìn)行預(yù)測(cè)評(píng)分和推薦。而且,由于新項(xiàng)目出現(xiàn)早期,用戶(hù)評(píng)價(jià)較少,推薦的準(zhǔn)確性也比較差。
5.3 可擴(kuò)展性問(wèn)題
面對(duì)日益增多的數(shù)據(jù)量,算法的擴(kuò)展性問(wèn)題成為制約推薦系統(tǒng)實(shí)施的重要因素。識(shí)別“最近鄰居”算法的計(jì)算量隨著用戶(hù)和項(xiàng)的增加而大大增加,對(duì)于上百萬(wàn)的數(shù)目,通常的算法會(huì)遇到嚴(yán)重的擴(kuò)展性瓶頸問(wèn)題。
總結(jié)
協(xié)同過(guò)濾作為一種經(jīng)典的推薦算法種類(lèi),在工業(yè)界應(yīng)用廣泛,它的優(yōu)點(diǎn)很多,模型通用性強(qiáng),不需要太多對(duì)應(yīng)數(shù)據(jù)領(lǐng)域的專(zhuān)業(yè)知識(shí),工程實(shí)現(xiàn)簡(jiǎn)單,效果也不錯(cuò)。這些都是它流行的原因。
當(dāng)然,協(xié)同過(guò)濾也有些難以避免的難題,比如令人頭疼的“冷啟動(dòng)”問(wèn)題,我們沒(méi)有新用戶(hù)任何數(shù)據(jù)的時(shí)候,無(wú)法較好的為新用戶(hù)推薦物品。同時(shí)也沒(méi)有考慮情景的差異,比如根據(jù)用戶(hù)所在的場(chǎng)景和用戶(hù)當(dāng)前的情緒。當(dāng)然,也無(wú)法得到一些小眾的獨(dú)特喜好,這塊是基于內(nèi)容的推薦比較擅長(zhǎng)的,小伙伴們歡迎一起學(xué)習(xí)研究探討。
標(biāo)簽:
天天最資訊丨幫師妹開(kāi)發(fā)一個(gè)系統(tǒng)過(guò)濾小程序
熱點(diǎn)在線丨蘇州自動(dòng)駕駛第一股來(lái)了,李想1000萬(wàn)元投資賺1.38億
全新紅旗L5開(kāi)啟預(yù)訂 金葵花標(biāo)識(shí)盡顯中式豪華
高齡能不能轉(zhuǎn)行做程序員?
青島雙星董秘回復(fù):公司從2016年起實(shí)施環(huán)保搬遷和轉(zhuǎn)型升級(jí),建成了全球領(lǐng)先的“工業(yè)4.0”智能化工廠
每日動(dòng)態(tài)!午后A股市場(chǎng)全線跳水,滬指下跌23點(diǎn),5日均線能支撐得住嗎
世界熱點(diǎn)評(píng)!擴(kuò)場(chǎng)景,提覆蓋率,北京數(shù)字人民幣試點(diǎn)進(jìn)階
天天資訊:淇縣獲評(píng)全國(guó)生態(tài)旅游典型縣
- 01 環(huán)球快訊:《怪物獵人崛起》曙光怪異煉金怎么解鎖? 怪異煉金解鎖方法
- 02 【世界新視野】全球最大塔式起重機(jī)正式下線
- 03 環(huán)球頭條:【國(guó)際漫評(píng)】危險(xiǎn)的門(mén)鈴
- 04 今日看點(diǎn):小米入股4D成像雷達(dá)公司賽恩領(lǐng)動(dòng) 小米入股賽恩領(lǐng)動(dòng)
- 05 實(shí)時(shí)焦點(diǎn):美媒:數(shù)百萬(wàn)美國(guó)人開(kāi)支面臨壓力 不平等恐成美經(jīng)濟(jì)“定時(shí)炸彈”
- 06 前沿?zé)狳c(diǎn):上坤地產(chǎn)今日復(fù)牌 午盤(pán)收漲超5%
- 07 全球熱消息:梨花時(shí)節(jié)思美人,“梨渦”有什么錯(cuò)?
- 08 焦點(diǎn)快看:將在4月24日開(kāi)啟預(yù)訂 新款吉利ICON主角官圖發(fā)布
- 09 預(yù)售價(jià)為10.9萬(wàn)起 博越COOL將在4月26日上市
- 010 今日熱議:【國(guó)際漫評(píng)】擁槍教育從娃娃抓起?


