多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > [置頂] 用機器學習來幫助吃貨的你找最合適的聚點(Python描述)

[置頂] 用機器學習來幫助吃貨的你找最合適的聚點(Python描述)

來源:程序員人生   發布時間:2016-12-04 14:48:25 閱讀次數:4345次

Python 2.7
Pycharm 5.0.3
Geopy 1.11
圖形展現 地圖無憂-網頁版

你可能需要知道

1.機器學習之K-means算法(Python描寫)基礎
2.經緯度地址轉換的方法集合(Python描寫)
3.想要知道怎樣實現的可能還要python等相干知識
4.看官隨便


前言

這次利害了,我爬出了哈爾濱市TOP285家好吃的店,包括燒烤的TOP,餃子的TOP,醬骨的TOP等等等等,在地圖上顯示,計劃熱門,再用聚類算法計算下能不能找出吃貨最好的住宿點,能夠距離吃的各個地方行程最近,吃貨們,準備好了嗎?


目的

可視化美食熱門,計劃各類美食聚集點,計劃行程。

準備食材

首先,我不對這次排行的可信度負責,我只是直接百度的top餐廳,里面的水份大家自己權衡,甩鍋給哈爾濱美食最新榜出爐,史上最強300家美食滿足你各種挑剔!
大概是這樣的

這里寫圖片描述

怎樣爬我就不重復演示了,這里可以了解動態和靜態爬的各種方法可以參考這里,有靜態和動態的例子,這次我用靜態爬發現被攔截了,mdzz,然后我就直接上selenium+Firefox(這里有1堆用Selenium的不累述了),至于為何不上PhantomJS,我這里說下,有時候PhantomJS爬的內容沒有Firefox全,也許有人跳出來講,你個sb,他兩是1樣的啊,而且PhantomJS更加省內存,呵呵,你自己去試試就知道了,我不止1次在爬動態的時候PhantomJS遇到問題而Firefox沒有問題的(比如這個偽解決Selenium中調用PhantomJS沒法摹擬點擊(click)操作 ,連xpath都1樣,就換了個無頭,就不行了,我也有看到Stack Overflow上遇到一樣問題的,多是我手法不夠吧,也許是我真的理解錯了,到時候我自來認錯。


清洗食材

剛爬下來的數據肯定不能直接用的,又是空格又是序列的,處理的方法很多,可以用正則,sub換空格,然后splite切割,組成列表再取,洗的方法很多,具體看數據是怎樣樣的,洗完后放進冰箱,啊不是,放進txt或保存為csv,xls都可以的呢~

左一為初步爬取的數據右一為抽取出的地址

注意點

有些數據,大概34個,我清洗完以后發現有毛病,比如洗出個空格,額。。。。我嘗試用try,except檢測毛病,查看原始數據,發現源鏈接中的js寫的不標準釀成的,哎,手動改好,再清洗1遍,不要刻意為了這1兩個數據重寫清洗算法,不就是sb了想著全自動1步成型,我咋不上天啊。。。


食材腌制-定位經緯度

這個我在上1篇文章中詳細寫了如何從1個地址轉換得到相應的經緯度,可以查看經緯度地址轉換的方法集合(Python描寫)這里不再贅述,得到的數據格式有兩種以下所示

左一為地址+經緯度,逗號隔開,右一為經緯度,空格隔開
左1為地址+經緯度,逗號隔開,右1為經緯度,空格隔開,為何要生成兩個格式?由于我喜歡啊,哈哈哈


食材保存–轉化CSV

直接右鍵另存為,然后保存格式為.csv便可,有人說,為何不用csv的寫入方法啊,由于我懶啊,我懶得重新構造字典了,這里甩上1段可以寫入中文的csv格式。

import csv import codecs csvfile = file('csv_test.csv', 'wb') csvfile.write(codecs.BOM_UTF8) writer = csv.writer(csvfile) writer.writerow(['姓名', '年齡', '電話']) data = [ ('%s', '25', '1234567'), ('С李', '18', '789456') ] csvfile.close()

弄完以后大概是這樣的就能夠下鍋了

csv樣式


烹飪食材–聚類處理

我們要用的數據集是空格隔開的,至于為何空格隔開的經緯度數據,由于我之前寫好的bikmeans里面輸入項就是就是醬紫的,空格用正則比較好處理,用個list裝下Obj.[0],[1]立馬出來值了,至于Kmeans是啥,怎樣用,請看機器學習之K-means算法(Python描寫)基礎,這里處理完后,我隨機設置了5,10,15,204種聚類點,視察各種效果。代碼我在附錄放上,參考的可以直接取附錄找。聚類處理以后照舊保存如上1步的1張圖情勢,以后就能夠開始可視化了!


佳肴擺上桌–數據可視化

枯燥的數據讓人很難受,根本分析不出甚么來,而且看著枯燥,這里我用了地圖無憂這個網頁版,雖然只有7天免費期,哎,辛辛苦苦畫的圖以后不能用了,(如果有誰知道還有類似的批量經緯度點轉化圖的軟件請告知我1下)真蛋疼,這里快給大家分享看看吃貨的地圖,不看就沒了!

具體的操作,直接看教程很簡單的,我就是建圖層,然后圖層上批量放入經緯度,它就可以轉化成地圖上的點,很好玩,看個動圖,這是我把點放上的效果。

加載所有數據點產生的效果


享用佳肴–分析數據

  • 先看下各種散布把,這個是熱力圖

TOP285熱力圖

  • 這個是點陣圖

點陣圖

  • 把聚類的點加上,選了聚類點為15個

Cluster15

有些點不錯,但是有些點太扯了把,貌似不是kmeans的主旨的,他是為了找距離各熱門最近的平衡點啊,是聚類點啊,但是有幾個點明顯不是了,查看緣由。

現實和理想差距

問題所在:可以看出來,上面的點散布緣由由于這些離散點的存在,我看了最遠的點,亞布力滑雪場,的確有家店不錯,額,可是我不斟酌,我要是在市區玩,我還想去那末遠的地方?明顯不公道,所以我需要的是真的熱門區域,也就是第2幅的那樣,所以又要重新洗1下數據了,把離散點也就是噪聲去掉!


燒糊了–重新來

雖然整體上來講,這個算法沒錯,但是如果對具體問題,比如說,我就想知道哈爾濱市內有甚么比較好吃的,我懶得動,不會跑到江北或更遠的地方去吃,而且交通不方便,所以就要對經緯度集合進行切割,我找了適合返回,規定為經度范圍126.56571~126.706807,緯度返回45.706283~45.802307,主程序中添加LockHotArea子函數,進行再1次過濾便可。

def LockHotArea(location): HotArea = [] for i in location: i = re.sub("\n",",",i) i = re.split(",",i) if (i[1]>"126.56571" and i[1]<"126.706807") and (i[2]>"45.706283" and i[2]<"45.802307"): HotArea.append(i) else: print "far away from hotArea",i return HotArea

以后步驟重回前面的,最后的效果就是這樣的

HotArea


回鍋肉–再分析數據

這回應當沒有問題了,所以開始分析圖吧

聚合點--地圖自帶功能


  • 這里上20個聚類點的情況

熱力&cluster20
聚合&cluster20

  • 可以看出,聚類點的散布基本都在熱門區域,說明比較符合情況,但是K的值其實不很能肯定,需要屢次實驗k值

熱力&散點&cluster15

  • cluster15,這些點就有點為難了。能說明甚么?多是住宿的最好點把,由于離各個好吃的距離是比較近的,這本來就是kmeans的核心。

熱力&散點&cluster10

  • cluster10的時候,聚類點就開始有點夸大了,雖然說很多仍在熱力散布上,但是,有1些明顯不在熱力輻射返回內,但對能吃遍各個周圍美食的人來講,依然值得參考(這里不觸及代步工具)

熱力&散點&cluster5

  • cluster5的時候,只能算是保全大局式的選擇離熱門最近的點了,好壞需要自己判斷

回鍋肉上的1顆花椒–單點分析

這里我把24個TOP數據都擺上了圖層,可以清晰的看出這些好吃的都散布在哪,這里放上幾張示范圖,具體自己想看的,可以自己吃貨的地圖自己定位

以包子TOP為例
包子分布

  • 把包子的經緯度單獨拿出來做聚類,分析出,喜歡吃包子的人住在哪才能更方便的吃上包子!

這里寫圖片描述

  • 從上面的聚類點也能夠看出,道外區是最多包子鋪的,張包鋪我也去吃過,排骨包里面真的有排骨!差點沒把牙磕壞了,,,,跑題了,距離更多包子鋪最近的點已給出,和輻射區范圍接近,這里更合適做中轉站,由于去各個包子鋪都是最近的!

緩沖取輻射

  • 可以從圖象自帶緩沖區看堆疊部份,看包子熱門

所以綜上所述,喜歡吃包子的吃貨,可以選擇以上的點當作中轉點或住宿點,到哪一個包子鋪都是比較近的,但是!!!誰會1天3餐加夜消都吃包子??開個玩笑哈


更多組合

喜歡吃甚么,任君挑選,比如說,你又喜歡吃餃子又喜歡串串香,沒問題,看看他們都在哪。聚類我沒做,懶。和做包子聚類點類似,先把餃子的經緯度和串串香經緯度挑出來,再進行聚類便可

餃子&串串香


  • 再比如包子和扒肉你都喜歡,那末看看重合區,不愧是老道外,真的是美食天堂啊!

包子&扒肉


  • 人氣最高&口味最好~這個,額,我1家都沒去過。。。。不做分析。。。

人氣最高&口味最好


  • 固然,你還有不可兼得的燒烤&酸菜,哭

燒烤&酸菜

圖就到這,更多美食大家自己去發現,點開圖層就能夠了~


Pay Atterntion

1.再進行對熱門區域的切割的時候,需要比較閾值,出現了毛病,測試發現原來類型毛病,比較毛病,以下演示。

str1 = "250" str2 = 250 print str1 > "300" # False print str1 > 300 # True print str2 > "100" # False print str2 > 100 # True

2.調用API經度誤差的問題,具體演示這里,誤差我看了1下。能調用的API精度誤差大概百米多,沒辦法,能免費調用的API大家都懂的。

誤差圖片

固然,很多都是比較準確的,比如這些。

對比圖



總結

終究住哪,這不是我能決定的,主要還是靠交通,住宿環境和個人心情,推薦住在地鐵附近,吃貨可以選擇在中央大街附近,最繁華,也里老道外很近,好吃的很多~誒,等等,我不是在做學術研究么,怎樣成旅游節目了。。

這里寫圖片描述


附錄–代碼

這是核心程序,調用的API_get子程序太長了,請參考經緯度地址轉換的方法集合(Python描寫)或在這里進行下載使用源代碼集合

# -*- coding: utf⑻ -*- # Author:哈士奇說喵 import re import API_get #寫入txt操作子函數 def write2txt(file,txtname): f = open(txtname,'a') f.write(file) f.write("\n") f.close() # please use this with try except/finall f.close() f = open("C:\\Users\\MrLevo\\PycharmProjects\\test\\KmeansEat.txt","r") lines = f.readlines() eatlocation = [] i = 0 # 清洗+轉換經緯度 for line in lines: line = re.sub("\n"," ",line) line = re.sub(" +"," ",line) line = re.split(" ",line) try: line_shopname = line[1].strip() try: line = line[2]+line[3] #print line line = "哈爾濱市"+line line =line.strip() try: lat_lng,lng_latWithCommon = API_get.getLocation_xml(line) shopWithLocation= "%s,%s"%(line_shopname,lng_latWithCommon) print shopWithLocation eatlocation.append(shopWithLocation) #write2txt(lat_lng,"eatOnlyLocation.txt") except: print "failed %s"%line i +=1 except: line = line[2] line = "哈爾濱市"+line line =line.strip() try: lat_lng,lng_latWithCommon = API_get.getLocation_xml(line) shopWithLocation = "%s,%s"%(line_shopname,lng_latWithCommon) print shopWithLocation eatlocation.append(shopWithLocation) #write2txt(lat_lng,"eatOnlyLocation.txt") except: print "failed %s"%line i +=1 except: pass print "failed!%d"%i # 清洗熱門 def LockHotArea(location): HotArea = [] for i in location: i = re.sub("\n",",",i) i = re.split(",",i) if (i[1]>"126.56571" and i[1]<"126.706807") and (i[2]>"45.706283" and i[2]<"45.802307"): HotArea.append(i) else: print "far away from hotArea",i return HotArea HotArea = LockHotArea(eatlocation) #寫入數據 for i in HotArea: rebuild = "%s,%s,%s"%(i[0],i[1],i[2]) write2txt(rebuild,"HotAreaWithCommon.txt")

本文已結束,以下是同類型樣本,我測試著玩的



跑題項

本來想著分析1下GDP TOP
100的城市之間的關系,看看能不能用聚類的方法,得出甚么成心義的答案,可是,我覺得并沒有甚么啊,難道說,找個開會的地方,能夠離各大經濟強市距離最近的?貌似其余沒甚么用啊–不行,我不甘心白做數據和圖!

首先來個動圖!分別是10,20,40個聚類點構成的熱力輻射圖

這里寫圖片描述


數據來源

上1篇中經緯度地址轉換方法集合中已將GDP TOP100的城市爬下來并且已轉換好數據保存好了,直接拿來批量放在地圖上便可


試著分析

GDP排名城市顯示

GDP排名城市


聚合點

其中烏魯木齊市排名,由于是單點,,,,其余的都是城市聚集個數


熱力圖顯示

輻射范圍

經濟盲我就不斯以揣測了,沿海地區百花齊放,內陸地區單點開花??

請樓下補充進


聚類分析

Cluster20

藍色為聚類點,紅色為TOP10強市,黃色是剩下的TOP90城市。請告知我!能看出啥,能看出啥?????
(嚴肅臉)各大經濟城市召開峰會,誰也不服誰,到哪開會呢?好的,就找離各個經濟強市都近的中間點把,對大家還公平,還可以拉動下開會城市GDP。哈哈哈

你怎么看


最后

至于各個省的分別占都少,我沒有在做下去,覺得意義不是很大,當作練手了。


致謝

@MrLevo520–機器學習之K-means算法(Python描寫)基礎
@MrLevo520–經緯度地址轉換的方法集合(Python描寫)
哈爾濱美食最新榜出爐,史上最強300家美食滿足你各種挑剔!
偽解決Selenium中調用PhantomJS沒法摹擬點擊(click)操作

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲午夜久久久久国产 | 亚洲精品国产经典一区二区 | 国产欧美日韩图片一区二区 | 欧美操美女 | 在线视频欧美精品 | 四色网站| a级亚洲片精品久久久久久久 | 欧美日韩免费看 | 久久精品这里是免费国产 | 国产综合视频在线观看 | 特级aav毛片日本免费视频 | 日本成在线人视频免费视频 | 国产一区二区三区日韩欧美 | 俄罗斯18videosex性欧美成人 | 亚洲欧洲一区二区三区在线 | 日韩视频在线一区 | www免费视频com | 亚洲在线第一页 | 最近最新高清中文字幕 | 欧美三级在线观看视频 | 大学生毛片a左线播放 | h视频在线观看视频观看 | 日韩成人免费视频播放 | 欧美多人性受xxxx喷水 | 日韩国产欧美在线观看一区二区 | 久久亚洲国产精品五月天 | 久久精品一区二区三区中文字幕 | 国产福利资源在线 | 国内精品伊人久久大香线焦 | 亚洲一区二区三区高清不卡 | 亚洲第一页在线 | 国产欧美日韩不卡一区二区三区 | 国产精品第一页第一页 | 中文字幕成人免费高清在线 | 国产欧美日韩免费 | 免费一级毛片在线视频观看 | 国产色妇 | 国产欧美日韩精品a在线观看 | 欧美精品亚洲精品日韩专 | 最近无中文字幕视频 | www久久爱|