2012-11-29 63 views
12

我正忙於一個涉及k-最近鄰迴歸的項目。我混合了數字和分類字段。分類值是序號(例如銀行名稱,賬戶類型)。數字類型是,例如薪水和年齡。還有一些二進制類型(例如,男性,女性)。帶分類數據的KNN分類

如何將分類值合併到KNN分析中?

據我所知,不能簡單地將每個分類字段映射到數字鍵(例如,銀行1 = 1;銀行2 = 2等),所以我需要更好的方法來使用分類字段。我聽說可以使用二進制數字 - 這是一種可行的方法嗎? 建議將不勝感激。

+0

你的問題很模糊。請添加一些示例,使其更加具體:您所處理的數據究竟是什麼?你期望得到什麼樣的聚類?基於什麼標準?你在使用什麼算法? – Shai

+0

關於將分類數據轉換爲二進制值:請參閱http://arxiv.org/pdf/1210.7070v3.pdf開頭的秒。 2描述了這種轉換。 – Shai

+1

我正在使用k-最近鄰居羣集。我想使用多個參數/維度(年齡,性別,銀行,工資,帳戶類型)在測試點周圍生成k = 20個點的聚類。對於賬戶類型,例如,您有當前賬戶,支票賬戶和儲蓄賬戶(分類數據)。然而薪水是連續的(數字)。如何使用連續字段的分類字段來執行KNN聚類? – Graham

回答

11

您需要找到適用於您的數據的距離函數。二元指示變量的使用隱含地解決了這個問題。這樣做的好處是可以繼續使用這種數據實現基於矩陣的實現,但更簡單的方法 - 適用於大多數基於距離的方法 - 只需使用修改後的距離函數。

有無數的這樣的組合。你需要試驗哪一種最適合你。本質上,您可能希望對數值使用一些經典度量標準(通常應用規範化;但將此規範化轉換爲距離函數也是有意義的),以及其他屬性上的距離,並進行適當縮放。

在大多數基於距離的算法的實際應用領域中,這是最困難的部分,可以優化您的領域特定的距離函數。您可以將其看作預處理的一部分:定義相似性。

還有很多不僅僅是歐幾里德距離。有各種各樣的理論措施可能更適合您的情況。例如Tanimoto係數,Jaccard相似度,Dice係數等。餘弦也可能是一種選擇。

有專用於相似性搜索的主題整個會議 - 沒有人聲稱這是微不足道的事情,但向量空間(實際上,甚至不存在):http://www.sisap.org/2012

+0

感謝您的回答。我仍然在努力如何實際執行此操作。我正在使用一個簡單的Matlab函數「knnsearch」,它計算每個點的歐氏距離。現在,當然,我可以說男/女= 0/1,或銀行1 = 100,銀行2 = 010,銀行3 = 001。但是,我該如何使用它?我只需要一點關於從何處開始實現距離函數的指導,以及是否有可能仍然使用Matlab的函數... – Graham

+0

我不使用Matlab,所以我不知道該如何去做。歐幾里得距離在物理2d/3d中是有意義的,但在高維非物理數據中不是那麼好。我個人不喜歡這種值的「比特編碼」。請注意,在您的示例中,男性/女性的銀行屬性(歐幾里得的距離爲0或sqrt(2))的權重較低(距離爲0或1)! –

1

將分類數據轉換爲數字的最直接方法是使用指標向量。請參閱我之前評論中發佈的參考資料。

+0

謝謝謝 - 我的文章中的技術細節讓我有些沉悶。請參閱下面的評論。 – Graham

+1

對於每個分類變量,只需創建n個維度,其中變量需要n個可能的值。這些維度中的每一個對應於一個特定值,並且它可以是0(不存在)或1(存在)。因此,你的n路分類變量現在是n個二元特徵。現在你可以使用歐幾里得距離,或者任何你喜歡的其他度量 –

+0

@BenAllison如果你的向量是二進制的(即只包含零和1),一個好的距離度量可以是** Hamming **距離:http:// en.wikipedia.org/wiki/Hamming_distance。它可以非常容易和有效地計算。 – Shai

0

我們可以使用局部敏感散列(LSH) +編輯距離並假定每個垃圾箱代表不同的類別?我知道分類數據不顯示任何順序,而LSH中的分箱根據散列函數進行排列。發現哈希函數,給我有意義的箱數聽起來像學習度量空間。