⑴ k近鄰演算法如何做回歸分析
有兩類不同的樣本數據,分別用藍色的小正方形和紅色的小三角形表示,而圖正中間的那個綠色的圓所標示的數據則是待分類的數據。也就是說,現在, 我們不知道中間那個綠色的數據是從屬於哪一類(藍色小正方形or紅色小三角形),下面,我們就要解決這個問題:給這個綠色的圓分類。我們常說,物以類聚,人以群分,判別一個人是一個什麼樣品質特徵的人,常常可以從他/她身邊的朋友入手,所謂觀其友,而識其人。我們不是要判別上圖中那個綠色的圓是屬於哪一類數據么,好說,從它的鄰居下手。但一次性看多少個鄰居呢?從上圖中,你還能看到:
如果K=3,綠色圓點的最近的3個鄰居是2個紅色小三角形和1個藍色小正方形,少數從屬於多數,基於統計的方法,判定綠色的這個待分類點屬於紅色的三角形一類。 如果K=5,綠色圓點的最近的5個鄰居是2個紅色三角形和3個藍色的正方形,還是少數從屬於多數,基於統計的方法,判定綠色的這個待分類點屬於藍色的正方形一類。 於此我們看到,當無法判定當前待分類點是從屬於已知分類中的哪一類時,我們可以依據統計學的理論看它所處的位置特徵,衡量它周圍鄰居的權重,而把它歸為(或分配)到權重更大的那一類。這就是K近鄰演算法的核心思想。
KNN演算法中,所選擇的鄰居都是已經正確分類的對象。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。
KNN 演算法本身簡單有效,它是一種 lazy-learning 演算法,分類器不需要使用訓練集進行訓練,訓練時間復雜度為0。KNN 分類的計算復雜度和訓練集中的文檔數目成正比,也就是說,如果訓練集中文檔總數為 n,那麼 KNN 的分類時間復雜度為O(n)。
KNN方法雖然從原理上也依賴於極限定理,但在類別決策時,只與極少量的相鄰樣本有關。由於KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。
K 近鄰演算法使用的模型實際上對應於對特徵空間的劃分。K 值的選擇,距離度量和分類決策規則是該演算法的三個基本要素: K 值的選擇會對演算法的結果產生重大影響。K值較小意味著只有與輸入實例較近的訓練實例才會對預測結果起作用,但容易發生過擬合;如果 K 值較大,優點是可以減少學習的估計誤差,但缺點是學習的近似誤差增大,這時與輸入實例較遠的訓練實例也會對預測起作用,是預測發生錯誤。在實際應用中,K 值一般選擇一個較小的數值,通常採用交叉驗證的方法來選擇最優的 K 值。隨著訓練實例數目趨向於無窮和 K=1 時,誤差率不會超過貝葉斯誤差率的2倍,如果K也趨向於無窮,則誤差率趨向於貝葉斯誤差率。 該演算法中的分類決策規則往往是多數表決,即由輸入實例的 K 個最臨近的訓練實例中的多數類決定輸入實例的類別 距離度量一般採用 Lp 距離,當p=2時,即為歐氏距離,在度量之前,應該將每個屬性的值規范化,這樣有助於防止具有較大初始值域的屬性比具有較小初始值域的屬性的權重過大。 KNN演算法不僅可以用於分類,還可以用於回歸。通過找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產生的影響給予不同的權值(weight),如權值與距離成反比。該演算法在分類時有個主要的不足是,當樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本佔多數。 該演算法只計算「最近的」鄰居樣本,某一類的樣本數量很大,那麼或者這類樣本並不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數量並不能影響運行結果。可以採用權值的方法(和該樣本距離小的鄰居權值大)來改進。
該方法的另一個不足之處是計算量較大,因為對每一個待分類的文本都要計算它到全體已知樣本的距離,才能求得它的K個最近鄰點。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。該演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分。
實現 K 近鄰演算法時,主要考慮的問題是如何對訓練數據進行快速 K 近鄰搜索,這在特徵空間維數大及訓練數據容量大時非常必要。
⑵ 最近鄰分類器怎麼降低時間和空間復雜度
進行分類匹配
一般的分類器,比如決策樹和支撐向量機,只要有訓練數據可用,它們就開始學習從輸入屬性到類標號的映射模型,這類學習策略被稱為積極學習方法。與之相對的是消極學習演算法,它的策略是推遲對訓練數據的建模,在需要分類測試樣例時再進行。消極學習的一個例子是Rote分類器,它記住整個訓練集,只有當測試樣例和某個訓練樣例完全匹配時才進行分類。這個分類演算法有個明顯的缺陷就是經常會出現測試樣例不能被分類的情況,因為沒有任何訓練樣例與它們匹配。
對Rote分類器稍加改進就可以使其更具靈活性,那就是找出和測試樣例屬性比較接近的所有訓練樣例,這些訓練樣例被稱為最近鄰,可以用來確定測試樣例的類標號。這和「物以類聚,人以群分」是一個道理。最近鄰分類器把每個訓練樣例看做dd維空間上的一個點,其中dd是屬性個數,給定一個測試樣例zz,計算zz與每個訓練樣例的鄰近度,找出與之最近的kk個訓練樣例,將這kk個訓練樣例中出現最多的類標號賦給zz。
最近鄰分類器的優點是不需要為訓練集建立模型,最近鄰分類器可以生成任何形狀的決策邊界。最近鄰分類器的缺點容易受到雜訊的影響,往往需要對訓練集進行預處理才能使用,每一次分類耗時長。
⑶ 使用Node.js如何實現K最近鄰分類演算法
源於數據挖掘的一個作業, 這里用Node.js技術來實現一下這個機器學習中最簡單的演算法之一k-nearest-neighbor演算法(k最近鄰分類法)。
k-nearest-neighbor-classifier
還是先嚴謹的介紹下。急切學習法(eager learner)是在接受待分類的新元組之前就構造了分類模型,學習後的模型已經就緒,急著對未知的元組進行分類,所以稱為急切學習法,諸如決策樹歸納,貝葉斯分類等都是急切學習法的例子。惰性學習法(lazy learner)正好與其相反,直到給定一個待接受分類的新元組之後,才開始根據訓練元組構建分類模型,在此之前只是存儲著訓練元組,所以稱為惰性學習法,惰性學習法在分類進行時做更多的工作。
本文的knn演算法就是一種惰性學習法,它被廣泛應用於模式識別。knn基於類比學習,將未知的新元組與訓練元組進行對比,搜索模式空間,找出最接近未知元組的k個訓練元組,這里的k即是knn中的k。這k個訓練元祖就是待預測元組的k個最近鄰。
balabala了這么多,是不是某些同學想大喊一聲..speak Chinese! 還是來通俗的解釋下,然後再來看上面的理論應該會明白很多。小時候媽媽會指著各種各樣的東西教我們,這是小鴨子,這個紅的是蘋果等等,那我們哼哧哼哧的看著應答著,多次被教後再看到的時候我們自己就能認出來這些事物了。主要是因為我們在腦海像給這個蘋果貼了很多標簽一樣,不只是顏色這一個標簽,可能還有蘋果的形狀大小等等。這些標簽讓我們看到蘋果的時候不會誤認為是橘子。其實這些標簽就對應於機器學習中的特徵這一重要概念,而訓練我們識別的過程就對應於泛化這一概念。一台iphone戴了一個殼或者屏幕上有一道劃痕,我們還是能認得出來它,這對於我們人來說非常簡單,但蠢計算機就不知道怎麼做了,需要我們好好調教它,當然也不能過度調教2333,過度調教它要把其他手機也認成iphone那就不好了,其實這就叫過度泛化。
所以特徵就是提取對象的信息,泛化就是學習到隱含在這些特徵背後的規律,並對新的輸入給出合理的判斷。
我們可以看上圖,綠色的圓代表未知樣本,我們選取距離其最近的k個幾何圖形,這k個幾何圖形就是未知類型樣本的鄰居,如果k=3,我們可以看到有兩個紅色的三角形,有一個藍色的三正方形,由於紅色三角形所佔比例高,所以我們可以判斷未知樣本類型為紅色三角形。擴展到一般情況時,這里的距離就是我們根據樣本的特徵所計算出來的數值,再找出距離未知類型樣本最近的K個樣本,即可預測樣本類型。那麼求距離其實不同情況適合不同的方法,我們這里採用歐式距離。
綜上所述knn分類的關鍵點就是k的選取和距離的計算。
2. 實現
我的數據是一個xls文件,那麼我去npm搜了一下選了一個叫node-xlrd的包直接拿來用。
// node.js用來讀取xls文件的包
var xls = require('node-xlrd');
然後直接看文檔實例即可,把數據解析後插入到自己的數據結構里。
var data = [];// 將文件中的數據映射到樣本的屬性var map = ['a','b','c','d','e','f','g','h','i','j','k'];// 讀取文件
xls.open('data.xls', function(err,bk){
if(err) {console.log(err.name, err.message); return;}
var shtCount = bk.sheet.count;
for(var sIdx = 0; sIdx < shtCount; sIdx++ ){
var sht = bk.sheets[sIdx],
rCount = sht.row.count,
cCount = sht.column.count;
for(var rIdx = 0; rIdx < rCount; rIdx++){
var item = {};
for(var cIdx = 0; cIdx < cCount; cIdx++){
item[map[cIdx]] = sht.cell(rIdx,cIdx);
}
data.push(item);
}
}
// 等文件讀取完畢後 執行測試
run();
});
然後定義一個構造函數Sample表示一個樣本,這里是把剛生成的數據結構里的對象傳入,生成一個新的樣本。
// Sample表示一個樣本
var Sample = function (object) {
// 把傳過來的對象上的屬性克隆到新創建的樣本上
for (var key in object)
{
// 檢驗屬性是否屬於對象自身
if (object.hasOwnProperty(key)) {
this[key] = object[key];
}
}
}
再定義一個樣本集的構造函數
// SampleSet管理所有樣本 參數k表示KNN中的kvar SampleSet = function(k) {
this.samples = [];
this.k = k;
};
// 將樣本加入樣本數組
SampleSet.prototype.add = function(sample) {
this.samples.push(sample);
}
然後我們會在樣本的原型上定義很多方法,這樣每個樣本都可以用這些方法。
// 計算樣本間距離 採用歐式距離
Sample.prototype.measureDistances = function(a, b, c, d, e, f, g, h, i, j, k) {
for (var i in this.neighbors)
{
var neighbor = this.neighbors[i];
var a = neighbor.a - this.a;
var b = neighbor.b - this.b;
var c = neighbor.c - this.c;
var d = neighbor.d - this.d;
var e = neighbor.e - this.e;
var f = neighbor.f - this.f;
var g = neighbor.g - this.g;
var h = neighbor.h - this.h;
var i = neighbor.i - this.i;
var j = neighbor.j - this.j;
var k = neighbor.k - this.k;
// 計算歐式距離
neighbor.distance = Math.sqrt(a*a + b*b + c*c + d*d + e*e + f*f + g*g + h*h + i*i + j*j + k*k);
}
};
// 將鄰居樣本根據與預測樣本間距離排序
Sample.prototype.sortByDistance = function() {
this.neighbors.sort(function (a, b) {
return a.distance - b.distance;
});
};
// 判斷被預測樣本類別
Sample.prototype.guessType = function(k) {
// 有兩種類別 1和-1
var types = { '1': 0, '-1': 0 };
// 根據k值截取鄰居裡面前k個
for (var i in this.neighbors.slice(0, k))
{
var neighbor = this.neighbors[i];
types[neighbor.trueType] += 1;
}
// 判斷鄰居里哪個樣本類型多
if(types['1']>types['-1']){
this.type = '1';
} else {
this.type = '-1';
}
}
注意到我這里的數據有a-k共11個屬性,樣本有1和-1兩種類型,使用truetype和type來預測樣本類型和對比判斷是否分類成功。
最後是樣本集的原型上定義一個方法,該方法可以在整個樣本集里尋找未知類型的樣本,並生成他們的鄰居集,調用未知樣本原型上的方法來計算鄰居到它的距離,把所有鄰居按距離排序,最後猜測類型。
// 構建總樣本數組,包含未知類型樣本
SampleSet.prototype.determineUnknown = function() {
for (var i in this.samples)
{
// 如果發現沒有類型的樣本
if ( ! this.samples[i].type)
{
// 初始化未知樣本的鄰居
this.samples[i].neighbors = [];
// 生成鄰居集
for (var j in this.samples)
{
// 如果碰到未知樣本 跳過
if ( ! this.samples[j].type)
continue;
this.samples[i].neighbors.push( new Sample(this.samples[j]) );
}
// 計算所有鄰居與預測樣本的距離
this.samples[i].measureDistances(this.a, this.b, this.c, this.d, this.e, this.f, this.g, this.h, this.k);
// 把所有鄰居按距離排序
this.samples[i].sortByDistance();
// 猜測預測樣本類型
this.samples[i].guessType(this.k);
}
}
};
最後分別計算10倍交叉驗證和留一法交叉驗證的精度。
留一法就是每次只留下一個樣本做測試集,其它樣本做訓練集。
K倍交叉驗證將所有樣本分成K份,一般均分。取一份作為測試樣本,剩餘K-1份作為訓練樣本。這個過程重復K次,最後的平均測試結果可以衡量模型的性能。
k倍驗證時定義了個方法先把數組打亂隨機擺放。
// helper函數 將數組里的元素隨機擺放
function ruffle(array) {
array.sort(function (a, b) {
return Math.random() - 0.5;
})
}
剩餘測試代碼好寫,這里就不貼了。
測試結果為
用餘弦距離等計算方式可能精度會更高。
3. 總結
knn演算法非常簡單,但卻能在很多關鍵的地方發揮作用並且效果非常好。缺點就是進行分類時要掃描所有訓練樣本得到距離,訓練集大的話會很慢。
可以用這個最簡單的分類演算法來入高大上的ML的門,會有點小小的成就感。
⑷ 鄰近演算法的缺點
該演算法在分類時有個主要的不足是,當樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本佔多數。 該演算法只計算「最近的」鄰居樣本,某一類的樣本數量很大,那麼或者這類樣本並不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數量並不能影響運行結果。
該方法的另一個不足之處是計算量較大,因為對每一個待分類的文本都要計算它到全體已知樣本的距離,才能求得它的K個最近鄰點。
可理解性差,無法給出像決策樹那樣的規則。
⑸ 常用的數據凈化方法
鼠尾草煙熏凈化法
圖片來源於網路
鼠尾草的煙熏凈化法,實在是我的大愛。鼠尾草是許多儀式中的一種神聖元素。無論是在進行魔法儀式,開牌儀式,塔羅占卜、冥想之前,水晶,日常的空間凈化...我幾乎都會用到鼠尾草來進行凈化。同時鼠尾草也可以用來做茶喝或是用來製作精油。當然還有用鼠尾草、雪松、薰衣草等凈化類草葯手工製作而成的草葯棒。利用點燃後的煙霧把負能量帶走空間區域或是物品本身。用鼠尾草的煙熏來凈化,是非常快速而有效的方法。
圖片來源於網路
鼠尾草煙熏凈化使用方法:
1、在開始鼠尾草煙熏凈化前,把門窗關好,然後點燃鼠尾草,把它放在一個貝殼或防火防燙的容器里(因為在燃燒的過程中會產生灰燼)。
2、讓它的明火自然滅火,不要用嘴吹熄,我們主要是利用鼠尾草的煙來進行空間的凈化。
3、使用者首先凈化自身的能量。
4、然後在從入戶門處開始順時針方向繞著房間凈化。注意要關掉風扇或是空調,風扇的風有可能會把灰燼吹得到處都是。
5、把鼠尾草的煙霧帶入整個房屋裡,特別要注意是一些陰暗的角落可以讓煙熏久一點。如果室內空氣流通得好,你走動,基本上煙也會跟著流動。某些角落也是可以利用一根羽毛,把煙輕輕扇過去。
個人使用心得:衣櫃也是可以煙熏的,不過你的衣服上可能會留下鼠尾草的氣味,視情況而定吧,也可以用別的凈化方式代替。
6、最後,最重要的一步是,當你把鼠尾草的煙帶到房屋的每個角落後,讓這股煙停留在室內8-10分鍾(視情況而定時長),然後把窗戶打開,讓煙霧帶走這些負能量流出窗外。
7、同時,灰燼的處理,把它們裝起來,當天就扔掉或是把它們沖到馬桶里。因為灰燼也吸附了負能量了,不要留它們過夜。
圖片來源網路
通常你在市面上買到的鼠尾草可以作凈化來用。
不過題外話,小知識,墨西哥鼠尾草是有致幻性,被禁止的。
要注意的是,燒鼠尾草也要看看同屋的人能不能聞鼠尾草這個味。因為鼠尾草的味道很特別,有些人是特別喜歡這個味道的,有些人是對這個味不喜歡或是敏感的。所以如果你是居住在大家庭里,也要顧及其他人的情況。
另外,鼠尾草不能燒太多,會上頭。第一次使用鼠尾草凈化需要用足量,之後減少用量。一般情況20平的空間,20-30g可以了,太多也浪費。當然如果你覺得空間負能量實在太多,可以一把一把的土豪燒。
二、魔法蠟燭火焰凈化法
我在使用魔法蠟燭的火焰凈化
用帶有凈化功效的魔法蠟燭來進行能量的凈化,也是我的最愛之一。
因為魔法蠟燭自身就具備了土、火、風、水四大元素。另外再有 精神 這個第五元素的注入。讓火焰的光和熱驅散和燃燒任何積聚的負能量。
通常在進行任何儀式前或者是點燃其他功效的魔法蠟燭,使用帶有凈化功效的魔法蠟燭,把周圍的能量先進行凈化,再來開啟,效果會大大增加。
進行儀式或是放咒語時,你也可以在你的儀式空間東南西北四個角落裡點燃蠟燭,幫助你建立神聖空間。
手工製作的《三倍能量凈化&補充能量》靈氣魔法蠟燭
對於能量工作者來說,及時清理凈化自身及周圍的能量太重要了,無論是滿月凈化儀式還是日常凈化,我都超愛點燃這款紅色莉莉周手工製作的《三倍能量凈化&補充能量》靈氣魔法蠟燭。它不僅有凈化能量的功效,同時也協助你補充能量。提升你周圍的能量空間。同時也可以提升你的直覺力和占卜力。
⑹ 數據挖掘常用演算法有哪些
1、 樸素貝葉斯
樸素貝葉斯(NB)屬於生成式模型(即需要計算特徵與類的聯合概率分布),計算過程非常簡單,只是做了一堆計數。NB有一個條件獨立性假設,即在類已知的條件下,各個特徵之間的分布是獨立的。這樣樸素貝葉斯分類器的收斂速度將快於判別模型,如邏輯回歸,所以只需要較少的訓練數據即可。即使NB條件獨立假設不成立,NB分類器在實踐中仍然表現的很出色。它的主要缺點是它不能學習特徵間的相互作用,用mRMR中的R來講,就是特徵冗餘。
2、邏輯回歸(logistic regression)
邏輯回歸是一個分類方法,屬於判別式模型,有很多正則化模型的方法(L0,L1,L2),而且不必像在用樸素貝葉斯那樣擔心特徵是否相關。與決策樹與SVM相比,還會得到一個不錯的概率解釋,甚至可以輕松地利用新數據來更新模型(使用在線梯度下降演算法online gradient descent)。如果需要一個概率架構(比如,簡單地調節分類閾值,指明不確定性,或者是要獲得置信區間),或者希望以後將更多的訓練數據快速整合到模型中去,那麼可以使用它。
3、 線性回歸
線性回歸是用於回歸的,而不像Logistic回歸是用於分類,其基本思想是用梯度下降法對最小二乘法形式的誤差函數進行優化。
4、最近鄰演算法——KNN
KNN即最近鄰演算法,其主要過程為:計算訓練樣本和測試樣本中每個樣本點的距離(常見的距離度量有歐式距離,馬氏距離等);對上面所有的距離值進行排序;選前k個最小距離的樣本;根據這k個樣本的標簽進行投票,得到最後的分類類別;如何選擇一個最佳的K值,這取決於數據。
5、決策樹
決策樹中很重要的一點就是選擇一個屬性進行分枝,因此要注意一下信息增益的計算公式,並深入理解它。
6、SVM支持向量機
高准確率,為避免過擬合提供了很好的理論保證,而且就算數據在原特徵空間線性不可分,只要給個合適的核函數,它就能運行得很好。在動輒超高維的文本分類問題中特別受歡迎。可惜內存消耗大,難以解釋,運行和調參也有些煩人,而隨機森林卻剛好避開了這些缺點,比較實用。
⑺ 機器學習中演算法的優缺點之最近鄰演算法
機器學習中有個演算法是十分重要的,那就是最近鄰演算法,這種演算法被大家稱為KNN。我們在學習機器學習知識的時候一定要學習這種演算法,其實不管是什麼演算法都是有自己的優缺點的,KNN演算法也不例外,在這篇文章中我們就詳細的給大家介紹一下KNN演算法的優缺點,大家一定要好好學起來喲。
說到KNN演算法我們有必要說一下KNN演算法的主要過程,KNN演算法的主要過程有四種,第一就是計算訓練樣本和測試樣本中每個樣本點的距離,第二個步驟就是對上面所有的距離值進行排序(升序)。第三個步驟就是選前k個最小距離的樣本。第四個步驟就是根據這k個樣本的標簽進行投票,得到最後的分類類別。
那麼大家是否知道如何選擇一個最佳的K值,這取決於數據。一般情況下,在分類時較大的K值能夠減小雜訊的影響,但會使類別之間的界限變得模糊。一般來說,一個較好的K值可通過各種啟發式技術來獲取,比如說交叉驗證。另外雜訊和非相關性特徵向量的存在會使K近鄰演算法的准確性減小。近鄰演算法具有較強的一致性結果,隨著數據趨於無限,演算法保證錯誤率不會超過貝葉斯演算法錯誤率的兩倍。對於一些好的K值,K近鄰保證錯誤率不會超過貝葉斯理論誤差率。
那麼KNN演算法的優點是什麼呢?KNN演算法的優點具體體現在六點,第一就是對數據沒有假設,准確度高,對outlier不敏感。第二就是KNN是一種在線技術,新數據可以直接加入數據集而不必進行重新訓練。第三就是KNN理論簡單,容易實現。第四就是理論成熟,思想簡單,既可以用來做分類也可以用來做回歸。第五就是可用於非線性分類。第六就是訓練時間復雜度為O(n)。由此可見,KNN演算法的優點是有很多的。
那麼KNN演算法的缺點是什麼呢?這種演算法的缺點具體體現在六點,第一就是樣本不平衡時,預測偏差比較大。第二就是KNN每一次分類都會重新進行一次全局運算。第三就是k值大小的選擇沒有理論選擇最優,往往是結合K-折交叉驗證得到最優k值選擇。第四就是樣本不平衡問題(即有些類別的樣本數量很多,而其它樣本的數量很少)效果差。第五就是需要大量內存。第六就是對於樣本容量大的數據集計算量比較大。
正是由於這些優點和缺點,KNN演算法應用領域比較廣泛,在文本分類、模式識別、聚類分析,多分類領域中處處有KNN演算法的身影。
在這篇文章中我們給大家介紹了很多關於KNN演算法的相關知識,通過對這些知識的理解相信大家已經知道該演算法的特點了吧,希望這篇文章能夠幫助大家更好的理解KNN演算法。
⑻ 如何判別測量數據中是否有異常值
一般異常值的檢測方法有基於統計的方法,基於聚類的方法,以及一些專門檢測異常值的方法等,下面對這些方法進行相關的介紹。
1. 簡單統計
如果使用pandas,我們可以直接使用describe()來觀察數據的統計性描述(只是粗略的觀察一些統計量),不過統計數據為連續型的,如下:
df.describe()紅色箭頭所指就是異常值。
以上是常用到的判斷異常值的簡單方法。下面來介紹一些較為復雜的檢測異常值演算法,由於涉及內容較多,僅介紹核心思想,感興趣的朋友可自行深入研究。
4. 基於模型檢測
這種方法一般會構建一個概率分布模型,並計算對象符合該模型的概率,把具有低概率的對象視為異常點。如果模型是簇的集合,則異常是不顯著屬於任何簇的對象;如果模型是回歸時,異常是相對遠離預測值的對象。
離群點的概率定義:離群點是一個對象,關於數據的概率分布模型,它具有低概率。這種情況的前提是必須知道數據集服從什麼分布,如果估計錯誤就造成了重尾分布。
比如特徵工程中的RobustScaler方法,在做數據特徵值縮放的時候,它會利用數據特徵的分位數分布,將數據根據分位數劃分為多段,只取中間段來做縮放,比如只取25%分位數到75%分位數的數據做縮放。這樣減小了異常數據的影響。
優缺點:(1)有堅實的統計學理論基礎,當存在充分的數據和所用的檢驗類型的知識時,這些檢驗可能非常有效;(2)對於多元數據,可用的選擇少一些,並且對於高維數據,這些檢測可能性很差。
5. 基於近鄰度的離群點檢測
統計方法是利用數據的分布來觀察異常值,一些方法甚至需要一些分布條件,而在實際中數據的分布很難達到一些假設條件,在使用上有一定的局限性。
確定數據集的有意義的鄰近性度量比確定它的統計分布更容易。這種方法比統計學方法更一般、更容易使用,因為一個對象的離群點得分由到它的k-最近鄰(KNN)的距離給定。
需要注意的是:離群點得分對k的取值高度敏感。如果k太小,則少量的鄰近離群點可能導致較低的離群點得分;如果K太大,則點數少於k的簇中所有的對象可能都成了離群點。為了使該方案對於k的選取更具有魯棒性,可以使用k個最近鄰的平均距離。
優缺點:(1)簡單;(2)缺點:基於鄰近度的方法需要O(m2)時間,大數據集不適用;(3)該方法對參數的選擇也是敏感的;(4)不能處理具有不同密度區域的數據集,因為它使用全局閾值,不能考慮這種密度的變化。
5. 基於密度的離群點檢測
從基於密度的觀點來說,離群點是在低密度區域中的對象。基於密度的離群點檢測與基於鄰近度的離群點檢測密切相關,因為密度通常用鄰近度定義。一種常用的定義密度的方法是,定義密度為到k個最近鄰的平均距離的倒數。如果該距離小,則密度高,反之亦然。另一種密度定義是使用DBSCAN聚類演算法使用的密度定義,即一個對象周圍的密度等於該對象指定距離d內對象的個數。
優缺點:(1)給出了對象是離群點的定量度量,並且即使數據具有不同的區域也能夠很好的處理;(2)與基於距離的方法一樣,這些方法必然具有O(m2)的時間復雜度。對於低維數據使用特定的數據結構可以達到O(mlogm);(3)參數選擇是困難的。雖然LOF演算法通過觀察不同的k值,然後取得最大離群點得分來處理該問題,但是,仍然需要選擇這些值的上下界。
6. 基於聚類的方法來做異常點檢測
基於聚類的離群點:一個對象是基於聚類的離群點,如果該對象不強屬於任何簇,那麼該對象屬於離群點。
離群點對初始聚類的影響:如果通過聚類檢測離群點,則由於離群點影響聚類,存在一個問題:結構是否有效。這也是k-means演算法的缺點,對離群點敏感。為了處理該問題,可以使用如下方法:對象聚類,刪除離群點,對象再次聚類(這個不能保證產生最優結果)。
優缺點:(1)基於線性和接近線性復雜度(k均值)的聚類技術來發現離群點可能是高度有效的;(2)簇的定義通常是離群點的補,因此可能同時發現簇和離群點;(3)產生的離群點集和它們的得分可能非常依賴所用的簇的個數和數據中離群點的存在性;(4)聚類演算法產生的簇的質量對該演算法產生的離群點的質量影響非常大。
7. 專門的離群點檢測
其實以上說到聚類方法的本意是是無監督分類,並不是為了尋找離群點的,只是恰好它的功能可以實現離群點的檢測,算是一個衍生的功能。
⑼ SPSS分類分析 最近鄰元素分析
SPSS分類分析:最近鄰元素分析
一、最近鄰元素分析(分析-分類-最近鄰元素)
1、概念:根據個案間的相似性來對個案進行分類。類似個案相互靠近,而不同個案相互遠離。因此,通過兩個個案之間的距離可以測量他們的相似性。相互靠近的個案稱為「鄰元素。」當出現新個案(保持)時,將計算它與模型中每個個案之間的距離。計算得出最相似個案–最近鄰元素–的分類,並將新個案放入包含最多最近鄰元素的類別中。
2、變數:(分析-分類-最近鄰元素-變數)
◎目標(可選)。如果未指定目標(因變數或響應),則過程僅查找k個最近鄰元素–而不會執行任何分類或預測。◎標准化刻度特徵。標准化特徵具有相同的值范圍,這可改進估計演算法的性能。使用經調整後的標准化[2*(x min)/(max min)]1。調整後的標准化值介於1和1之間。◎焦點個案標識(可選)。這可以標記感興趣的個案。例如,研究員希望確定學區的測驗分數–焦點個案–是否與類似學區的測驗分數相當。他使用最近鄰元素分析來查找在給定特徵組方面最相似的學區。然後,他將焦點學區的測驗分數與最近鄰學區的分數進行比較。◎個案標簽(可選)。在特徵空間圖表、對等圖表和象限圖中使用這些值來標記個案。
3、相鄰元素:(分析-分類-最近鄰元素-相鄰元素)
1)最近鄰元素的數目(k)。指定最近鄰元素的數目。注意,使用大量的鄰元素不一定會得到更准確的模型。2)距離計算。該度規用於指定在測量個案相似性中使用的距離度規。◎Euclidean度規。兩個個案x和y之間的距離,為個案值之間的平方差在所有維度上之和的平方根。◎城市街區度規。兩個個案之間的距離是個案值之間絕對差在所有維度上之和。又稱為Manhattan距離。
4、特徵:(分析-分類-最近鄰元素-特徵)
如果在「變數」選項卡中指定了目標,使用「特徵」選項卡可以為特徵選擇請求或指定選項。默認情況下,特徵選擇會考慮所有特徵,但可以選擇特徵子集以強制納入模型。
中止准則。在每一步上,如果添加特徵可以使誤差最小(計算為分類目標的誤差率和刻度目標的平方和誤差),則考慮將其納入模型中。繼續向前選擇,直到滿足指定的條件。◎指定的特徵數目。除了那些強制納入模型的特徵外,演算法還會添加固定數目的特徵。指定一個正整數。減少所選擇的數目值可以創建更簡約的模型,但存在缺失重要特徵的風險。增加所選擇的數目值可以涵蓋所有重要特徵,但又存在因特徵添加而增加模型誤差的風險。◎絕對誤差比率的最小變化。當絕對誤差比率變化表明無法通過添加更多特徵來進一步改進模型時,演算法會停止。指定一個正數。減少最小變化值將傾向於包含更多特徵,但存在包含對模型價值不大的特徵的風險。增加最小變化值將傾向於排除更多特徵,但存在丟失對模型較重要的特徵的風險。最小變化的「最佳」值將取決於您的數據和具體應用。請參見輸出中的「特徵選擇誤差日誌」,以幫助您評估哪些特徵最重要。
5、分區(分析-分類-最近鄰元素-分區)
使用「分區」選項卡可以將數據集劃分為培訓和堅持集,並在適當時候將個案分配給交叉驗證折。
1)訓練和堅持分區。此組指定將活動數據集劃分為訓練樣本或堅持樣本的方法。訓練樣本包含用於訓練最近鄰元素模型的數據記錄;數據集中的某些個案百分比必須分配給訓練樣本以獲得一個模型。堅持樣本是用於評估最終模型的獨立數據記錄集;堅持樣本的誤差給出一個模型預測能力的「真實」估計值,因為堅持個案不用於構建模型。◎隨機分配個案到分區。指定分配給訓練樣本的個案百分比。其餘的分配給堅持樣本。◎使用變數分配個案。指定一個將活動數據集中的每個個案分配到訓練或堅持樣本中的數值變數。變數為正值的個案被分配到訓練樣本中,值為0或負值的個案被分配到堅持樣本中。具有系統缺失值的個案會從分析中排除。分區變數的任何用戶缺失值始終視為有效。
2)交叉驗證折。V折交叉驗證用於確定「最佳」鄰元素數目。因性能原因,它無法與特徵選擇結合使用。交叉驗證將樣本劃分為許多子樣本,或折。然後,生成最近鄰元素模型,並依次排除每個子樣本中的數據。第一個模型基於第一個樣本折的個案之外的所有個案,第二個模型基於第二個樣本折的個案之外的所有個案,依此類推。對於每個模型,估計其錯誤的方法是將模型應用於生成它時所排除的子樣本。「最佳」最近鄰元素數為在折中產生最小誤差的數量。◎隨機分配個案到折。指定應當用於交叉驗證的折數。該過程將個案隨機分配到折,從1編號到V(折數)。◎使用變數分配個案。指定一個將活動數據集中的每個個案分配到折中的數值變數。變數必須為數值,其值為從1到V的數字。如果此范圍中的任何值缺失,且位於任何拆分上(如果拆分文件有效),這將導致誤差。
3)為Mersenne扭曲器設置種子。設置種子允許您復制分析。使用此控制項類似於將「Mersenne扭曲器」設為活動生成器並在「隨機數生成器」對話框中指定固定起始點,兩者的重大差別在於在此對話框中設置種子會保留隨機數生成器的當前狀態並在分析完成後恢復該狀態。
二、結果說明(運行後的結果解釋)
1、模型視圖:在「輸出」選項卡中選擇圖表和表時,過程會在查看器中創建「最近鄰元素模型」對象。激活(雙擊)該對象,可獲得模型的互動式視圖。此模型視圖有2個面板窗口:◎第一個面板顯示模型概覽,稱為主視圖。◎第二個面板顯示兩種視圖類型之一
2、特徵空間:特徵空間圖表是有關特徵空間(如果存在3個以上特徵,則為子空間)的互動式圖形。每條軸代表模型中的某個特徵,圖表中的點位置顯示個案這些特徵在培訓和堅持分區中的值。
3、變數重要性:通常,您將需要將建模工作專注於最重要的變數,並考慮刪除或忽略那些最不重要的變數。變數重要性圖表可以在模型估計中指示每個變數的相對重要性,從而幫助您實現這一點。由於它們是相對值,因此顯示的所有變數的值總和為1.0。變數重要性與模型精度無關。它只與每個變數在預測中的重要性有關,而不涉及預測是否精確。
4、對等:該圖表顯示焦點個案及其在每個特徵和目標上k個最近鄰元素。它僅在「特徵空間」圖表中選擇了焦點個案時可用。
5、最近鄰元素距離:該表只顯示焦點個案的k個最近鄰元素與距離。它僅當在「變數」選項卡上指定了焦點個案標識符時可用,且僅顯示由此變數標識的焦點個案。
6、象限圖:該圖表顯示焦點個案及其在散點圖(點圖,取決於目標的測量級別)上k個最近鄰元素。目標在y軸上,刻度特徵在x軸上,按特徵劃分面板。它僅當存在目標,且在「特徵空間」圖表中選擇了焦點個案時可用。
7、特徵選擇誤差日誌:對於該圖表上的點,其y軸值為模型的誤差(誤差率或平方和誤差,取決於目標的測量級別),x軸上列出模型的特徵(加上x軸左側的所有特徵)。該圖表僅當存在目標,且特徵選擇有效時可用。
8、K選擇誤差日誌:對於該圖表上的點,其y軸值為模型的誤差(誤差率或平方和誤差,取決於目標的測量級別),x軸上為最近鄰元素數目(k)。該圖表僅當存在目標,且k選擇有效時可用。
9、分類表:該表顯示按分區對目標觀察與預測值的交叉分類。它僅當存在分類目標時可用。堅持分區中的(缺失)行包含在目標上具有缺失值的堅持個案。這些個案對「堅持樣本:整體百分比」有貢獻,但對「正確百分比」無影響。