pdist函數:多角度全面解析

一、簡介

在數據處理和分析中,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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-25 17:24
下一篇 2024-11-25 17:24

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字符串操作中,capitalize函數常常被用到,這個函數可以使字符串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python應用程序的全面指南

    Python是一種功能強大而簡單易學的編程語言,適用於多種應用場景。本篇文章將從多個方面介紹Python如何應用於開發應用程序。 一、Web應用程序 目前,基於Python的Web…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • 單片機打印函數

    單片機打印是指通過串口或並口將一些數據打印到終端設備上。在單片機應用中,打印非常重要。正確的打印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的打印數據可以幫助我們快速…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • 分段函數Python

    本文將從以下幾個方面詳細闡述Python中的分段函數,包括函數基本定義、調用示例、圖像繪製、函數優化和應用實例。 一、函數基本定義 分段函數又稱為條件函數,指一條直線段或曲線段,由…

    編程 2025-04-29

發表回復

登錄後才能評論