導航:首頁 > 解決方法 > 數據分布不均勻解決方法

數據分布不均勻解決方法

發布時間:2022-12-09 10:54:48

A. excel插入折線圖,X軸的數據不均勻

1、繪制曲線。在excel中,根據對應數據列出x、y兩行數據,全部選中這兩行數據,點擊「圖表向導」(或者在菜單欄中「插入」—「圖表」),在「標准類型」中選「xy散點圖」—「平滑線散點圖」或者「折線散點圖」,在隨後出現的對話框中「數據區域」中選擇「系列產生在」:「行」或者「列」;在「系列」中選擇x值和y值的區域,再按提示一步一步完成數據對應的曲線圖。
默認情況下是「系列產生在」:「行」;x值為上面一行、y值為下面一行。所以如果羅列數據時x值在第一行,對應的y值在第二行的話,基本上可以不用選擇:系列產生在行或者列,也不用選擇x值和y值的區域,直接點「下一步」就可完成。
2、擬合趨勢線。選中繪好的曲線,按右鍵,選擇「添加趨勢線」,在「類型」中選擇與這條曲線最近似的類型,如:線性、對數、多項式等(其中的一個),再在這個「添加趨勢線」選框中點「選項」,勾選「顯示公式」和「顯示R平方值」這兩項,確定後趨勢線做成。這時檢查R平方值是否接近1,如果R平方值是1或者0.995左右(並且趨勢線與繪制的曲線基本重合),表示擬合的趨勢線和顯示的公式基本能表示數據的對應關系。但如果R平方值跟1相比相差很大(或者趨勢線與繪制的曲線大相徑庭),就需要重新選「添加趨勢線」中「類型」,重新擬合直到R平方值接近1(一定要選所有趨勢線類型中R平方值最接近1且趨勢線與繪制的曲線基本重合的那個)。
如果不能找到這樣一條擬合趨勢線,只能證明那些數據不能被擬合成一條回歸曲線(或者說擬合的效果不好,不能較好地反映數據的變化),這是因為不是所有的任何一組數據都能找到一條完美的與之相配的回歸線。
況且數據本身如果不是由函數直接得出(大多數情況應該都不是)的話,擬合得出的方程或曲線都只是一種趨勢、估算(而不是一種真實值),在預測、統計方面的作用應該要大些。

B. 數據分析,分布不均勻的數據應該怎麼樣處理

根據業務知識,剔除異常值,也不知道你的數據是啥樣的,什麼領域的?
我們做這種大數據量的,一般都是分出很多段,然後每段的數據取均值,再建回歸模型。

C. php的memcached分布式hash演算法,如何解決分布不均crc32這個演算法沒辦法把key值均勻的分布出去

memcached的總結和分布式一致性hash
當前很多大型的web系統為了減輕資料庫伺服器負載,會採用memchached作為緩存系統以提高響應速度。
目錄: (http://hounwang.com/lesson.html)
memchached簡介
hash
取模
一致性hash
虛擬節點
源碼解析
參考資料
1. memchached簡介
memcached是一個開源的高性能分布式內存對象緩存系統。
其實思想還是比較簡單的,實現包括server端(memcached開源項目一般只單指server端)和client端兩部分:
server端本質是一個in-memory key-value store,通過在內存中維護一個大的hashmap用來存儲小塊的任意數據,對外通過統一的簡單介面(memcached protocol)來提供操作。
client端是一個library,負責處理memcached protocol的網路通信細節,與memcached server通信,針對各種語言的不同實現分裝了易用的API實現了與不同語言平台的集成。
web系統則通過client庫來使用memcached進行對象緩存。
2. hash
memcached的分布式主要體現在client端,對於server端,僅僅是部署多個memcached server組成集群,每個server獨自維護自己的數據(互相之間沒有任何通信),通過daemon監聽埠等待client端的請求。
而在client端,通過一致的hash演算法,將要存儲的數據分布到某個特定的server上進行存儲,後續讀取查詢使用同樣的hash演算法即可定位。
client端可以採用各種hash演算法來定位server:
取模
最簡單的hash演算法
targetServer = serverList[hash(key) % serverList.size]
直接用key的hash值(計算key的hash值的方法可以自由選擇,比如演算法CRC32、MD5,甚至本地hash系統,如java的hashcode)模上server總數來定位目標server。這種演算法不僅簡單,而且具有不錯的隨機分布特性。
但是問題也很明顯,server總數不能輕易變化。因為如果增加/減少memcached server的數量,對原先存儲的所有key的後續查詢都將定位到別的server上,導致所有的cache都不能被命中而失效。
一致性hash
為了解決這個問題,需要採用一致性hash演算法(consistent hash)
相對於取模的演算法,一致性hash演算法除了計算key的hash值外,還會計算每個server對應的hash值,然後將這些hash值映射到一個有限的值域上(比如0~2^32)。通過尋找hash值大於hash(key)的最小server作為存儲該key數據的目標server。如果找不到,則直接把具有最小hash值的server作為目標server。
為了方便理解,可以把這個有限值域理解成一個環,值順時針遞增。
如上圖所示,集群中一共有5個memcached server,已通過server的hash值分布到環中。
如果現在有一個寫入cache的請求,首先計算x=hash(key),映射到環中,然後從x順時針查找,把找到的第一個server作為目標server來存儲cache,如果超過了2^32仍然找不到,則命中第一個server。比如x的值介於A~B之間,那麼命中的server節點應該是B節點
可以看到,通過這種演算法,對於同一個key,存儲和後續的查詢都會定位到同一個memcached server上。
那麼它是怎麼解決增/刪server導致的cache不能命中的問題呢?
假設,現在增加一個server F,如下圖
此時,cache不能命中的問題仍然存在,但是只存在於B~F之間的位置(由C變成了F),其他位置(包括F~C)的cache的命中不受影響(刪除server的情況類似)。盡管仍然有cache不能命中的存在,但是相對於取模的方式已經大幅減少了不能命中的cache數量。
虛擬節點
但是,這種演算法相對於取模方式也有一個缺陷:當server數量很少時,很可能他們在環中的分布不是特別均勻,進而導致cache不能均勻分布到所有的server上。
如圖,一共有3台server – 1,2,4。命中4的幾率遠遠高於1和2。
為解決這個問題,需要使用虛擬節點的思想:為每個物理節點(server)在環上分配100~200個點,這樣環上的節點較多,就能抑制分布不均勻。
當為cache定位目標server時,如果定位到虛擬節點上,就表示cache真正的存儲位置是在該虛擬節點代表的實際物理server上。
另外,如果每個實際server的負載能力不同,可以賦予不同的權重,根據權重分配不同數量的虛擬節點。
// 採用有序map來模擬環
this.consistentBuckets = new TreeMap();
MessageDigest md5 = MD5.get();//用MD5來計算key和server的hash值
// 計算總權重
if ( this.totalWeight for ( int i = 0; i < this.weights.length; i++ )
this.totalWeight += ( this.weights[i] == null ) ? 1 : this.weights[i];
} else if ( this.weights == null ) {
this.totalWeight = this.servers.length;
}
// 為每個server分配虛擬節點
for ( int i = 0; i < servers.length; i++ ) {
// 計算當前server的權重
int thisWeight = 1;
if ( this.weights != null && this.weights[i] != null )
thisWeight = this.weights[i];
// factor用來控制每個server分配的虛擬節點數量
// 權重都相同時,factor=40
// 權重不同時,factor=40*server總數*該server權重所佔的百分比
// 總的來說,權重越大,factor越大,可以分配越多的虛擬節點
double factor = Math.floor( ((double)(40 * this.servers.length * thisWeight)) / (double)this.totalWeight );
for ( long j = 0; j < factor; j++ ) {
// 每個server有factor個hash值
// 使用server的域名或IP加上編號來計算hash值
// 比如server - "172.45.155.25:11111"就有factor個數據用來生成hash值:
// 172.45.155.25:11111-1, 172.45.155.25:11111-2, ..., 172.45.155.25:11111-factor
byte[] d = md5.digest( ( servers[i] + "-" + j ).getBytes() );
// 每個hash值生成4個虛擬節點
for ( int h = 0 ; h < 4; h++ ) {
Long k =
((long)(d[3+h*4]&0xFF) << 24)
| ((long)(d[2+h*4]&0xFF) << 16)
| ((long)(d[1+h*4]&0xFF) << 8 )
| ((long)(d[0+h*4]&0xFF));
// 在環上保存節點
consistentBuckets.put( k, servers[i] );
}
}
// 每個server一共分配4*factor個虛擬節點
}
// 採用有序map來模擬環
this.consistentBuckets = new TreeMap();
MessageDigest md5 = MD5.get();//用MD5來計算key和server的hash值
// 計算總權重
if ( this.totalWeight for ( int i = 0; i < this.weights.length; i++ )
this.totalWeight += ( this.weights[i] == null ) ? 1 : this.weights[i];
} else if ( this.weights == null ) {
this.totalWeight = this.servers.length;
}
// 為每個server分配虛擬節點
for ( int i = 0; i < servers.length; i++ ) {
// 計算當前server的權重
int thisWeight = 1;
if ( this.weights != null && this.weights[i] != null )
thisWeight = this.weights[i];
// factor用來控制每個server分配的虛擬節點數量
// 權重都相同時,factor=40
// 權重不同時,factor=40*server總數*該server權重所佔的百分比
// 總的來說,權重越大,factor越大,可以分配越多的虛擬節點
double factor = Math.floor( ((double)(40 * this.servers.length * thisWeight)) / (double)this.totalWeight );
for ( long j = 0; j < factor; j++ ) {
// 每個server有factor個hash值
// 使用server的域名或IP加上編號來計算hash值
// 比如server - "172.45.155.25:11111"就有factor個數據用來生成hash值:
// 172.45.155.25:11111-1, 172.45.155.25:11111-2, ..., 172.45.155.25:11111-factor
byte[] d = md5.digest( ( servers[i] + "-" + j ).getBytes() );
// 每個hash值生成4個虛擬節點
for ( int h = 0 ; h < 4; h++ ) {
Long k =
((long)(d[3+h*4]&0xFF) << 24)
| ((long)(d[2+h*4]&0xFF) << 16)
| ((long)(d[1+h*4]&0xFF) << 8 )
| ((long)(d[0+h*4]&0xFF));
// 在環上保存節點
consistentBuckets.put( k, servers[i] );
}
}
// 每個server一共分配4*factor個虛擬節點
}
// 用MD5來計算key的hash值
MessageDigest md5 = MD5.get();
md5.reset();
md5.update( key.getBytes() );
byte[] bKey = md5.digest();

// 取MD5值的低32位作為key的hash值
long hv = ((long)(bKey[3]&0xFF) << 24) | ((long)(bKey[2]&0xFF) << 16) | ((long)(bKey[1]&0xFF) << 8 ) | (long)(bKey[0]&0xFF);

// hv的tailMap的第一個虛擬節點對應的即是目標server
SortedMap tmap = this.consistentBuckets.tailMap( hv );
return ( tmap.isEmpty() ) ? this.consistentBuckets.firstKey() : tmap.firstKey();
更多問題到問題求助專區(http://bbs.hounwang.com/)

D. 如何處理數據不平衡問題

基於上一篇文章,面試被虐成渣,所以來整理和記錄下第一個問題,關於數據不平衡的問題。

以下內容參考:

https://www.cnblogs.com/charlotte77/p/10455900.html                                                                     https://www.leiphone.com/news/201706/dTRE5ow9qBVLkZSY.html

數據不平衡也可稱作數據傾斜。在實際應用中,數據集的樣本特別是分類問題上,不同標簽的樣本比例很可能是不均衡的。因此,如果直接使用演算法訓練進行分類,訓練效果可能會很差。

解決實際應用中數據不平衡問題可以從三個方面入手,分別是對數據進行處理、選擇合適的評估方法和使用合適的演算法。

1)過采樣:

    主動獲取更多的比例少的樣本數據。由於樣本比例不均衡,在條件允許的情況下可以嘗試獲取佔比少的類型的樣本數據。(PS:這就是為什麼我幾乎沒有遇到過數據不平衡的問題。每次測試使用的數據集都盡可能的完美均衡) 也可以通過使用 重復 、 自舉 或 合成 少數類過采樣等方法(SMOTE)來生成新的稀有樣品。

    直接簡單復制重復的話,如果特徵少,會導致過擬合的問題。經過改進的過抽樣方法通過在少數類中加入隨機雜訊、干擾數據或通過一定規則產生新的合成樣本 (數據增強)。

2)欠采樣:

    數據量足夠時,可以通過保留比例小的樣本數據和減少比例大的樣本數據來平衡數據集。缺點是會丟失多數類中的一些重要信息。

3)改變權重:

    對不同樣本數量的類別賦予不同的權重(通常會設置為與樣本量成反比)

4)使用K-fold交叉驗證

    值得注意的是,使用過采樣方法來解決不平衡問題時應適當地應用交叉驗證。這是因為過采樣會觀察到罕見的樣本,並根據分布函數應用自舉生成新的隨機數據,如果在過采樣之後應用交叉驗證,那麼我們所做的就是將我們的模型過擬合於一個特定的人工引導結果。這就是為什麼在過度采樣數據之前應該始終進行交叉驗證,就像實現特徵選擇一樣。只有重復采樣數據可以將隨機性引入到數據集中,以確保不會出現過擬合問題。

    K-fold交叉驗證就是把原始數據隨機分成K個部分,在這K個部分中選擇一個作為測試數據,剩餘的K-1個作為訓練數據。交叉驗證的過程實際上是將實驗重復做K次,每次實驗都從K個部分中選擇一個不同的部分作為測試數據,剩餘的數據作為訓練數據進行實驗,最後把得到的K個實驗結果平均。

    此外,還應注意訓練集和測試集的樣本的概率分布問題。若實際數據不平衡,將采樣平衡後的數據集作為訓練集訓練後,模型應用在測試集上效果仍會不好。因此,實際應用中盡可能 保持訓練和測試的樣本的概率分布是一致的。

1)謹慎選擇AUC作為評價指標:對於數據極端不平衡時,可以觀察觀察不同演算法在同一份數據下的訓練結果的precision和recall,這樣做有兩個好處,一是可以了解不同演算法對於數據的敏感程度,二是可以明確採取哪種評價指標更合適。針對機器學習中的數據不平衡問題,建議更多PR(Precision-Recall曲線),而非ROC曲線,具體原因畫圖即可得知,如果採用ROC曲線來作為評價指標,很容易因為AUC值高而忽略實際對少量樣本的效果其實並不理想的情況。

2)不要只看Accuracy:Accuracy可以說是最模糊的一個指標了,因為這個指標高可能壓根就不能代表業務的效果好,在實際生產中更關注precision/recall/mAP等具體的指標,具體側重那個指標,得結合實際情況看。

1)選擇對數據傾斜相對不敏感的演算法。如樹模型等。

2)集成學習。即多模型Bagging。首先從多數類中獨立隨機抽取出若乾子集,將每個子集與少數類數據聯合起來訓練生成多個基分類器,再加權組成新的分類器,如加法模型、Adaboost、隨機森林等。

3)轉化成異常檢測或者一分類問題。(具體內容後續有時間再跟進學習)

補充:什麼是數據增強(Data Augmentation)?

參考鏈接:https://www.jianshu.com/p/3e9f4812abbc

數據增強讓有限的數據產生更多的數據,增加訓練樣本的數量以及多樣性(雜訊數據), 提升模型魯棒性, 一般用於訓練集。神經網路需要大量的參數,許許多多的神經網路的參數都是數以百萬計,而使得這些參數可以正確工作則需要大量的數據進行訓練,但在很多實際的項目中,我們難以找到充足的數據來完成任務。隨機改變訓練樣本可以降低模型對某些屬性的依賴,從而提高模型的泛化能力。

數據增強方法:

例如,我們可以對圖像進行不同方式的裁剪,讓物體以不同的實例出現在圖像的不同位置,這同樣能夠降低模型對目標位置的敏感性。此外,調整亮度、對比度、飽和度和色調 等因素來降低模型對色彩的敏感度。再有,隨機裁剪、隨機反轉、隨機對比度增強、顏色變化等等。一般來講隨機反轉和一個小比例的random resize,再接隨機裁剪比較常用。NLP中將字和詞連接起來就形成了一個新樣本,也屬於數據增強。

數據增強的分類:

數據增強可以分為兩類,一類是離線增強,一類是在線增強。

· 離線增強 : 直接對數據集進行處理,數據的數目會變成增強因子乘以原數據集的數目,這種方法常常用於數據集很小的時候。

· 在線增強 : 這種增強的方法用於,獲得批量(batch)數據之後,然後對這個批量(batch)的數據進行增強,如旋轉、平移、翻折等相應的變化,由於有些數據集不能接受線性級別的增長,這種方法長用於大的數據集,很多機器學習框架已經支持了這種數據增強方式,並且可以使用 GPU 優化計算。

E. 如何解決機器學習中數據不平衡問題

首先,數據集不平衡會造成怎樣的問題呢。一般的學習器都有下面的兩個假設:一個是使得學習器的准確率最高,另外一個是學習器應該用在與訓練集有相同分布的
測試集上。如果數據不平衡,那麼學習器使得它的准確率最高肯定是更偏向於預測結果為比例更大的類別。比如說陽性的比例為1%,陰性的比例為99%,很明顯
的是即使不學習,直接預測所有結果為陰性,這樣做的准確率也能夠達到99%,而如果建立學習器也很有可能沒有辦法達到99%。這就是數據比例不平衡所造成
的問題。這樣建立的模型即使准確率再高,在實際應用的時候效果肯定不好,而且也不是我們想要的模型。

明白了數據集的不平衡對於學習過程所造成的問題,相應的解決辦法也有不少。下面是一些常用的兩類方法。
1 從數據集入手。既然數據不平衡,那我們就人為的把數據集給平衡一下。可以通過隨機采樣比例大的類別使得訓練集中大類的個數與小類相當,也可以重復小類
使得小類的個數與大類相當。前者的問題是可能會丟失信息,因為只採用部分樣本。後者的問題是可能造成過擬合,因為有重復樣本。前者的問題可以通過
esemble的方法來解決,即每次形成訓練集的時候包括所有小類樣本,同時從大類樣本中隨機選擇樣本構成訓練集,這樣重復很多次得到很多訓練集和訓練模
型。在測試的時候使用投票的方法來判斷分類結果。
除了平衡數據集外,還可以通過分別在大類和小類中篩選特徵,然後組合起來構成學習器。這樣也可能提高效果。

2 從學習器入手。最簡單的是通過改變判斷類別的cutoff來改變類別樣本比例;也可以只學習一個類別。此外,在學習的時候考慮到誤判不同樣本的不同成本,使得學習器更偏向於預測小類。這樣也能夠改進模型。

F. 如果數據分布不均勻,怎麼優化二分查找演算法

樓主是不是想求出一個最小半徑的圓,圓內包含所有的點?這個問題很有趣。

尋找這個圓的時候注意一下幾點:
1.這個圓必然穿過圖中某些靠外圍的點,這樣才是最小半徑的圓。
2.幾何中我們知道,三個點可以確定一個圓, 我們就是需要找出這三個點來.

演算法如下:1.先求這些點對應的凸包,已經有現成的演算法。
2.生成凸包後,在看凸包上哪三點確定的圓可以包含凸包。

當然如果樓主討論的不是以上所述,而是模式分類的話,建議看看數據分類方法。可以搜索關鍵字:Gaussian mixtrual model, expectation-maximization algorithm 和 k-mean algorithm 學習下相關的知識。

G. 分布不均勻怎麼進行快速排序

1.首先設定一個分界值,通過該分界值將數組分成左右兩部分。
2.將大於或等於分界值的數據放到數組右邊,小於分界值的放到數組左邊。此時左邊部分中各元素都小於或等於分界值,而右邊部分中各元素都大於或等於分界值。
3.然後,左邊和右邊的數據可以獨立排序。對於左側的數組數據,又可以取一個分界值,將該部分數據,分成左右兩部分,同樣在左邊放置較小值,右邊放置較大值。右側的數組數據同樣做類似的處理。
4.重復上述過程,可以看出這是一個遞歸定義。通過遞歸將左邊部分排序好,再將右邊部分排序好,這樣整個數組都排序完成了。

H. Excel 圖表中X軸數據分布不是均勻的怎麼辦

I. Excel 圖表中X軸數據分布不是均勻的怎麼辦

解決的方法和詳細的操作步驟如下:

1、第一步,選擇Excel表,然後雙擊以將其打開,見下圖,轉到下面的步驟。

閱讀全文

與數據分布不均勻解決方法相關的資料

熱點內容
如何睡前長高的方法 瀏覽:115
山西黃芪食用方法 瀏覽:748
蘋果7鎖屏在哪裡設置方法 瀏覽:309
車載檯面板連接方法 瀏覽:207
工程退場費計算方法 瀏覽:861
風痹治療方法 瀏覽:62
乒乓球在家自己訓練方法 瀏覽:308
電腦椅子製作方法視頻 瀏覽:266
開盤式蚊香的正確方法 瀏覽:99
螞蟻上樹上有什麼好方法 瀏覽:408
安裝手機雙卡的方法 瀏覽:859
有什麼方法看書 瀏覽:154
種植芝麻方法 瀏覽:627
斬骨刀鍛煉方法 瀏覽:160
鋼管水管快速接頭拆卸方法 瀏覽:814
兔子掉坑裡了用什麼方法把它交上 瀏覽:796
hiv三甲醫院檢測方法 瀏覽:438
如何寫一件難忘的事有幾種方法 瀏覽:366
西方人親臉的正確方法 瀏覽:996
跆拳道簡單系腰帶方法 瀏覽:963