資料離散化雜談

2021-06-26 12:58:20 字數 3759 閱讀 1337



離散化

離散化,把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。

概述

離散化是程式設計中乙個非常常用的技巧,它可以有效的降低時間複雜度。其基本思想就是在眾多可能的情況中「只考慮我需要用的值」。離散化可以改進乙個低效的演算法

,甚至實現根本不可能實現的演算法

。要掌握這個思想,必須從大量的題目中理解此方法的特點。

舉例解釋

[1]如果說oibh

問得最多的問題是二分圖

,那麼「現在」問得最多的算是離散化了。對於「什麼是離散化」,搜尋帖子你會發現有各種說法,比如「排序後處理」、「對座標的近似處理」等等。哪個是對的呢?哪個都對。關鍵在於,這需要一些例子和不少的講解才能完全解釋清楚。

離散化是程式設計中乙個非常常用的技巧,它可以有效的降低時間和空間複雜度。其基本思想就是在眾多可能的情況中「只考慮我需要用的值」。下面我將用三個例子說明,如何運用離散化改進乙個低效的,甚至根本不可能實現的演算法。

《演算法藝術與資訊學競賽》中的計算幾何部分,黃亮舉了乙個經典的例子,我認為很適合用來介紹離散化思想。這個問題是uva10173題目意思很簡單,給定平面上n個點的座標,求能夠覆蓋所有這些點的最小矩形面積。這個問題難就難在,這個矩形可以傾斜放置(邊不必平行於座標軸)。

uva10173[1]

這裡的傾斜放置很不好處理,因為我們不知道這個矩形

最終會傾斜多少度。假設我們知道這個矩形

的傾角是α,那麼答案就很簡單了:矩形面積最小時四條邊一定都挨著某個點。也就是說,四條邊的斜率已經都知道了的話,只需要讓這些邊從外面不斷逼近這個點集直到碰到了某個點。你不必知道這個具體應該怎麼實現,只需要理解這可以通過某種方法計算出來,畢竟我們的重點在下面的過程。

我們的演算法

很顯然了:列舉矩形的傾角,對於每乙個傾角,我們都能計算出最小的矩形面積,最後取乙個最小值。

這個演算法

是否是正確的呢?我們不能說它是否正確,因為它根本不可能實現。矩形的傾角是乙個實數

,它有無數種可能,你永遠不可能列舉每一種情況。我們說,矩形的傾角是乙個「連續的」變數,它是我們無法列舉這個傾角的根本原因。我們需要一種方法,把這個「連續的」變數變成乙個乙個的值,變成乙個「離散的」變數。這個過程也就是所謂的離散化。

我們可以證明,最小面積的矩形不但要求四條邊上都有乙個點,而且還要求至少一條邊上有兩個或兩個以上的點。試想,如果每條邊上都只有乙個點,則我們總可以把這個矩形旋轉一點使得這個矩形變「松」,從而有餘地得到更小的矩形。於是我們發現,矩形的某條邊的斜率必然與某兩點的連線相同。如果我們計算出了所有過兩點的直線的傾角,那麼α的取值只有可能是這些傾角或它減去90度後的角(直線按「\」方向傾斜時)這麼c(n,2)種。我們說,這個「傾角」已經被我們「離散化」了。雖然這個演算法

仍然有優化的餘地,但此時我們已經達到了本文開頭所說的目的。

對於某些座標雖然已經是整數(已經是離散的了)但範圍極大的問題,我們也可以用離散化的思想縮小這個規模。搞模擬賽vijos似乎火了一把,我就拿兩道vijos的題開刀。

voj1056

voj1056[2]

永遠是離散化的經典問題。大意是給定平面上的n個矩形(座標為整數,矩形與矩形之間可能有重疊的部分),求其覆蓋的總面積。平常的想法就是開乙個與二維

座標規模相當的二維boolean陣列模擬矩形

的「覆蓋」(把矩形所在的位置填上true)。可惜這個想法在這裡有些問題,因為這個題目中座標範圍相當大(座標範圍為-10^8到10^8之間的整數)。但我們發現,矩形的數量n<=100遠遠小於座標範圍。每個矩形會在橫縱座標上各「使用」兩個值,100個矩形的座標也不過用了-10^8到10^8之間的200個值。也就是說,實際有用的值其實只有這麼幾個。這些值將作為新的座標值重新劃分整個平面,省去中間的若干座標值沒有影響。我們可以將座標範圍「離散化」到1到200之間的數,於是乙個200*200的二維陣列就足夠了。實現方法正如本文開頭所說的「排序後處理」。對橫座標

(或縱座標)進行一次排序並對映為1到2n的整數,同時記錄新座標的每兩個相鄰座標之間在離散化前實際的距離是多少。這道題同樣有優化的餘地。

最後簡單講一下計算幾何以外的乙個運用例項(實質仍然是座標的離散)。voj1238[3]

中,標程開了乙個與時間範圍一樣大的陣列來儲存時間段的位置。這種方法在空間上來看十分危險。一旦時間取值範圍

再大一點,盲目的空間開銷將導致memory limit exceeded。我們完全可以採用離散化避免這種情況。我們對所有給出的時間座標進行一次排序,然後同樣用時間段的開始點和結束點來計算每個時刻的遊戲數,只是一次性加的經驗值數將乘以排序後這兩個相鄰時間點

的實際差。這樣,乙個1..n的陣列就足夠了。

離散化的應用相當廣泛,以後你會看到還有很多其它的用途。

那麼,使用離散化到底有什麼好處呢?

離散化指把連續型資料切分為若干「段」,也稱bin,是資料分析中常用的手段。切分的原則有等距,等頻,優化,或根據資料特點而定。在營銷資料探勘中,離散化得到普遍採用。究其原因,有這樣幾點:

①演算法需要。例如決策樹,*****bayes等演算法本身不能直接使用連續型變數,連續型資料只有經離散處理後才能進入演算法引擎。這一點在使用具體軟體時可能不明顯。因為大多數資料探勘軟體內已經內建了離散化處理程式,所以從使用介面看,軟體可以接納任何形式的資料。但實際上,在運算決策樹或*****bayes模型前,軟體都要在後台對資料先作預處理。

②離散化可以有效地克服資料中隱藏的缺陷:使模型結果更加穩定。例如,資料中的極端值是影響模型效果的乙個重要因素。極端值導致模型引數過高或過低,或導致模型被虛假現象「迷惑」,把原來不存在的關係作為重要模式來學習。而離散化,尤其是等距離散,可以有效地減弱極端值和異常值的影響,

③有利於對非線性關係進行診斷和描述:對連續型資料進行離散處理後,自變數和目標變數之間的關係變得清晰化。如果兩者之間是非線性關係,可以重新定義離散後變數每段的取值,如採取0,1的形式,由乙個變數派生為多個啞變數,分別確定每段和目標變數間的聯絡。這樣做,雖然減少了模型的自由度,但可以大大提高模型的靈活度。

即使在連續型自變數和目標變數之間的關係比較明確,例如可以用直線描述的情況下,對自變數進行離散處理也有若干優點。一是便於模型的解釋和使用,二是可以增加模型的區別能力。

等距:將連續型變數的取值範圍均勻劃成n等份,每份的間距相等。例如,客戶訂閱刊物的時間是乙個連續型變數,可以從幾天到幾年。採取等距切分可以把1年以下的客戶劃分成一組,1-2年的客戶為一組,2-3年為一組..,以此類分,組距都是一年。

等頻:把觀察點均勻分為n等份,每份內包含的觀察點數相同。還取上面的例子,設該雜誌訂戶共有5萬人,等頻分段需要先把訂戶按訂閱時間按順序排列,排列好後可以按5000人一組,把全部訂戶均勻分為十段。

等距和等頻在大多數情況下導致不同的結果。等距可以保持資料原有的分布,段落越多對資料原貌保持得越好。等頻處理則把資料變換成均勻分布,但其各段內觀察值相同這一點是等距分割作不到的。

優化離散:需要把自變數和目標變數聯絡起來考察。切分點是導致目標變數出現明顯變化的折點。常用的檢驗指標有卡方,資訊增益,基尼指數,或woe(要求目標變數是兩元變數)

離散連續型資料還可以按照需要而定。比如,當營銷的重點是19-24歲的大學生消費群體時,就可以把這部分人單獨劃出。

離散化處理不免要損失一部分資訊。很顯然,對連續型資料進行分段後,同乙個段內的觀察點之間的差異便消失了。同時,進行了離散處理的變數有了新值。比如現在可以簡單地用1,2,3..這樣一組數字來標誌雜誌訂戶所處的段落。這組數字和原來的客戶訂閱雜誌的時間沒有直接的聯絡,也不再具備連續型資料可以運算的關係。例如,使用原來的資料,我們可以說已有兩年歷史的客戶訂閱時間是只有一年歷史客戶的兩倍,但經過離散處理後,我們只知道第2組的客戶的平均訂閱時間高於第一組客戶,但無法知道兩組客戶之間的確切差距。

以上內容**

資料離散化

離散化有兩種方法 第一種,先看一段 const int n 1e5 7 int t n a n int main 在這段 中,a經過離散,範圍就變成了m。解釋一下,unique是c 自帶的乙個函式,表示對乙個數列去重,然後返回不重複的元素個數,當然在後面要減去首位址。那麼這種離散化對於有重複元素的數...

資料離散化

一 概述 資料離散化是乙個非常重要的思想。為什麼要離散化?當以權值為下標的時候,有時候值太大,存不下。所以把要離散化的每乙個陣列裡面的數對映到另乙個值小一點的陣列裡面去。打個比方,某個題目告訴你有10 4個數,每個數大小不超過10 10,要你對這些數進行操作,那麼肯定不能直接開10 10大小的陣列,...

資料離散化

今天執行 資料離散化 部分 時出錯,環境python3.6 pycharm,網上各種查詢資料後發現原 主要是三個地方需要修改 下面紅色部分,原有問題 被注釋掉了 修改並新增了部分注釋。coding utf 8 資料規範化 import pandas as pd datafile data discr...