亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

計算已知點組的密度

計算已知點組的密度

郎朗坤 2023-01-04 16:21:05
我目前正在開展一個項目,分析 AD 算法和可視化之間的相互作用。我閱讀了大量文獻,并得出結論,為了滿足我的需要,我想結合幾個指標。我能夠實現其中的大部分,但是,缺少這個:假設我有一個 2D 空間,由屬于 2 個類之一的點占據。我想計算每個組的密度。組的標簽是已知的。在查看 stackoverflow 等時,我讀了很多關于 DBSCAN 的內容,但據我了解,DBSCAN 本身用于執行聚類。我已經有了簇,想知道它們的密度。對于已知指標的任何建議或指導,我將不勝感激。如果存在,也請與我分享所需的 python 庫。非常感謝你。這是我的數據的樣子:array([[-3.90611544e+00, -5.47953465e-01],       [-5.22999684e+00,  5.56145331e-01],       [-4.84611012e+00,  5.54304197e-02],       [-4.85019718e+00, -3.19791419e-01],       [-4.59453620e+00,  5.70821744e-01],       [-6.65068624e+00, -9.97229190e-01],       [-6.57787930e+00, -5.03538827e-01],       [-4.80275333e+00, -8.42197968e-02],       [-4.55720113e+00,  8.23122108e-01],       [-4.47469205e+00, -6.77669238e-01],       [-5.84095559e+00, -8.19564981e-01],       [-4.93963103e+00, -8.66167854e-01],       [-4.98336307e+00, -4.45923700e-02],       [-4.56953722e+00, -4.27976712e-01],       [-6.25553298e+00,  1.32863878e-01],       [-6.11860914e+00, -1.09009817e+00],       [-5.60347264e+00,  1.34600670e+00],       [-4.85974421e+00, -2.03600566e-01],       [-4.38049846e+00,  1.27302889e+00],       .......像這樣的情節: 還不能包含圖片,請參見鏈接我現在想分別獲得紅色和綠色簇的密度值。非常感謝您!
查看完整描述

1 回答

?
達令說

TA貢獻1821條經驗 獲得超6個贊

更新:更正了我的代碼。另請注意,此算法的復雜度為 O(n^2):對于 10240 個點,在快速機器上運行幾乎需要 1 分鐘。


更新 2:返回倒數:count/total_distance


更新 3:如果,正如您上面提到的,密度可視化是一個目標,我認為您提供的示例圖本身就是對觀察者的密度的良好視覺表示。


更新 4:根據下面的評論,我消除了重復計算,現在算法的復雜度為 O(n^2/2),而且運行速度自然是原來的兩倍。


一個邊際改進,尤其是在有多個集群的情況下,是用一種單一顏色的色調來繪制每個集群中的點,這種顏色根據集群的平均密度而變化,比如從淺藍色到深藍色。


正如DerekG指出的那樣,您可以對上述方案使用其他密度度量。


另一個想法是通過計算每個點的鄰居數量來計算每個點的局部密度,如果鄰居的數量超過某個閾值,則通過用對比色(比如黑色)著色來在視覺上突出顯示該點。


請注意,我在此答案中提供的代碼示例可以輕松修改以實現上述任何方法,包括DerekG的方法


我不是聚類分析專家,但我會盡力提供幫助:


原始答案:


答案取決于密度的定義。如果將密度定義為集群中所有點對的平均距離,那么這段代碼就是答案:


from  math import sqrt

points = [

    [1, 3],

    [2, 4],

    [9, 1],

    [2, 6],

    [5, 3],

]

def density(points):

    total_distance = 0

    count = 0

    i = 0

    for x1,y1 in points:

        for x2,y2 in points[i+1:]:

            count += 1

            total_distance += sqrt((x1-x2)**2 + (y1-y2)**2)

        i += 1

    print(count)

    return count/total_distance


print(density(points))

哪個打?。?/p>


0.2131384729384717


查看完整回答
反對 回復 2023-01-04
  • 1 回答
  • 0 關注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號