無監督學習技術在資料科學領域扮演著重要角色,尤其在處理未標記資料時更顯價值。本文將介紹幾種常用的無監督學習技術,包含 K-means 分群演算法、LDA 主題模型以及根據交替最小平方法的協同過濾推薦演算法,並提供 PySpark 的實作範例,讓讀者能快速上手。此外,距離度量在無監督學習中也至關重要,本文將探討歐幾裡得距離、曼哈頓距離、切比雪夫距離和 Jaccard 相似度等常用方法,並說明如何應用於分群技術。最後,文章也將簡述資料正規化和標準化的技術,以利讀者在實務操作中處理不同尺度的資料。

無監督學習與推薦演算法

本章將探討業界常用的無監督學習技術,並介紹如何使用 PySpark 實作這些技術。同時,也會介紹分群和推薦演算法的基礎知識以及相關的資料準備工作。透過本章的學習,讀者將對無監督學習技術及其在日常資料科學活動中的應用有更深入的瞭解。

本章涵蓋以下主題:

  • K-means 分群演算法
  • 隱含狄利克雷分配(Latent Dirichlet Allocation)
  • 使用交替最小平方法(Alternating Least Squares)的協同過濾推薦演算法

分群

分群是一種將客戶或資料記錄劃分為具有共同需求的邏輯群組的技術。這些邏輯群組內部的需求差異較小,但群組之間的需求差異可能很大。讓我們退一步思考為什麼需要分群。如果能夠識別出一組具有共同需求的客戶,就能夠幫助企業制定策略,以更好地服務客戶並保持客戶的參與度。可以建立這些分群,以更好地瞭解客戶,或是為了特定的目的,例如制定訊息傳遞策略或開發應用程式或產品。

K-means 分群演算法

K-means 是一種常見的分群演算法,它根據資料點之間的相似度將它們劃分為 K 個群組。下面是一個使用 PySpark 實作 K-means 的範例程式碼:

from pyspark.ml.clustering import KMeans
from pyspark.ml.feature import VectorAssembler

# 資料準備
assembler = VectorAssembler(inputCols=['feature1', 'feature2'], outputCol='features')
data = assembler.transform(df)

# K-means 模型訓練
kmeans = KMeans(k=5, seed=1)
model = kmeans.fit(data)

# 分群結果
predictions = model.transform(data)

內容解密:

  • 使用 VectorAssembler 將多個特徵欄位合併成一個向量欄位 features,作為 K-means 演算法的輸入。
  • 建立一個 K-means 模型,並設定 K 值為 5,使用 fit 方法訓練模型。
  • 使用訓練好的模型對資料進行分群,得到每個資料點所屬的群組。

隱含狄利克雷分配(LDA)

LDA 是一種主題模型,用於從大量文字資料中提取隱含的主題。下面是一個使用 PySpark 實作 LDA 的範例程式碼:

from pyspark.ml.feature import CountVectorizer, IDF
from pyspark.ml.clustering import LDA

# 文字資料準備
cv = CountVectorizer(inputCol='words', outputCol='features')
cv_model = cv.fit(df)
data = cv_model.transform(df)

# LDA 模型訓練
lda = LDA(k=10, maxIter=10)
model = lda.fit(data)

# 主題提取結果
topics = model.describeTopics(maxTermsPerTopic=10)

內容解密:

  • 使用 CountVectorizer 將文字資料轉換成詞頻向量。
  • 建立一個 LDA 模型,並設定主題數量 K 為 10,使用 fit 方法訓練模型。
  • 使用訓練好的模型提取主題,得到每個主題所對應的詞彙。

使用交替最小平方法的協同過濾推薦演算法

協同過濾是一種推薦演算法,用於根據使用者的歷史行為和偏好推薦物品。下面是一個使用 PySpark 實作協同過濾的範例程式碼:

from pyspark.ml.recommendation import ALS

# 資料準備
data = spark.createDataFrame([(1, 1, 4.0), (1, 2, 2.0), (2, 1, 3.0)], ['userId', 'itemId', 'rating'])

# ALS 模型訓練
als = ALS(maxIter=10, regParam=0.1, userCol='userId', itemCol='itemId', ratingCol='rating')
model = als.fit(data)

# 推薦結果
predictions = model.transform(data)

內容解密:

  • 使用 ALS 建立一個協同過濾模型,並設定最大迭代次數和正則化引數。
  • 使用 fit 方法訓練模型。
  • 使用訓練好的模型對使用者進行推薦,得到推薦結果。

圖表呈現

此圖示呈現了 K-means 分群演算法的流程: 圖表翻譯: 此圖表呈現了 K-means 分群演算法的主要步驟,包括資料準備、K-means 模型訓練、分群結果和評估分群結果。

本章介紹了無監督學習技術及其在 PySpark 中的實作,包括 K-means 分群演算法、LDA 主題模型和協同過濾推薦演算法。這些技術在資料科學和機器學習中有著廣泛的應用。透過本章的學習,讀者可以更好地理解和應用這些技術。

無監督學習中的分群技術與距離度量

在應用程式開發的過程中,瞭解使用者行為模式對於提升使用者經驗和最佳化產品功能至關重要。透過對使用者資料進行分析,我們可以識別出具有相似行為模式的使用者群體,即使用者分群。這些分群可以根據地理位置、使用時間、年齡層或功能使用情況等不同變數來進行劃分,從而制定出更有效的市場策略和個人化介面設計,以提升使用者參與度。

使用者分群的挑戰

進行使用者分群時,我們面臨著多項挑戰。首先,如何選擇適當的變數來進行分群是一個重要的問題。其次,分群的數量也很關鍵——太少或太多都可能導致分析結果不夠精確或難以應用。此外,我們還需要確保每個分群內有足夠數量的使用者,並且這些分群在一段時間內保持穩定,以便我們能夠根據這些資訊採取有效的行動。

基礎變數與描述變數

在進行使用者分群時,我們需要區分兩類別變數:基礎變數(Base Variables)和描述變數(Descriptor Variables)。基礎變數是用於定義分群的變數,例如應用程式使用頻率、功能使用情況等。描述變數則是用於描述和區分已識別出的分群的變數,例如使用者留存率、客戶流失率和應用程式收入等關鍵績效指標。透過分析這些描述變數,我們可以更好地理解每個分群的特徵和差異。

分群例項:汽車購買偏好調查

為了說明分群的概念,我們考慮一個汽車購買偏好的調查資料。調查物件根據「安全性」和「燃油效率」兩個因素對汽車進行評分,評分範圍從1到10。調查結果如表7-1所示。

受訪者安全性燃油效率
11010
299
39.59.5
151.259.25

圖表呈現:汽車購買偏好分群

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 無監督學習與推薦演算法實作

package "無監督學習與推薦" {
    package "分群技術" {
        component [K-means] as kmeans
        component [LDA 主題模型] as lda
        component [距離度量] as distance
    }

    package "推薦演算法" {
        component [協同過濾] as cf
        component [ALS 矩陣分解] as als
        component [相似度計算] as similarity
    }

    package "PySpark 實作" {
        component [資料正規化] as normalize
        component [標準化] as standardize
        component [模型訓練] as train
    }
}

kmeans --> lda : 客戶分群
lda --> distance : 主題發現
distance --> cf : 相似度計算
cf --> als : 使用者行為
als --> similarity : 矩陣分解
similarity --> normalize : 評分預測
normalize --> standardize : 尺度調整
standardize --> train : 資料轉換

note right of distance
  距離度量:
  - 歐幾裡得距離
  - 曼哈頓距離
  - Jaccard 相似度
end note

note right of als
  推薦技術:
  - 協同過濾
  - ALS 演算法
  - 隱式回饋
end note

@enduml

圖表翻譯: 此圖示展示了根據受訪者的汽車購買偏好評分進行的分群結果。安全性與燃油效率是兩個主要的評估因素,分別對應不同的使用者群體。

透過將調查資料繪製在散點圖上(如圖7-1所示),我們可以明顯地觀察到三個不同的分群:Cluster 1重視安全性,Cluster 2對安全性和燃油效率同等重視,而Cluster 3則更關注燃油效率。這些資訊對於汽車銷售商來說非常有價值,可以根據不同使用者群體的偏好制定針對性的銷售策略。

距離度量

在進行分群分析時,距離度量是一個關鍵概念,用於衡量資料點之間的相似性。其中,歐幾裡得距離(Euclidean Distance)是一種常用的距離度量方法,用於計算兩個資料點在多維空間中的幾何距離。

歐幾裡得距離計算範例

假設有兩個資料點$a(x_1, y_1)$和$b(x_2, y_2)$,則它們之間的歐幾裡得距離可以透過以下公式計算:

[Distance_{ab} = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}]

程式碼範例:計算歐幾裡得距離

import numpy as np

def calculate_euclidean_distance(point1, point2):
    return np.sqrt(np.sum((point1 - point2) ** 2))

# 示例資料點
point1 = np.array([10, 10])
point2 = np.array([9, 9])

distance = calculate_euclidean_distance(point1, point2)
print(f"歐幾裡得距離:{distance}")

內容解密:

  1. 匯入必要的函式庫:我們使用numpy來進行數值計算。
  2. 定義函式calculate_euclidean_distance函式用於計算兩個資料點之間的歐幾裡得距離。
  3. 計算距離:透過將兩個資料點的差值平方後求和,再取平方根,得到歐幾裡得距離。
  4. 示例資料:我們定義了兩個示例資料點point1point2,並計算它們之間的歐幾裡得距離。
  5. 輸出結果:最終輸出計算得到的歐幾裡得距離。

透過這種方式,我們可以有效地計算多維資料點之間的距離,為進一步的分群分析提供基礎。

無監督學習與推薦演算法中的距離衡量技術

在無監督學習和推薦演算法中,距離衡量技術是至關重要的。它們用於計算資料點之間的相似度或差異度。本章節將探討不同的距離衡量方法,包括歐幾裡得距離、曼哈頓距離、切比雪夫距離、Jaccard 相似度等。

歐幾裡得距離

歐幾裡得距離是最常用的距離衡量方法之一。它計算兩個點在多維空間中的直線距離。公式如下:

Distance_ab = √((x1 - x2)^2 + (y1 - y2)^2 + (z1 - z2)^2)

import math

def euclidean_distance(x1, y1, z1, x2, y2, z2):
    return math.sqrt((x1 - x2)**2 + (y1 - y2)**2 + (z1 - z2)**2)

# 示例
x1, y1, z1 = 1, 2, 3
x2, y2, z2 = 4, 5, 6
print(euclidean_distance(x1, y1, z1, x2, y2, z2))

內容解密:

  • euclidean_distance 函式用於計算兩個三維空間中的點之間的歐幾裡得距離。
  • 使用 math.sqrt 函式計算平方根。
  • 示例中計算了點 (1, 2, 3) 和 (4, 5, 6) 之間的歐幾裡得距離。

曼哈頓距離

曼哈頓距離,也稱為城市街區距離,是計算兩個點在多維空間中的絕對距離之和。公式如下:

Manhattan distance = |(x2 - x1)| + |(y2 - y1)|

def manhattan_distance(x1, y1, x2, y2):
    return abs(x2 - x1) + abs(y2 - y1)

# 示例
x1, y1 = 1, 2
x2, y2 = 4, 5
print(manhattan_distance(x1, y1, x2, y2))

內容解密:

  • manhattan_distance 函式用於計算兩個二維空間中的點之間的曼哈頓距離。
  • 使用 abs 函式計算絕對值。
  • 示例中計算了點 (1, 2) 和 (4, 5) 之間的曼哈頓距離。

切比雪夫距離

切比雪夫距離是計算兩個點在多維空間中的最大坐標差異。公式如下:

Chebyshev distance = max(|(x2 - x1)|, |(y2 - y1)|)

def chebyshev_distance(x1, y1, x2, y2):
    return max(abs(x2 - x1), abs(y2 - y1))

# 示例
x1, y1 = 1, 2
x2, y2 = 4, 5
print(chebyshev_distance(x1, y1, x2, y2))

內容解密:

  • chebyshev_distance 函式用於計算兩個二維空間中的點之間的最大坐標差異。
  • 使用 maxabs 函式計算最大絕對差異。
  • 示例中計算了點 (1, 2) 和 (4, 5) 之間的切比雪夫距離。

Jaccard 相似度

Jaccard 相似度用於衡量兩個集合之間的相似度。公式如下:

Jaccard 相似度 = |A ∩ B| / |A ∪ B|

def jaccard_similarity(set1, set2):
    intersection = set1.intersection(set2)
    union = set1.union(set2)
    return len(intersection) / len(union)

# 示例
set1 = {1, 2, 3}
set2 = {2, 3, 4}
print(jaccard_similarity(set1, set2))

內容解密:

  • jaccard_similarity 函式用於計算兩個集合之間的 Jaccard 相似度。
  • 使用集合運算 intersectionunion 分別計算交集和並集。
  • 示例中計算了集合 {1, 2, 3} 和 {2, 3, 4} 之間的 Jaccard 相似度。

資料正規化與標準化

在處理不同尺度的資料時,正規化和標準化是必要的技術。正規化將資料縮放到 [0, 1] 範圍內,而標準化則使資料具有零均值和單位方差。

def normalize(data):
    min_val = min(data)
    max_val = max(data)
    return [(x - min_val) / (max_val - min_val) for x in data]

def standardize(data):
    mean_val = sum(data) / len(data)
    std_dev = (sum((x - mean_val)**2 for x in data) / len(data))**0.5
    return [(x - mean_val) / std_dev for x in data]

# 示例
data = [1, 2, 3, 4, 5]
print(normalize(data))
print(standardize(data))

內容解密:

  • normalize 函式將資料正規化到 [0, 1] 範圍內。
  • standardize 函式將資料標準化,使其具有零均值和單位方差。
  • 示例中對資料 [1, 2, 3, 4, 5] 進行了正規化和標準化。

本章節介紹了多種距離衡量技術,包括歐幾裡得距離、曼哈頓距離、切比雪夫距離和 Jaccard 相似度,並提供了 Python 程式碼範例。同時,也討論了資料正規化和標準化的重要性和實作方法。這些技術在無監督學習和推薦演算法中具有廣泛的應用價值。

無監督學習與推薦演算法中的距離度量與分群技術

在無監督學習和推薦演算法中,距離度量和相似性計算是至關重要的基礎。本章節將詳細介紹不同的距離度量方法,以及它們在分群技術中的應用。

簡單匹配係數與距離

簡單匹配係數是一種用於衡量二元變數之間相似性的指標。對於兩個二元變數,其簡單匹配係數定義為同時為1或同時為0的比例。簡單匹配距離則是透過從1中減去簡單匹配係數來計算的。

簡單匹配距離 = 1 - 簡單匹配係數

Jaccard 距離

Jaccard 距離是一種用於衡量兩個集合之間相似性的指標。它定義為兩個集合的交集大小除以它們的並集大小。在二元變數的情況下,Jaccard 距離可以透過計算同時為1的比例來得出。

舉例來說,假設有一家汽車經銷商對三輛不同品牌和型號的汽車進行了多項測試,以評估其效能。測試結果以Y(失敗)和N(透過)表示,分別對應1和0。利用Jaccard 距離,可以計算出這三輛汽車之間的相似性。

Jaccard 距離計算範例

測試專案Car 1Car 2Car 3
Climatic111
Mechanical001
Pressure Impulse110
Emissions010
Bench000
Cat Aging000
SHED000
def jaccard_similarity(car1, car2):
    # 將測試結果轉換為集合
    set1 = set([i for i, x in enumerate(car1) if x == 1])
    set2 = set([i for i, x in enumerate(car2) if x == 1])
    
    # 計算交集和並集
    intersection = set1.intersection(set2)
    union = set1.union(set2)
    
    # 計算 Jaccard 相似性
    similarity = len(intersection) / len(union)
    
    return similarity

# 定義測試結果
car1 = [1, 0, 1, 0, 0, 0, 0]
car2 = [1, 0, 1, 0, 1, 0, 0]
car3 = [1, 1, 0, 0, 0, 0, 0]

# 計算 Jaccard 相似性
similarity_12 = jaccard_similarity(car1, car2)
similarity_13 = jaccard_similarity(car1, car3)
similarity_23 = jaccard_similarity(car2, car3)

print("Car 1 和 Car 2 的 Jaccard 相似性:", similarity_12)
print("Car 1 和 Car 3 的 Jaccard 相似性:", similarity_13)
print("Car 2 和 Car 3 的 Jaccard 相似性:", similarity_23)

程式碼解析:

  • jaccard_similarity函式用於計算兩個輸入列表之間的Jaccard相似性。
  • 將輸入列表轉換為集合,以便計算交集和並集。
  • Jaccard相似性由交集大小除以並集大小得出。
  • 使用此函式計算三輛汽車之間的Jaccard相似性。

分群技術型別

分群技術主要分為層次分群和非層次分群兩大類別。層次分群進一步分為凝聚式和分裂式兩種方法。

層次分群

層次分群試圖建立一個分群的層次結構。凝聚式分群從每個觀察值開始各自成群,然後逐漸合併成更大的群集。分裂式分群則從所有觀察值屬於同一群集開始,然後遞迴地分割成更小的群集。

凝聚式分群範例

假設有六個受訪者的資料,分別對應其安全性和燃油效率評分。首先,計算這些受訪者之間的歐幾裡得距離,然後根據距離矩陣進行凝聚式分群。

受訪者安全評分燃油效率評分
11010
299
6101
791.5
11110
121.59
import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage
from scipy.spatial.distance import pdist

# 定義受訪者資料
data = np.array([[10, 10], [9, 9], [10, 1], [9, 1.5], [1, 10], [1.5, 9]])

# 計算歐幾裡得距離
distances = pdist(data)

# 使用單一連結法進行層次分群
Z = linkage(distances, 'single')

# 繪製樹狀圖
dendrogram(Z)

程式碼解析:

  • 使用pdist函式計算資料點之間的歐幾裡得距離。
  • 使用linkage函式進行層次分群,這裡採用單一連結法。
  • 使用dendrogram函式繪製樹狀圖,以視覺化分群過程。