大數據挖掘算法——時間衰變算法

2021-02-15 校苑數模

大家或許都聽過一個故事——「遺忘曲線」。

遺忘曲線是由德國心理學家艾賓浩斯(Hermann Ebbinghaus )研究發現的,其描述了人類大腦對新事物遺忘的規律,人們可以從遺忘曲線中掌握遺忘規律並加以利用,從而提升自我記憶的能力。

人的記憶衰變過程,如圖1所示。

圖1  人的記憶衰變過程(來自百度百科)

這條曲線告訴人們在學習中的遺忘是有規律的,遺忘的進程很快,並且先快後慢。在分析用戶對電商平臺琳琅滿目的商品的興趣偏好的變化時,也可以借鑑遺忘曲線。

對於興趣和偏好這兩個概念,從不同的角度分析會有不同的定義,這裡從時間的角度分析。

興趣:對事物喜好或關切的情緒,它是參與實踐的基礎,可以看作是一個短期行為。隨著時間的推移,這種喜好也隨之變化。

偏好:具有濃厚的積極情緒,伴隨著成長過程中的主觀傾向,可以看作是一個長期行為,它是基本穩定的。

對於電商平臺來說,通過營銷活動達到的目的是關心用戶的「短期興趣」。看看用戶短期內會更傾向於購買哪些寶貝,從而更好地去做精準營銷,如簡訊、站內廣告等。

最簡單的場景,如果用戶在半年前購買過某件商品,但從此以後沒有再次對其產生過任何行為(瀏覽、收藏、加入購物車和購買),那麼用戶對於該商品的興趣衰變曲線如圖2所示。

圖2  單次行為的衰變曲線

重複行為是指用戶在半年內針對同一商品多次瀏覽、收藏、購買該商品。

令t1、t2、t3表示3次相鄰重複行為的時刻,用戶興趣度的衰變曲線如圖3所示。

圖3  用戶興趣度的衰變曲線

伴隨著每一次的行為調整新的初始衰變值和衰變速率。可以通過下面的函數表達式來進行更深入的理解。

符號說明:

表示用戶在j時刻以i行為作用k對象的次數。

表示時刻距離當前時間的天數。

表示衰減因子。

考慮到用戶會出現多次行為(這裡默認每次行為後的衰減因子一致),當前時刻對某商品的興趣總和公式如下。

最後結合Sigmoid函數對其進行歸一化,確定用戶對某商品的興趣值。

基於遺忘曲線的興趣度分析,它能夠從側面反映用戶對有過「行為」的所有商品進行的興趣排序,從而更好地進行商品推薦。

在分析用戶的商品推薦時,我們會選擇動手實踐其中的熵權重算法和時間衰變算法,最終結合業務的實際場景重新組合一個綜合模型。

1.數據源的獲取

這裡會考慮從HBase中讀取數據源,具體數據特徵會涉及用戶ID、商品類目、寶貝、行為類型、次數和操作時間。Apache HBase經過長達8年的發展,在2017年1月中旬又發布了新版本(Hbase 1.3.0),多個方面的性能也得到了提升。

為了能夠成功調用HBase的API,我們優先在Maven工程的pom.xml中添加如下代碼。

<dependency>             <groupId>org.apache.hbase</groupId>             <artifactId>hbase-client</artifactId>             <version>1.2.4</version></dependency>

註:這裡使用的是Hbase 1.2.4版本,可以在中央倉庫mvnrepository中搜索hbase-client來進行選擇。

接下來給出一個連接HBase的測試版本,檢測是否能夠成功獲取HBase中的表數據,代碼如下。

/**  * 掃描rowkey返回行數  *  * @param prefixRowKey rowkey前綴  * @return 行數  */
def getRowPrefixNum(table: Table,prefixRowKey: String): Option[Int] = {   var num = 1   try {       val scan: Scan = new Scan()       scan.setStartRow(Bytes.toBytes(prefixRowKey))       scan.setStopRow(Bytes.toBytes(prefixRowKey + "|"))       val resultScanner: ResultScanner = table.getScanner(scan)       val it = resultScanner.iterator()
      while (it.hasNext) {         it.next()         num += 1       }  resultScanner.close()  table.close()  Some(num)  } catch {
      case e: Exception => logger.error("統計行數出錯,{}",e.getMessage)       table.close()       Some(1)   }}


main運行的代碼模塊,可以檢測數據獲取流程是否正常,代碼如下。


def main(args: Array[String]): Unit = {       val conf = HBaseConfiguration.create()
      conf.set(HConstants.ZOOKEEPER_CLIENT_PORT, "埠號")
      conf.set(HConstants.ZOOKEEPER_QUORUM, "data1,data2,data3")       val connection= ConnectionFactory.createConnection(conf)       val table=connection.getTable(TableName.valueOf("t_user"))       val s=getRowPrefixNum(table,"rowkey")       println(s.getOrElse("0"))}

最後補充整個工程相關的依賴包,代碼如下。

import org.slf4j.{Logger, LoggerFactory}import org.apache.hadoop.hbase.{HBaseConfiguration, HConstants, TableName}import org.apache.hadoop.hbase.client._import org.apache.hadoop.hbase.util.Bytes

2.用戶行為權重的調整

這裡的數據輸入來源於從HBase獲取到的用戶數據。優先選擇用戶行為的數據計算出5種行為(瀏覽、點擊、收藏、加入購物車和購買)的權重值。

(1)確定算法過程中的統計指標,代碼如下。

val standDatas = rdd.map(_.split(SEPARATOR0)).map(record =>  {    var str = ""    for(i <- 1 until record.length) {
   //其中round為方法調用,保留4位有效數字      val standValue = round((record(i).toDouble+1)/       (indexMap.get(i).get._1+indexMap.get(i).get._2),4)
     str = str.concat((standValue*math.log(standValue)).toString). concat(SEPARATOR0)     }
    str.trim()  }).map(record =>      {       val arraySet = ArrayBuffer[Double]()
      for(i <- 0 until record.length) {           arraySet+=record(i).toDouble       }       arraySet       })


其中涉及的統計指標都會在後期的計算中用到,需要緩存在RDD中。

(2)確定指標的熵值,代碼如下。

val resultSet = ArrayBuffer[Double]()for(i <- 1 to featureNum) {
   val sumAndCount = standDatas.map(_.apply(i-1)).stats()    val value=div(sumAndCount.sum,-math.log(sumAndCount.count),4)    resultSet += value
}


這步主要是計算每個特徵向量的熵值大小,也是為計算最後的權重大小做準備的。

(3)確定特徵向量的權重值,代碼如下。

//確定每個特徵向量的權重值val weightSet = ArrayBuffer[Double]()for(i <- 0 until featureNum){
   weightSet+=div(resultSet.apply(i),resultSet.sum,4)
}
weightSet.toArray

最終將計算出的用戶行為權重單獨保存在緩存Cache中,為了後期做興趣衰變分析計算時可以再使用。

3.用戶興趣衰變的量化

結合上述的Hbase數據源和行為權重值,計算每個用戶的興趣衰變值,主要有以下兩個步驟。

(1)計算用戶興趣衰變值,代碼如下。

/* * @describe: 對興趣衰變的計算 * @param: behav為行為集,factor為衰變因子,weightSet為權重集 */  def decayAlgorithm(behav:String,factor:Double,weightSet:Map [String,Double]):Double={    val behavSet = behav.split("_")    val behavCategory = behavSet.apply(0)    val behavDiff = behavSet.apply(1).toDouble    val behavNum = behavSet.apply(2).toDouble    val interestValue = math.exp(-factor * behavDiff)*behavNum    behavCategory match {
     case "browse" => weightSet.get("browse").get*interestValue
     case "click" => weightSet.get("click").get*interestValue
     case "collect" => weightSet.get("collect").get*interestValue
     case "addCar" => weightSet.get("addCar").get*interestValue
     case "buy" => weightSet.get("buy").get*interestValue    }  }


在RDD中調用上述函數進行處理,計算用戶興趣隨著時間的衰變。

(2)採用Sigmoid進行歸一化處理,代碼如下。

/* * @describe: 對興趣衰變進行歸一化處理 * @param: decayValue為衰變的興趣度,factorsigmoid為歸一化參數 */  def decayRate(decayValue:Double,factorsigmoid:Double):Double = {    round(1.0/(1+math.exp(3.0-factorsigmoid*decayValue)),4)  }


上述是對用戶最終的興趣值進行歸一化的過程,得到用戶對寶貝列表的興趣排名,從而進行有針對性的推薦。和大家以往熟知的協同過濾推薦有所差異,基於用戶興趣偏好的衰變分析也可以做一定業務場景下的用戶推薦。

數據化運營中的精準推薦涉及的業務場景很多,更多時候會從多面分析用戶,甚至包括用戶畫像體系和商品畫像體系。

相關焦點

  • 淺談數據挖掘的基本概念及其最常用算法
    淺談數據挖掘的基本概念及其最常用算法 淺談數據挖掘的基本概念及其最常用算法 2020-06-04 13:47:34  來源:今日頭條很多人對大數據的基本概念和特點已經有所了解, 關鍵詞: 數據 挖掘   當前,大數據的理論和應用正在國民經濟和生活的各個領域如火如荼的進行。
  • 資料|世界著名計算機教材精選:數據挖掘十大算法(中文版)
    >《世界著名計算機教材精選:數據挖掘十大算法》詳細介紹了在實際中用途最廣、影響最大的十種數據挖掘算法,這十種算法是數據挖掘領域的頂級專家進行投票篩選的,覆蓋了分類、聚類、統計學習、關聯分析和連結分析等重要的數據挖掘研究和發展主題。
  • 資料|數據挖掘:概念、模型、方法和算法(第2版)/ 國外計算機科學...
    《數據挖掘:概念、模型、方法和算法(第2版)/國外計算機科學經典教材》介紹了通過分析高維數據空間中的海量原始數據來提取用於決策的新信息的尖端技術和方法。《數據挖掘:概念、模型、方法和算法(第2版)/國外計算機科學經典教材》開篇闡述數據挖掘原理,此後在示例的引導下詳細講解起源於統計學、機器學習、神經網絡、模糊邏輯和演化計算等學科的具有代表性的、前沿的挖掘方法和算法。書中還著重描述如何恰當地選擇方法和數據分析軟體併合理地調整參數。每章末尾附有複習題。
  • 詳解JAVA數據結構與算法:排序算法
    排序算法排序也稱排序算法(Sort Algorithm),排序是將一組數據,依指定的順序進行排列的過程。排序的分類:1) 內部排序:指將需要處理的所有數據都加載到內部存儲器中進行排序。2) 外部排序法:數據量過大,無法全部加載到內存中,需要藉助外部存儲進行排序。
  • 書評:《算法霸權》與大數據時代的正義
    進入大數據時代的今天,人們討論著「外賣騎手,困在系統裡」,也有人說「系統是死的,人是活的,希望大家多給騎手5分鐘」。之前我們分析了,現在再來冷靜地思考,與算法共生的新一代人類,如何繼續追求「正義」這一信仰。凱西•奧尼爾的《算法霸權》一書對此進行了深入探討,期待有更多人看到,建設自身的「數據素養」。
  • 走進算法:ECDSA算法如何保護你的數據(上)
    數字籤名的主要作用就是,數字籤名的主要作用就是保證了數據的有效性(驗證是誰發的)、完整性(證明信息沒有被篡改,而這是手寫籤名不具備的功能)以及抗抵賴性(人們不能否認自己發送信息的行為和內容)。一般來說,數字籤名不會對信息直接進行加密,而是選擇對信息的Hash值(Hash值是根據信息內容計算出來的一個指定長度數字,可以驗證數據傳遞的完整性)進行加密,並把加密結果附加到被籤名的信息後面。
  • SEO算法:巴郎深談石榴算法與算法對策
    前言每一套SEO算法的出臺都是在提升用戶體驗,石榴算法就是重點針對低質量廣告頁面而誕生的-SEO算法目錄( 4867 字)01.上線時間與宗旨02.石榴算法的意義03.石榴算法的誕生04.SEO從業人員如何應對石榴算法最後的話01
  • 我們到底該如何學習《數據結構與算法》
    第四:應付學業我之前大學學習這門課的時候,學分比重還是比較大的,好幾年過去了,不知道現在變沒變。不過最起碼考研或者是期末考試,這門課都是必須要學習的一門課。可見學校也比較重視。一、算法與數據結構到底是個什麼東東?
  • 靠大數據揣度觀眾心理 "算法"定能"勝算"嗎
    原標題:「算法」定能「勝算」嗎 「本來只想看個花絮,卻被不斷推送過來的短視頻『強迫』著刷完一整部劇。」近段時間以來,「熱搜式追劇」成為不少觀眾看劇的「新姿勢」。這背後,實際上是社交媒體、片方和播出方利用智能算法與觀眾口味達成的一種「共謀」。
  • 人工智慧的本質是一串算法?美國「愛奇藝」優化AI算法多賺10億!
    AI的基礎是「算法」,即計算機遵循的一組規則或指令。機器學習(ML)可以定義為「無需依賴基於規則的編程即可從數據中進行學習的算法」。網際網路基於算法運行,所有在線搜索均通過算法完成。藉助算法,電子郵件知道發去哪裡。
  • 圖的最短路徑算法-Floyd算法-弗洛伊德算法
    Floyd算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的算法 在計算機科學中,Floyd-Warshall算法是一種在具有正或負邊緣權重(但沒有負周期)的加權圖中找到最短路徑的算法。算法的單個執行將找到所有頂點對之間的最短路徑的長度(加權)。
  • 主宰全球的10大算法
    算法必須具備如下3個重要特性:有窮性,執行有限步驟後,算法必須中止。確切性,算法的每個步驟都必須確切定義。可行性,特定算法須可以在特定的時間內解決特定問題,其實,算法雖然廣泛應用在計算機領域,但卻完全源自數學。實際上,最早的數學算法可追溯到公元前1600年-Babylonians有關求因式分解和平方根的算法。
  • 陳根:算法下的選擇讓渡,你被算法裹挾了嗎?
    文/陳根相較於傳統的物理世界,新一輪信息技術的發展使一個基於網際網路、人工智慧、大數據、區塊鏈等新興科技而形成的「數字世界」正真實而具體地嵌入我們的社會生活,深刻又廣泛地影響著我們習以為常的現實世界。但不論是大數據還是人工智慧,都依託算法而存在,我們正在走進的數字世界本質上則是數據驅動的算法應用。
  • 數據加密中的DES加密算法詳解
    [摘要] 本文詳細介紹了DES數據加密算法的原理,並給出了一個例子演示了如何使用c#中的加密包進行DES算法加密,最後對DES進行了評價。常用加密算法主要用來對敏感數據、摘要、籤名等信息進行加密。按照密鑰方式劃分,可分為對稱加密算法和非對稱加密算法。一、對稱加密算法對稱加密算法有時又叫做傳統密碼算法,加密密鑰可以從解密密鑰中推導出來,解密密鑰也可以從加密密鑰中推導出來。在大多數的對稱算法中,加密密鑰和解密密鑰是相同的,因此也成為秘密密鑰算法或者單密鑰算法。
  • 論算法的法律規制
    一、問題的提出:算法崛起的法律挑戰隨著大數據與人工智慧時代的到來,算法開始呈現越來越大的影響,日益成為社會關注的問題。以往,算法更多是數學家或程式設計師所關注的對象,算法主要在數學運算或實驗室的場景下發生作用。到了大數據與人工智慧時代,算法開始在越來越多的應用場景中被用於決策或輔助決策。
  • 數據挖掘要用什麼軟體呢?商業數據挖掘案例
    所謂的數據挖掘其實就是在大量的的非結構化數據裡搜索可用的數據,並提取隱含在其中、人們事先不知道的、但又有潛在應用價值的過程。 Smartbi數據挖掘工具揭示的是未知的、將來的數據關係。數據挖掘的知識領域涵蓋了資料庫技術、統計學知識、機器學習、可視化等多學科知識的綜合應用。
  • 什麼是加密算法?
    是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法),主流程式語言普遍已有MD5實現。將數據(如漢字)運算為另一固定長度值,是雜湊算法的基礎原理,MD5的前身有MD2、MD3和MD4。MD5算法具有以下特點:1、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。2、容易計算:從原數據計算出MD5值很容易。
  • 我們需要什麼樣的「算法」?
    一些喜歡網購的人還可能因遭遇「大數據殺熟」而蒙受損失。一些平臺利用算法技術給不同類型消費者數據「畫像」,判斷其偏好、用戶黏合度、價格敏感度等,使不同用戶看到的價格或搜索的結果不同。通常是老用戶看到的價格比新用戶貴,或搜索到的結果比新用戶少。今年「雙11」期間,北京消費者韓女士發現,她通過某App預訂一家酒店,「同一時間,不同手機」預訂,價格相差約1000元。
  • 加密類型:5種加密算法以及如何選擇正確的算法
    加密是一種將數據轉換為無法解密的格式,以便只有授權方才能訪問信息的方法。加密密鑰與加密算法一起使加密過程成為可能。並且,基於這些密鑰的應用方式,主要主要使用兩種類型的加密方法:「對稱加密」和「非對稱加密」。這兩種方法都使用不同的數學算法(即我們剛才提到的那些加密算法)對數據進行加密。常見的加密算法列表包括RSA,ECC,3DES,AES等。
  • 算法世界給不了你真實溫暖的生活
    然而這兩種想像的前提,在今天似乎都已經以一種不那麼極端的形式呈現出來了:在全球變暖、資源枯竭的大環境下,一場席捲全球的流行病讓本就分歧不斷的各國都傷亡慘重,人人自危;與此同時,大數據技術無處不在,手機、平板、電腦早已成為了現代人的外接大腦 —- 我們已經身處在一個幾乎人人都是賽博格的時代。