dijkstra算法代码_深度好文:改变了我们生活方式最有影响力的5种图算法
1、Connected Components(連通域)
一張包含3個Connected Components的圖
大家應該都知道聚類是如何工作的吧?您可以將非常接近的Connected Components視為一種在相關/連接數據中查找群集/孤島的硬聚類算法。舉一個具體的例子:假設您有關于連接世界上任何兩個城市的道路的數據。你的任務是需要找出世界上所有大陸以及它們所包含的城市。你將如何實現這一目標?來想一想吧。我們用于執行此操作的Connected Components算法是基于BFS / DFS的特殊情況。我不會在這里談論它是如何工作的,但我們將看到如何使用Networkx啟動和運行代碼。應用從零售角度來看:假設,我們有很多客戶使用大量賬戶。我們可以使用Connected Components算法的一種方法是在我們的數據集中找出不同的家庭。我們可以根據相同的信用卡使用情況、相同的地址或相同的移動電話號碼等假定customer id之間的邊(路)。一旦我們有了這些連接,我們就可以運行Connected Components算法來創建單獨的集群,然后我們可以為其分配一個家庭ID。然后,我們可以使用這些家庭ID,來根據家庭需求提供個性化推薦。我們還可以使用這個家庭ID,通過創建基于家庭的分組功能來推動我們的分類算法。從財務角度來看:另一個用例是使用這些家庭ID捕獲欺詐。如果某個帳戶過去曾發生過欺詐行為,那么關聯帳戶很可能也容易受到欺詐。還有更多無限可能的應用,發揮自己的想象力吧。代碼我們將使用Python中的Networkx模塊來創建和分析圖。讓我們從一個示例圖開始,我們使用它來實現我們的目的。包含城市和城市之間的距離信息。帶有隨機距離的圖我們首先創建一個邊列表并且將添加為邊權重的距離。edgelist = [['Mannheim', 'Frankfurt', 85], ['Mannheim', 'Karlsruhe', 80], ['Erfurt', 'Wurzburg', 186], ['Munchen', 'Numberg', 167], ['Munchen', 'Augsburg', 84], ['Munchen', 'Kassel', 502], ['Numberg', 'Stuttgart', 183], ['Numberg', 'Wurzburg', 103], ['Numberg', 'Munchen', 167], ['Stuttgart', 'Numberg', 183], ['Augsburg', 'Munchen', 84], ['Augsburg', 'Karlsruhe', 250], ['Kassel', 'Munchen', 502], ['Kassel', 'Frankfurt', 173], ['Frankfurt', 'Mannheim', 85], ['Frankfurt', 'Wurzburg', 217], ['Frankfurt', 'Kassel', 173], ['Wurzburg', 'Numberg', 103], ['Wurzburg', 'Erfurt', 186], ['Wurzburg', 'Frankfurt', 217], ['Karlsruhe', 'Mannheim', 80], ['Karlsruhe', 'Augsburg', 250],["Mumbai", "Delhi",400],["Delhi", "Kolkata",500],["Kolkata", "Bangalore",600],["TX", "NY",1200],["ALB", "NY",800]]我們用?Networkx創建一個圖:g = nx.Graph()for edge in edgelist:g.add_edge(edge[0],edge[1], weight = edge[2])現在我們想從這張圖中找出不同的大陸及其城市。可以使用連接組件算法執行此操作:for i, x in enumerate(nx.connected_components(g)):print("cc"+str(i)+":",x)------------------------------------------------------------cc0: {'Frankfurt', 'Kassel', 'Munchen', 'Numberg', 'Erfurt', 'Stuttgart', 'Karlsruhe', 'Wurzburg', 'Mannheim', 'Augsburg'}cc1: {'Kolkata', 'Bangalore', 'Mumbai', 'Delhi'}cc2: {'ALB', 'NY', 'TX'}如您所見,我們能夠在數據中找到不同的Components。只需使用邊緣和頂點。該算法可以在不同的數據上運行,以滿足我上面提到的任何用例。2、Shortest Path(最短路徑)
繼續上述示例,我們將獲得德國的城市及其相應距離的圖。您想找到從法蘭克福(起始節點)前往慕尼黑的最短距離。我們用來解決這個問題的算法叫做Dijkstra算法。用Dijkstra自己的話來說:從鹿特丹到格羅寧根的最短途徑是什么:從特定城市到特定城市。這是最短路徑的算法,我花了大約20分鐘設計。一天早上,我和年輕的未婚妻在阿姆斯特丹購物,累了,我們坐在咖啡館的露臺上喝了一杯咖啡,我只想著能否做到這一點,然后我設計了最短路徑的算法。正如我所說,這是一個20分鐘的發明。事實上,它是在1959年出版的,三年后。該出版物仍然可讀,事實上,它相當不錯。它之所以如此美妙,其中一個原因就是我沒用鉛筆和紙張就設計了它。后來我才知道,沒有鉛筆和紙的設計的一個優點是你不得不避免所有可避免的復雜性。最終,令我大為驚訝的是,這個算法成了我成名的基石之一。- ?Edsger Dijkstra,接受ACM通訊公司Philip L. Frana的采訪,2001年應用Dijkstra算法的變體在Google地圖中廣泛使用,以找到最短的路線。
You are in a Walmart Store. You have different Aisles and distance between all the aisles. You want to provide the shortest pathway to the customer from Aisle A to Aisle D.
您在沃爾瑪商店。你知道不同的過道和所有過道之間的距離信息。您想要為客戶提供從A通道到D通道的最短路徑。
你已經看到LinkedIn如何顯示一級連接,二級連接。幕后發生了什么?
代碼
3、Minimum Spanning Tree(最小生成樹)
現在我們有另一個問題。我們在水管鋪設公司或互聯網光纖公司工作。我們需要使用最少量的電線/管道連接我們所擁有的圖中的所有城市。我們如何做到這一點?無向圖及其右邊的MST。應用最小生成樹在網絡設計中具有直接應用,包括計算機網絡,電信網絡,運輸網絡,供水網絡和電網(這個算法最初是為它們發明的)
MST用于近似商旅問題
聚類 - 首先構造MST,然后使用群集間距離和群集間距確定用于破壞MST中某些邊緣的閾值。
圖像分割 - 它用于圖像分割,我們首先在圖形上構建MST,其中像素是節點,像素之間的距離基于某種相似性度量(顏色,強度等)
正如你所看到的,上面是我們要鋪設的電線。
4、Pagerank(網頁排名)
這就是長期以來支持谷歌的頁面排序算法。它根據輸入和輸出鏈接的數量和質量為每個網頁分配分數。應用Pagerank可用于我們想要估算任何網絡中節點重要性的任何地方。它已被用于使用引文找到最有影響力的論文。
已被谷歌用于頁面排名
它可以用來給tweet排序——用戶和tweet作為節點。如果用戶A跟隨用戶B創建用戶之間的鏈接,如果用戶tweet / retwets一條tweet,則創建用戶和tweet之間的鏈接
推薦引擎
5、?Centrality Measures(中心度量)
您可以將許多centrality measure算法用作機器學習模型的功能。我將談談其中兩個。Betweenness Centrality:不僅擁有最多朋友的用戶是重要的,將一個地理位置連接到另一個地理位置的用戶也很重要,因為這樣可以讓用戶看到來自不同地理位置的內容。Betweenness Centrality量化特定節點在兩個其他節點之間的最短選擇路徑中的次數。Degree Centrality:?它只是節點的連接數。應用Centrality measures可以用作任何機器學習模型中的特征。代碼以下是查找子圖的Betweenness centrality的代碼。pos = nx.spring_layout(subgraph_3437)betweennessCentrality = nx.betweenness_centrality(subgraph_3437,normalized=True, endpoints=True)node_size = ?[v * 10000 for v in betweennessCentrality.values()]plt.figure(figsize=(20,20))nx.draw_networkx(subgraph_3437, pos=pos, with_labels=False,node_size=node_size )plt.axis('off')您可以在此處查看按其betweenness centrality值確定大小的節點。他們可以被認為是信息傳遞者。打破任何具有高betweenness Centrality的節點將會將圖形分成許多部分。
結論
在這篇文章中,我談到了一些改變了我們生活方式的最有影響力的圖算法。隨著社交數據的出現,網絡分析可以幫助我們改進模型和創造價值。甚至更多地了解這個世界。有很多圖算法,但這些是我最喜歡的算法。如果您愿意,請更詳細地研究算法。這是帶有整個代碼的Kaggle Kernel。https://www.kaggle.com/mlwhiz/top-graph-algorithms參考鏈接:https://towardsdatascience.com/data-scientists-the-five-graph-algorithms-that-you-should-know-30f454fa5513覺得不錯,點個在看唄
總結
以上是生活随笔為你收集整理的dijkstra算法代码_深度好文:改变了我们生活方式最有影响力的5种图算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个div 上下两行_web前端工程师如
- 下一篇: java 轻量数据库_DBTree是一个