成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

用戶(hù)地理位置的聚類(lèi)算法實(shí)現(xiàn)—基于DBSCAN和Kmeans的混合算法

garfileo / 2089人閱讀

摘要:聚類(lèi)算法簡(jiǎn)介聚類(lèi)的目標(biāo)是使同一類(lèi)對(duì)象的相似度盡可能地大不同類(lèi)對(duì)象之間的相似度盡可能地小。用戶(hù)地理位置信息的的聚類(lèi)實(shí)現(xiàn)本實(shí)驗(yàn)用實(shí)現(xiàn),依賴(lài)等科學(xué)計(jì)算。

1. 聚類(lèi)算法簡(jiǎn)介

聚類(lèi)的目標(biāo)是使同一類(lèi)對(duì)象的相似度盡可能地大;不同類(lèi)對(duì)象之間的相似度盡可能地小。目前聚類(lèi)的方法很多,根據(jù)基本思想的不同,大致可以將聚類(lèi)算法分為五大類(lèi):層次聚類(lèi)算法、分割聚類(lèi)算法、基于約束的聚類(lèi)算法、機(jī)器學(xué)習(xí)中的聚類(lèi)算法和用于高維度的聚類(lèi)算法。
以下實(shí)現(xiàn)主要選取了基于劃分的Kmeans算法和基于密度的DBSCAN算法來(lái)處理

1.1 基于劃分的Kmeans算法

一種典型的劃分聚類(lèi)算法,它用一個(gè)聚類(lèi)的中心來(lái)代表一個(gè)簇,即在迭代過(guò)程中選擇的聚點(diǎn)不一定是聚類(lèi)中的一個(gè)點(diǎn)。其目的是使各個(gè)簇(共k個(gè))中的數(shù)據(jù)點(diǎn)與所在簇質(zhì)心的誤差平方和SSE(Sum of Squared Error)達(dá)到最小,這也是評(píng)價(jià)K-means算法最后聚類(lèi)效果的評(píng)價(jià)標(biāo)準(zhǔn)。
算法的詳細(xì)原理可自行Google或Wiki。

1.2 基于密度的DBSCAN算法

一種典型的基于密度的聚類(lèi)算法,該算法采用空間索引技術(shù)來(lái)搜索對(duì)象的鄰域,引入了“核心對(duì)象”和“密度可達(dá)”等概念,從核心對(duì)象出發(fā),把所有密度可達(dá)的對(duì)象組成一個(gè)簇。簡(jiǎn)單的說(shuō)就是根據(jù)一個(gè)根據(jù)對(duì)象的密度不斷擴(kuò)展的過(guò)程的算法。一個(gè)對(duì)象O的密度可以用靠近O的對(duì)象數(shù)來(lái)判斷。

  在DBSCAN算法中將數(shù)據(jù)點(diǎn)分為一下三類(lèi):
  核心點(diǎn):在半徑Eps內(nèi)含有超過(guò)MinPts數(shù)目的點(diǎn)
  邊界點(diǎn):在半徑Eps內(nèi)點(diǎn)的數(shù)量小于MinPts,但是落在核心點(diǎn)的鄰域內(nèi)
  噪音點(diǎn):既不是核心點(diǎn)也不是邊界點(diǎn)的點(diǎn)
  這里有兩個(gè)量,一個(gè)是半徑Eps,另一個(gè)是指定的數(shù)目MinPts。
2. 用戶(hù)地理位置信息的的聚類(lèi)實(shí)現(xiàn)

本實(shí)驗(yàn)用python實(shí)現(xiàn),依賴(lài)numpy, pandas, sklearn, scipy等科學(xué)計(jì)算library。
數(shù)據(jù)來(lái)自收集得到的用戶(hù)的地理位置信息,即經(jīng)緯度數(shù)據(jù)的序列集。

xy = numpy.array([[116.455788, 39.920767], [116.456065, 39.920965], [116.452312, 39.92304], [116.421385, 39.989539],
                      [116.455685, 39.92069], [116.455876, 39.920845], [116.455973, 39.920902], [116.455645, 39.920657],
                      [116.456022, 39.920934], [116.455685, 39.920691], [116.456023, 39.920671], [116.45596, 39.920864],
                      [116.455522, 39.920856], [116.455276, 39.920407], [116.455799, 39.920867],
                      [116.455349, 39.920425], [116.45511, 39.920377], [116.455318, 39.920442], [116.455298, 39.920474],
                      [116.455839, 39.920636], [116.455979, 39.921168], [116.454281, 39.920006], [116.45598, 39.920612],
                      [116.45388, 39.919584], [116.455474, 39.920737], [116.456009, 39.920641], [116.455439, 39.920574],
                      [116.455759, 39.920841], [116.455838, 39.920644], [116.455983, 39.920847],
                      [116.459803, 39.922041], [116.456029, 39.92088], [116.455539, 39.920603], [116.455989, 39.920851],
                      [116.455719, 39.920789], [116.45601, 39.92082], [116.456229, 39.920564], [116.455906, 39.920771],
                      [116.456248, 39.920868], [116.455805, 39.920544], [116.455896, 39.920758], [116.43692, 39.926767],
                      [116.454672, 39.92024], [116.454813, 39.917848], [116.381415, 40.00875], [116.422925, 39.980757],
                      [116.422849, 39.9808], [116.38107, 40.009217], [116.456078, 39.920747], [116.455242, 39.919515],
                      [116.455615, 39.920533], [116.422092, 39.991104], [116.454847, 39.917724],
                      [116.456686, 39.924316], [116.45575, 39.920642], [116.456713, 39.924413], [116.455846, 39.920828],
                      [116.422108, 39.991098], [116.422075, 39.991139], [118.775572, 31.97337], [118.776968, 31.97392],
                      [118.778187, 31.973121], [118.775695, 31.973254], [118.775302, 31.973807],
                      [118.776303, 31.973692], [118.777541, 31.973439], [118.776196, 31.973489],
                      [116.448944, 39.926799], [116.45487, 39.917804], [116.455762, 39.920645], [116.456146, 39.920441],
                      [116.455857, 39.920043], [116.455458, 39.920826], [116.455533, 39.920791],
                      [116.455426, 39.920896], [116.45566, 39.920811], [116.455696, 39.920621], [116.453667, 39.9259],
                      [116.466606, 39.886322], [116.455917, 39.92062]])
2.1 基于Kmeans的聚類(lèi)實(shí)現(xiàn)

假設(shè)用戶(hù)的地理位置信息通常是工作地點(diǎn)和家,因此選取k值為2,代碼如下

res, idx = kmeans2(numpy.array(zip(xy[:, 0], xy[:, 1], z)), 2, iter=20, minit="points")

實(shí)現(xiàn)輸出結(jié)果

但是實(shí)際上用戶(hù)并未在河北出現(xiàn)過(guò),用戶(hù)經(jīng)常出現(xiàn)的地方除了北京的工作地方和家,還曾經(jīng)在南京出差一段時(shí)間。所以將K值設(shè)定為3,再次運(yùn)行

res, idx = kmeans2(numpy.array(zip(xy[:, 0], xy[:, 1], z)), 3, iter=20, minit="points")

輸出結(jié)果

這樣就將南京的地理位置區(qū)分出來(lái)了。工作地方和出差地方已經(jīng)非常貼合了,但是家的地方離實(shí)際距離還是差了不少距離。
其實(shí)已經(jīng)可以看出來(lái),由于用戶(hù)的出現(xiàn)地點(diǎn)不可預(yù)知,因此很難確定K值。并且Kmeans聚合得到的結(jié)果取得是聚合簇的質(zhì)心位置,并不是用戶(hù)的實(shí)際地理位置,而且我選取的是相似度量是歐式距離,而不是經(jīng)緯度計(jì)算的球面距離。因此得到的結(jié)果并不理想。

2.2 基于DBSCAN的聚類(lèi)實(shí)現(xiàn)

DBSCAN算法的重點(diǎn)是選取的聚合半徑參數(shù)和聚合所需指定的MinPts數(shù)目。
在此使用球面距離來(lái)衡量地理位置的距離,來(lái)作為聚合的半徑參數(shù)。
如下實(shí)驗(yàn),選取2公里作為密度聚合的半徑參數(shù),MinPts個(gè)數(shù)為5.

def haversine(lonlat1, lonlat2):
    lat1, lon1 = lonlat1
    lat2, lon2 = lonlat2
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])

    dlon = lon2 - lon1
    dlat = lat2 - lat1
    a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
    c = 2 * asin(sqrt(a))
    r = 6371  # Radius of earth in kilometers. Use 3956 for miles
    return c * r


def clustering_by_dbscan():
    ......
    distance_matrix = squareform(pdist(X, (lambda u, v: haversine(u, v))))

    db = DBSCAN(eps=2, min_samples=5, metric="precomputed")  
    y_db = db.fit_predict(distance_matrix)
    X["cluster"] = y_db
    ......
    plt.scatter(X["lat"], X["lng"], c=X["cluster"])
    plt.show()
輸出如下

結(jié)果顯示該用戶(hù)的地理位置信息聚合簇為4塊,在結(jié)果中分別用0.0,1.0,2.0,-1.0來(lái)標(biāo)記??梢钥闯鯠BSCAN算法可以根據(jù)用戶(hù)的活動(dòng)半徑,也就是設(shè)定的最小半徑參數(shù)2公里,將用戶(hù)的活動(dòng)地理位置數(shù)據(jù)集合分為了4簇,而且每一簇在空間上都是任意形狀的,分類(lèi)聚合的效果是不錯(cuò)的,但是得到的結(jié)果是一個(gè)個(gè)的簇,也就是一個(gè)個(gè)的地理點(diǎn)的集合,并不是一個(gè)“中心”。并且存在的噪聲點(diǎn)無(wú)法區(qū)分。

3.基于DBSCAN和Kmeans的混合算法實(shí)現(xiàn)

從上面的實(shí)驗(yàn)結(jié)果,Kmeans算法的關(guān)鍵的是 K值的選取,而我無(wú)法確定用戶(hù)地理信息聚類(lèi)的簇的個(gè)數(shù),如果實(shí)際上的地理位置的分布過(guò)于分散,按照固定K值聚合,得到的質(zhì)心的位置可能和實(shí)際位置相差甚遠(yuǎn)。而DBSCAN的算法,聚類(lèi)結(jié)果不錯(cuò),因?yàn)槭前凑赵O(shè)定的人的活動(dòng)半徑的密度可達(dá)來(lái)聚合的,但其結(jié)果是將數(shù)據(jù)集合分類(lèi),并不求出中心點(diǎn)。
因此我設(shè)計(jì)了一種基于DBSCAN和Kmeans的混合算法:先利用DBSCAN算法的密度可達(dá)特性將用戶(hù)的地理位置數(shù)據(jù)集按照活動(dòng)半徑聚合成若干個(gè)簇,并且將每一簇的數(shù)據(jù)集作為新的輸入,再利用Kmeans算法的迭代聚合求出質(zhì)心的位置,設(shè)定K值為1。
代碼如下

def clustering_by_dbscan_and_kmeans2():
    X = pd.DataFrame(
        {"lat": [39.920767, 39.920965, 39.92304, 39.989539, 39.92069, 39.920845, 39.920902, 39.920657, 39.920934,
                 39.920691, 39.920671, 39.920864, 39.920856, 39.920407, 39.920867, 39.920425, 39.920377, 39.920442,
                 39.920474, 39.920636, 39.921168, 39.920006, 39.920612, 39.919584, 39.920737, 39.920641, 39.920574,
                 39.920841, 39.920644, 39.920847, 39.922041, 39.92088, 39.920603, 39.920851, 39.920789, 39.92082,
                 39.920564, 39.920771, 39.920868, 39.920544, 39.920758, 39.926767, 39.92024, 39.917848, 40.00875,
                 39.980757, 39.9808, 40.009217, 39.920747, 39.919515, 39.920533, 39.991104, 39.917724, 39.924316,
                 39.920642, 39.924413, 39.920828, 39.991098, 39.991139, 31.97337, 31.97392, 31.973121, 31.973254,
                 31.973807, 31.973692, 31.973439, 31.973489, 39.926799, 39.917804, 39.920645, 39.920441, 39.920043,
                 39.920826, 39.920791, 39.920896, 39.920811, 39.920621, 39.9259, 39.886322, 39.92062],
         "lng": [116.455788, 116.456065, 116.452312, 116.421385, 116.455685, 116.455876, 116.455973, 116.455645,
                 116.456022, 116.455685, 116.456023, 116.45596, 116.455522, 116.455276, 116.455799, 116.455349,
                 116.45511, 116.455318, 116.455298, 116.455839, 116.455979, 116.454281, 116.45598, 116.45388,
                 116.455474, 116.456009, 116.455439, 116.455759, 116.455838, 116.455983, 116.459803, 116.456029,
                 116.455539, 116.455989, 116.455719, 116.45601, 116.456229, 116.455906, 116.456248, 116.455805,
                 116.455896, 116.43692, 116.454672, 116.454813, 116.381415, 116.422925, 116.422849, 116.38107,
                 116.456078, 116.455242, 116.455615, 116.422092, 116.454847, 116.456686, 116.45575, 116.456713,
                 116.455846, 116.422108, 116.422075, 118.775572, 118.776968, 118.778187, 118.775695, 118.775302,
                 118.776303, 118.777541, 118.776196, 116.448944, 116.45487, 116.455762, 116.456146, 116.455857,
                 116.455458, 116.455533, 116.455426, 116.45566, 116.455696, 116.453667, 116.466606, 116.455917]
         })
    distance_matrix = squareform(pdist(X, (lambda u, v: haversine(u, v))))

    db = DBSCAN(eps=2, min_samples=5, metric="precomputed")  
    y_db = db.fit_predict(distance_matrix)

    X["cluster"] = y_db

    results = {}
    for i in X.values:
        if i[2] not in results.keys():
            results[i[2]] = [[i[1], i[0]]]
        else:
            if results[i[2]]:
                results[i[2]].append([i[1], i[0]])
            else:
                results[i[2]] = [[i[1], i[0]]]
    print "DBSCAN output: ", len(results), results.keys()
    print "KMeans calc center as below: "
    for k in results.keys():
        xy = numpy.array(results[k])
        z = numpy.sin(xy[:, 1] - 0.2 * xy[:, 1])

        z = whiten(z)

        res, idx = kmeans2(numpy.array(zip(xy[:, 0], xy[:, 1], z)), 1, iter=20, minit="points")
        address_text = my_get_address_text_by_location(res[0][1], res[0][0])
        print res, address_text       

輸出如下

其中”家“,”公司“,”出差“的位置信息已經(jīng)非常貼合用戶(hù)的實(shí)際信息了。
但是仍然存在的噪聲點(diǎn)的信息。這個(gè)暫時(shí)還沒(méi)找到解決方案,下一步的思路是帶入用戶(hù)地理位置信息收集時(shí)候得到的附屬信息如時(shí)間來(lái)輔助分析,希望可以有更好的結(jié)果。


文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/44321.html

相關(guān)文章

  • ApacheCN 人工智能知識(shí)樹(shù) v1.0

    摘要:貢獻(xiàn)者飛龍版本最近總是有人問(wèn)我,把這些資料看完一遍要用多長(zhǎng)時(shí)間,如果你一本書(shū)一本書(shū)看的話,的確要用很長(zhǎng)時(shí)間。為了方便大家,我就把每本書(shū)的章節(jié)拆開(kāi),再按照知識(shí)點(diǎn)合并,手動(dòng)整理了這個(gè)知識(shí)樹(shù)。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 貢獻(xiàn)者:飛龍版...

    劉厚水 評(píng)論0 收藏0
  • Python數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí),快速掌握聚類(lèi)算法關(guān)聯(lián)分析

    摘要:摘要前文數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)技術(shù)入門(mén)實(shí)戰(zhàn)與大家分享了分類(lèi)算法,在本文中將為大家介紹聚類(lèi)算法和關(guān)聯(lián)分析問(wèn)題。比如,聚類(lèi)算法可以實(shí)現(xiàn)公司客戶(hù)價(jià)值自動(dòng)劃分,網(wǎng)頁(yè)自動(dòng)歸類(lèi)等。 摘要:前文數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)技術(shù)入門(mén)實(shí)戰(zhàn)與大家分享了分類(lèi)算法,在本文中將為大家介紹聚類(lèi)算法和關(guān)聯(lián)分析問(wèn)題。分類(lèi)算法與聚類(lèi)到底有何區(qū)別?聚類(lèi)方法應(yīng)在怎樣的場(chǎng)景下使用?如何使用關(guān)聯(lián)分析算法解決個(gè)性化推薦問(wèn)題?本文就為大家揭曉答...

    Anchorer 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<