滴滴演算法大賽演算法解決過程 - 擬合演算法

来源:http://www.cnblogs.com/TextEditor/archive/2016/05/24/5522941.html
-Advertisement-
Play Games

擬合 概論 Gap的預測,是建立在一個擬合函數上的。也有一些機器學習的味道。 總的Gap函數 = 函數(時間,地區) TimeID : 時間片編號 DistricID:地區編號 Traffic:交通流量 Weather:天氣 POI:設施數 "百度地圖POI說明" 註意:每家公司的POI分類都是不同 ...


擬合

概論

Gap的預測,是建立在一個擬合函數上的。也有一些機器學習的味道。

總的Gap函數 = 函數(時間,地區)

  • TimeID : 時間片編號
  • DistricID:地區編號
  • Traffic:交通流量
  • Weather:天氣
  • POI:設施數

百度地圖POI說明
註意:每家公司的POI分類都是不同的,這裡只是將百度POI做個例子,滴滴打車的POI和百度的POI定義好像是不同的。

交通流量和時間有關,一個地方的擁堵程度和時間有關係
不同的地區,各種設施配置不同。
天氣和時間有關。

Gap函數 = 函數(交通擁擠度函數(時間,地區編號),POI函數(地區編號),天氣函數(時間))

這裡可以認為,一個地方的打車人數,交通越堵,則打車的GAP越大。天氣不好,打車的人則越多,GAP也越大。設施越多的地方,打車的需求也越多,GAP可能也越大。但是這一切都只是可能性。
(題外話,其實真實的情況也要考慮節假日的問題,在節假日的時候,GAP可能會變大。當然這是一個人文的考量了)

zhihu網友的演算法

作者:四名評論員
鏈接:你對滴滴演算法大賽賽題的解決思路是什麼?
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

利益不相關,不是參賽選手,不是滴滴工作人員,純粹覺得題目好玩。
我的分析:
這個題目的目標是預測,預測的核心是發掘信息,信息才是消除不確定性的唯一途徑。信息存在於乘客與司機的幾種行為模式,以及POI的不同功能類型。
乘客的行為基本上有三類模式,周期性的(每天上下班、每周去上補習班)、集中偶發性的(音樂會)和隨機性的(各類雜事)。司機的行為模式包括出車、收車、找活、趴活、午休。POI類型也可以分為周期性的(工作單位)、集中偶發性(電影院、體育館、演播大廳)、隨機性的(醫院、車站),當然每個POI的功能類型不是絕對的。
GAP是用車需求和供給的差,那麼分別為需求和供給建立模型。
簡單說,一個完整的打車需求包括出發地、目的地、時間。首先任意兩個POI之間都存在一條線路,每條線路的人流量可以按照乘客的行為模式進行分解,這樣也就包含了時間因素。這樣最終就可以算出從每個POI出發的人數。由於數據只有方格的總數,這看起來是一個隱馬爾科夫鏈。至於天氣則基本可以看成線路人流量的一個繫數。
司機接單在全天大多數時間里都是找活的狀態,也就是附近有單就搶,那麼某個方格某個時間片司機接單數應該是空車數量*一個繫數,空車數量=上一個時間片到達的乘客數+其他司機漫無目的找活出入方格的凈值+趴活司機數(找活、趴活數應該和poi類型有關,這得問問老司機拉活的竅門),繫數就是搶單成功率。
非專業人士,以上只是粗淺的想了一下,還有很多細節沒有考慮,拋磚引玉,達人莫笑!非專業人士,以上只是粗淺的想了一下,還有很多細節沒有考慮,拋磚引玉,達人莫笑!

演算法

交通擁堵

交通擁堵函數:
這裡的交通擁堵函數是使用4個等級表示的。

  • LV1 20條路 權重8
  • LV2 10條路 權重4
  • LV3 15條路 權重2
  • LV4 05條路 權重1
    那麼擁堵指數怎麼計算呢?這裡應該是對每個擁堵喲一個權重,等級越高,權重越大。
    擁擠度 = SUM(權重 * 數量)

在上文中 滴滴演算法大賽演算法解決過程 - 數據分析 提過了通過統計分析可以得知,LV1的路大約占2/3強,估計LV4,LV3的路是變化的關鍵。

由於數據量非常龐大,所以這裡建議將中間的計算結果也放入資料庫中備用。
博客園不支持圖片放大功能,如果您想更好的查看圖片,也可以使用以下網址獲得更好的閱讀體驗:
http://codesnippet.info/Article/Index?ArticleId=00000041

我們嘗試使用最小二分法擬合 LV4和 訂單總量
從圖中可以看到,大部分的點在一個 Y = AX+ B 的直線函數中。
(未去噪點)
A:4.67355309006603
B:18.931303546517

(去除1500以上的噪點)
A:1.08888907683687
B:192.700547917395

(這裡使用的是2016-01-01 #51 的數據)

       #region 最小二乘法擬合
        ///<summary>
        ///用最小二乘法擬合二元多次曲線
        ///例如y=ax+b
        ///其中MultiLine將返回a,b兩個參數。
        ///a對應MultiLine[1]
        ///b對應MultiLine[0]
        ///</summary>
        ///<param name="arrX">已知點的x坐標集合</param>
        ///<param name="arrY">已知點的y坐標集合</param>
        ///<param name="length">已知點的個數</param>
        ///<param name="dimension">方程的最高次數</param>
        public static double[] MultiLine(double[] arrX, double[] arrY, int length, int dimension)//二元多次線性方程擬合曲線
        {
            int n = dimension + 1;                  //dimension次方程需要求 dimension+1個 繫數
            double[,] Guass = new double[n, n + 1];      //高斯矩陣 例如:y=a0+a1*x+a2*x*x
            for (int i = 0; i < n; i++)
            {
                int j;
                for (j = 0; j < n; j++)
                {
                    Guass[i, j] = SumArr(arrX, j + i, length);
                }
                Guass[i, j] = SumArr(arrX, i, arrY, 1, length);
            }
            return ComputGauss(Guass, n);
        }

        private static double SumArr(double[] arr, int n, int length) //求數組的元素的n次方的和
        {
            double s = 0;
            for (int i = 0; i < length; i++)
            {
                if (arr[i] != 0 || n != 0)
                    s = s + Math.Pow(arr[i], n);
                else
                    s = s + 1;
            }
            return s;
        }

        private static double SumArr(double[] arr1, int n1, double[] arr2, int n2, int length)
        {
            double s = 0;
            for (int i = 0; i < length; i++)
            {
                if ((arr1[i] != 0 || n1 != 0) && (arr2[i] != 0 || n2 != 0))
                    s = s + Math.Pow(arr1[i], n1) * Math.Pow(arr2[i], n2);
                else
                    s = s + 1;
            }
            return s;
        }

        private static double[] ComputGauss(double[,] Guass, int n)
        {
            int i, j;
            int k, m;
            double temp;
            double max;
            double s;
            double[] x = new double[n];

            for (i = 0; i < n; i++) x[i] = 0.0;//初始化
            for (j = 0; j < n; j++)
            {
                max = 0;
                k = j;
                for (i = j; i < n; i++)
                {
                    if (Math.Abs(Guass[i, j]) > max)
                    {
                        max = Guass[i, j];
                        k = i;
                    }
                }
                if (k != j)
                {
                    for (m = j; m < n + 1; m++)
                    {
                        temp = Guass[j, m];
                        Guass[j, m] = Guass[k, m];
                        Guass[k, m] = temp;
                    }
                }
                if (0 == max)
                {
                    // "此線性方程為奇異線性方程" 
                    return x;
                }
                for (i = j + 1; i < n; i++)
                {
                    s = Guass[i, j];
                    for (m = j; m < n + 1; m++)
                    {
                        Guass[i, m] = Guass[i, m] - Guass[j, m] * s / (Guass[j, j]);

                    }
                }
            }
            //結束for (j=0;j<n;j++)

            for (i = n - 1; i >= 0; i--)
            {
                s = 0;
                for (j = i + 1; j < n; j++)
                {
                    s = s + Guass[i, j] * x[j];
                }

                x[i] = (Guass[i, n] - s) / Guass[i, i];

            }

            return x;
        }//返回值是函數的繫數
        #endregion

任務

  • 研究同一時間片,同一地區,按照日期變化,數據的變化。觀察天氣對數據變化的影響
  • 研究同一時間片,不同地區,POI的數量對數據變化的影響
  • 研究每個區域的需求量,可能每個區域的需求量基準數值都是差不多的。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 剛到新單位,學習他們的源代碼,代碼里讀寫系統配置文件的XML代碼比較老套,直接寫在一個系統配置類里,沒有進行類的拆分,造成類很龐大,同時,操作XML的讀寫操作都是使用SetAttribute和node.Attribute(name)方法,因此,想到結合之前所做的XML操作,完成了一個能夠讀取XML文 ...
  • 寫入: 插入100萬條數據:用InsertMany,耗時16s左右。 讀取: 讀取300萬條數據,耗時3600毫秒。 ...
  • ...
  • 這次要分享的是C#Task任務的幾個列子,感覺最實用的是封裝的分頁任務執行方法,這個方法步奏也是目前在我工作中執行多任務常用的,不知道各位也有這用的情況,那麼開始吧。 1.順序任務執行 1 //順序任務執行 2 Task.Factory.StartNew<int>(() => { Console.W ...
  • 關於面試中涉及到的事件的問題,我們只需要抓住幾個關鍵點就好了: 定義事件: 5 } ...
  • 上接 WCF學習之旅—WCF服務部署到IIS7.5(九) WCF學習之旅—WCF服務部署到應用程式(十) 七 WCF服務的Windows 服務程式寄宿 這種方式的服務寄宿,和IIS一樣有一個一樣的優點,系統啟動後,WCF服務也會跟著啟動了,不用人工干預,也是一種較好的寄宿方式。 (1) 在解決方案下 ...
  • 相關博文: "ASP.NET 5 Target framework dnx451 and dnxcore50" .NET Platform Standard:https://github.com/dotnet/corefx/blob/master/Documentation/architecture ...
  • ![圖片來自網路/圖文無關][0] 前言 在C 開發的WinForm窗體程式開發的時候,經常會使用多線程處理一些比較耗時之類的操作。不過會有一個問題:就是涉及到跨線程操作UI元素。 相信才開始接觸的人一定會遇上這個問題。 為瞭解決這個問題,可以通過委托來實現。 我為了後期使用更加方便,就將常用的幾個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...