【scipy 基礎】--插值

来源:https://www.cnblogs.com/wang_yb/archive/2023/11/07/17814420.html
-Advertisement-
Play Games

插值運算是一種數據處理方法,主要用來填補數據之間的空白或缺失值。因為在實際應用中,數據往往不是完整的,而是存在著空白或缺失值,這些空白或缺失值可能是由於數據採集困難、數據丟失或數據處理錯誤等原因造成的。如果直接使用這些空白或缺失值進行分析和預測,將會對結果造成很大的影響。 插值運算可以用來填補這些空 ...


插值運算是一種數據處理方法,主要用來填補數據之間的空白或缺失值。
因為在實際應用中,數據往往不是完整的,而是存在著空白或缺失值,這些空白或缺失值可能是由於數據採集困難、數據丟失或數據處理錯誤等原因造成的。
如果直接使用這些空白或缺失值進行分析和預測,將會對結果造成很大的影響。

插值運算可以用來填補這些空白或缺失值,從而恢復完整的數據集。
通過插值運算,可以估算出空白或缺失值的值,從而提高數據的完整性和準確性。
此外,插值運算還可以用來預測未來的數據趨勢或結果,對於數據分析和預測具有重要的意義。

本篇介紹Scipy為我們提供的插值處理方法。

1. 主要功能

Scipy中,關於插值的子模塊是:scipy.interpolate
其中又細分為:

類別 說明
單變數插值 主要包含interp1d等12個函數
多變數插值 主要包含griddata等11個函數
一維樣條函數 主要包含BSpline等16個函數
二維樣條函數 主要包含RectBivariateSpline等9個函數
其他函數 一些輔助計算的函數

插值效果的好壞,有個重要的因素在於是否根據數據的情況選擇了合適的插值演算法。
Scipy庫中已經實現的插值演算法有:

  1. linear:線性插值演算法
  2. nearest:最近鄰插值演算法
  3. nearest-up:改進型最近鄰插值演算法
  4. zero:零階樣條插值演算法(等同於 previous
  5. slinear:一階樣條插值演算法(等同於 linear
  6. quadratic:五階樣條插值演算法
  7. cubic:三階樣條插值演算法
  8. previous:前點插值演算法
  9. next:後點插值演算法

我們可以根據數據情況選擇合適的演算法,下麵用一些測試數據演示不同演算法的插值效果:

from scipy.interpolate import interp1d

x = np.linspace(0, 20, 20)
y = x * np.cos(x)
plt.scatter(x,y)
plt.show()

image.png
上圖是插值之前,直接由20個數據點連接起來的折線。

接下來,應用9種不同的插值演算法將20個點補充為100個點,然後看看插值之後各種曲線的效果。

interp_types = [
    "linear",
    "nearest",
    "nearest-up",
    "zero",
    "slinear",
    "quadratic",
    "cubic",
    "previous",
    "next",
]

fig = plt.figure(figsize=[12, 9])
fig.subplots_adjust(hspace=0.4)

for idx, typ in enumerate(interp_types):
    f = interp1d(x, y, kind=typ)
    x_dense = np.linspace(0, 20, 100)
    y_dense = f(x_dense)

    ax = fig.add_subplot(330 + idx+1)
    ax.scatter(x, y)
    ax.plot(x_dense, y_dense, color='g')
    ax.set_title("插值演算法-{}".format(typ))


plt.show()

image.png

2. 一維插值示例

在我自己實際接觸的項目中,氣象數據的處理經常會用到插值。
因為氣象數據常常存在缺失值,這可能是由於感測器故障,數據傳輸問題,或者在某些情況下,由於天氣現象使得數據無法收集。
對於這些缺失值,我們可以使用Scipy的一維插值功能來進行填充。

比如下麵是南京市某年的各個月的平均氣溫:

import pandas as pd

# 南京一年中每個月平均氣溫
df = pd.DataFrame({
    "月份": ["一月", "二月", "三月", 
           "四月", "五月", "六月", 
           "七月", "八月", "九月", 
           "十月", "十一月", "十二月"],
    "平均最低氣溫": [-1.6, 0.0, 4.4, 
               np.nan, 15.7, 20.4, 
               np.nan, 24.6, 19.1, 
               12.6, 6.1, -0.1],
    "平均最高氣溫": [7.0, 8.4, np.nan, 
               20.1, 25.3, 29.0, 
               32.0, 32.2, 27.2, 
               np.nan, 16.9, 9.7],
})

df

image.png
由於採集或者傳輸的原因,導致缺失了一些數據。
這樣的數據不僅繪製出來的折線圖會有斷開的地方,而且不利於後續的分析。

plt.plot(df["月份"], df["平均最低氣溫"], label="平均最低氣溫")
plt.plot(df["月份"], df["平均最高氣溫"], label="平均最高氣溫")
plt.legend()

plt.show()

image.png

這時,可以用Scipy的插值演算法來補充缺失數據。

from scipy.interpolate import interp1d

# 過濾掉缺失的 平均最低氣溫 數據
df_low =df[df["平均最低氣溫"].notna()]
# 根據已有的數據生成插值函數
f = interp1d(df_low.index, df_low["平均最低氣溫"], kind="cubic")
# 用插值函數補充缺失數據
df["平均最低氣溫"] = f(range(12))

# 平均最高氣溫 的缺失數據處理同上
df_high =df[df["平均最高氣溫"].notna()]
f = interp1d(df_high.index, df_high["平均最高氣溫"], kind="cubic")
df["平均最高氣溫"] = f(range(12))

df.round(1)

plt.plot(df["月份"], df["平均最低氣溫"], label="平均最低氣溫")
plt.plot(df["月份"], df["平均最高氣溫"], label="平均最高氣溫")
plt.legend()

plt.show()

image.png
處理之後,數據的連續性更好了。

3. 二維插值示例

當自變數有2個的時候,就要用到二維插值了。
仍然以氣象上的數據舉例,上面示例是氣溫和時間的關係,我們把時間作為自變數,只要一維插值即可。
如果是和地點關聯的話,那麼地點作為自變數就有2個值(一般是經度和緯度)。

比如下麵截取了項目中一段降水量的數據:

# 數據是二維數組:
# 每一行代表經度相同,緯度不同的地點
# 每一列代表緯度相同,經度不同的地點
data = np.array([
    [9, 9, 5, 9, 10, 9, 8, 7, 11, 1],
    [54, 36, 54, 32, 46, 51, 35, 33, 36, 11],
    [35, 34, 34, 45, 52, 35, 34, 36, 41, 9],
    [117, 112, 113, 133, 126, 127, 119, 96, 116, 23],
    [110, 67, 91, 85, 94, 69, 77, 81, 65, 13],
    [9, 7, 13, 12, 9, 6, 8, 9, 21, 3],
    [50, 21, 24, 32, 36, 26, 28, 30, 24, 3],
    [65, 41, 63, 67, 58, 50, 54, 45, 48, 16],
    [36, 29, 32, 28, 38, 29, 41, 27, 29, 9],
    [37, 61, 57, 35, 56, 51, 40, 58, 100, 34],
])

顯示降水量的分佈情況。

plt.imshow(data, cmap=plt.cm.GnBu)
plt.colorbar()
plt.xticks([])
plt.yticks([])
plt.show()

image.png
data中只有100個數據,所以每個格子一個值,看起來不是那麼連續,
而實際的降水情況不會像這樣離散的,區域之間的降水量應該是逐漸連續變化的。

所以,需要在data的基礎上進行二維插值:

from scipy.interpolate import RectBivariateSpline

# 原始數據是 10x10 
x = np.linspace(0, 10, 10, endpoint=False)
y = np.linspace(0, 10, 10, endpoint=False)

# 插值後的數據是 500x500
x_new = np.linspace(0, 10, 500, endpoint=False)
y_new = np.linspace(0, 10, 500, endpoint=False)

# 從原始數據生成插值函數
f = RectBivariateSpline(x, y, data.T)
# 用插值函數計算新的數據
data_new = f(x_new, y_new)

# 顯示插值後的結果
plt.imshow(data_new.T, cmap=plt.cm.GnBu)
plt.colorbar()
plt.xticks([])
plt.yticks([])
plt.show()

image.png
這是插值到 500x500 的效果,值越大,連續性越好。
有興趣的話,可以調整上面代碼中 x_newy_new 的個數,看看不同的效果。

4. 總結

插值作為一種常見的數據處理方法,應用的領域和場景非常多,比如:

  1. 數據預測:通過插值技術,可以預測未來的數據趨勢或結果。
  2. 圖像處理:插值可以用於圖像處理和圖像分析,以提高圖像的解析度或質量。
  3. 機器學習:插值技術也可以用於機器學習和人工智慧領域。用於構建回歸模型或分類模型,以便對未知數據進行預測或分類。

本文主要介紹了Scipy庫的插值子模塊,其內置的插值演算法,以及兩個應用插值的小例子。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 左值、右值、左值引用以及右值引用 左值:一般指的是在記憶體中有對應的存儲單元的值,最常見的就是程式中創建的變數 右值:和左值相反,一般指的是沒有對應存儲單元的值(寄存器中的立即數,中間結果等),例如一個常量,或者表達式計算的臨時變數 int x = 10 int y = 20 int z = x ...
  • eclipse下載 官網下載:https://www.eclipse.org/downloads/packages/ 打開後,找到Eclipse IDE for Java Developers點擊進入 進入後點擊右側電腦適配的版本,進入到下載界面點擊“>> Select Another Mirror ...
  • 1 任務調度整體流程 2 組件 調度器 :工廠類創建Scheduler,根據觸發器定義的時間規則調度任務 任務:Job表示被調度的任務 觸發器:Trigger 定義調度時間的元素,按啥時間規則執行任務。一個Job可被多個Trigger關聯,但是一個Trigger 只能關聯一個Job import o ...
  • 進行支付寶開發的第一步就是:配置密鑰。 但是有很多小伙伴都不知道怎麼配置,這篇文章將手把手幫你從頭開始捋清如何配置支付寶密鑰~ ...
  • 在"zookeeper源碼(03)集群啟動流程"中介紹了leader選舉的入口,本文將詳細分析leader選舉組件和流程。 leader選舉流程(重要) quorumPeer的start階段使用startLeaderElection()方法啟動選舉 LOOKING狀態,投自己一票 createEle ...
  • 準備 我是小C同學編寫得一個java文件,如何實現我的功能呢?需要去JVM(Java Virtual Machine)這個地方旅行。 變身 我高高興興的來到JVM,想要開始JVM之旅,它確說:“現在的我還不能進去,需要做一次轉換,生成class文件才行”。為什麼這樣呢? JVM不能直接載入java文 ...
  • 配置文件yml # phantomjs的位置地址 phantomjs: binPath: windows: binPath-win linux: binPath-linux jsPath: windows: jsPath-win linux: jsPath-linux imagePath: wind ...
  • 定時任務簡介 定時任務是指按照預定的時間間隔或特定時間點自動執行的計劃任務或操作。這些任務通常用於自動化重覆性的工作,以減輕人工操作的負擔,提高效率。在電腦編程和應用程式開發中,定時任務是一種常見的編程模式,用於周期性地執行某些操作、處理數據或觸發事件。 以下是一些關於定時任務的重要概念: 時間間 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...