一、簡介
在數據處理和分析中,pdist函數扮演着非常重要的角色。該函數用於計算一組數據點中所有可能的點對之間的距離,並返回一個距離矩陣。
import numpy as np from scipy.spatial.distance import pdist data = np.array([[1,2], [3,4], [5,6], [7,8]]) distances = pdist(data) print(distances)
在上述代碼中,我們首先導入了numpy和scipy.spatial.distance模塊,並定義了一個包含4個點的數據數組。然後使用pdist函數計算了這些點之間的距離,並打印輸出了距離矩陣。
二、距離度量
在pdist函數中,可以指定不同的距離度量方法來計算點對之間的距離。其中最常用的距離度量方法有以下幾種:
- 歐幾里得距離:即兩點之間的直線距離。
- 曼哈頓距離:即兩點之間的橫縱坐標距離之和。
- 切比雪夫距離:即兩點之間各個坐標數值差的絕對值的最大值。
- 閔可夫斯基距離:是歐幾里得距離、曼哈頓距離、切比雪夫距離的一種推廣,可以指定p的值,當p=1時是曼哈頓距離,當p=2時是歐幾里得距離,當p趨近於無窮大時是切比雪夫距離。
import numpy as np from scipy.spatial.distance import pdist data = np.array([[1,2], [3,4], [5,6], [7,8]]) distances_euclidean = pdist(data, metric='euclidean') distances_manhattan = pdist(data, metric='cityblock') distances_chebyshev = pdist(data, metric='chebyshev') distances_minkowski = pdist(data, metric='minkowski', p=3) print(distances_euclidean) print(distances_manhattan) print(distances_chebyshev) print(distances_minkowski)
在上述代碼中,我們分別使用了歐幾里得距離、曼哈頓距離和切比雪夫距離三種不同的距離度量方法,並使用metric參數指定相應的度量方法。同時我們還指定了p=3來計算閔可夫斯基距離,即使用了一種推廣距離度量。
三、距離矩陣
除了返回一維的距離數組外,pdist函數還可以通過設置參數返回一個距離矩陣。距離矩陣是一個n*n的矩陣,其中第(i,j)個元素表示第i個點和第j個點之間的距離。
import numpy as np from scipy.spatial.distance import pdist, squareform data = np.array([[1,2], [3,4], [5,6], [7,8]]) distances = pdist(data) distance_matrix = squareform(distances) print(distance_matrix)
上述代碼中,我們首先使用pdist函數計算每對數據點之間的距離,然後使用squareform函數將一維的距離數組轉換為二維的距離矩陣,並打印輸出矩陣的值。
四、應用案例
最後,我們通過一個應用案例來展示pdist函數的實際應用。
假設我們需要對一個包含多個矩形的圖像進行分割,可以先將圖像中的所有像素點作為數據點,然後使用pdist函數計算每對像素點之間的距離。由於距離矩陣可以反映出不同像素點之間的相似度,因此我們可以使用聚類算法對像素點進行分組,並將同一組內的像素點打上相同的標記。
以下是一個簡單的實現示例:
import numpy as np from scipy.spatial.distance import pdist, squareform from sklearn.cluster import AgglomerativeClustering # 構造數據 n_rectangles = 5 pixels_per_rectangle = 10 image_size = n_rectangles * pixels_per_rectangle data = np.zeros([image_size**2, 2]) for i in range(n_rectangles): for j in range(n_rectangles): x = i*pixels_per_rectangle + np.random.randint(0, pixels_per_rectangle, pixels_per_rectangle**2) y = j*pixels_per_rectangle + np.random.randint(0, pixels_per_rectangle, pixels_per_rectangle**2) data[i*pixels_per_rectangle**2+(j*pixels_per_rectangle**2):(i+1)*pixels_per_rectangle**2+(j+1)*pixels_per_rectangle**2,0] = x data[i*pixels_per_rectangle**2+(j*pixels_per_rectangle**2):(i+1)*pixels_per_rectangle**2+(j+1)*pixels_per_rectangle**2,1] = y # 計算距離 distances = pdist(data) # 將距離轉換為相似度,這裡使用sigmoid函數來將距離壓縮到[0,1]範圍內 similarities = 1 / (1 + np.exp(-distances)) # 聚類 n_clusters = 5 clustering = AgglomerativeClustering(n_clusters=n_clusters, affinity='precomputed', linkage='average') clustering.fit(similarities) # 分組 labels = clustering.labels_ # 繪圖 import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=[6, 6]) for i in range(n_rectangles): for j in range(n_rectangles): rectangle_data = data[i*pixels_per_rectangle**2+(j*pixels_per_rectangle**2):(i+1)*pixels_per_rectangle**2+(j+1)*pixels_per_rectangle**2,:] rectangle_labels = labels[i*pixels_per_rectangle**2+(j*pixels_per_rectangle**2):(i+1)*pixels_per_rectangle**2+(j+1)*pixels_per_rectangle**2] colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k'] for k in range(n_clusters): ax.scatter(rectangle_data[rectangle_labels==k,0], rectangle_data[rectangle_labels==k,1], marker='o', color=colors[k], alpha=0.5) plt.show()
上述代碼中,我們首先構造了一個包含多個矩形的圖像,並將每個像素點作為一個數據點,然後使用pdist函數計算每對像素點之間的距離。在計算相似度時我們使用sigmoid函數將距離壓縮到[0,1]範圍內。接着使用聚類算法對像素點進行分組,並將同一組內的像素點打上相同的標記。最後,我們將聚類結果可視化輸出。
總結
本文詳細介紹了pdist函數在數據處理和分析中的應用,包括距離計算、距離矩陣生成以及聚類等相關應用案例。pdist函數在實際工作中有着廣泛的應用,熟練掌握該函數的使用方法可以幫助我們更加高效地完成數據分析任務。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/184469.html