[問題] 找出一個係數,讓整體結果最小化

看板R_Language作者 (特務)時間8年前 (2017/03/15 01:21), 8年前編輯推噓1(104)
留言5則, 1人參與, 最新討論串1/1
- 問題: [問題類型]: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) [軟體熟悉度]: 入門(寫過其他程式,只是對語法不熟悉) [問題敘述]: 先附上資料檔 BK.csv 連結如右:https://goo.gl/134FUa 如連結內資料所示, Bus_No 皆為 29, Goback 皆為 1(故此二欄位可忽略) 因為我正在做的是依據 ( Stop_No., Weekend) 兩欄位對這些資料作分群, 目前已完成分群得到: 1.分群結果 grp = 1 or 2 2.各分群對應的中心點 TravelTime_center 3.各分群之資料點數 num_grp1 和 num_grp2 現在希望再進一步找出一個 乘積(設其為X), 讓這個 X 乘上 num_grp1 或 num_grp2 其中資料點較多者的 TravelTime_center X 和 TravelTime_center 相乘之後的值 -> TravelTime_refer 最終讓同一組 (Stop_No., Weekend) 的 TravelTime_refer 和 TravelTime 相減後 之值 ArrivalDiff 乘上另一組係數 B 之後最小化 ======================================================================== 即:min( ArrivalDiff * B ), 其中若 ArrivalDiff < -120 則 B = -10 ArrivalDiff 介於-120~300 則 B = 0 ArrivalDiff > 300 則 B = 2 ======================================================================== 多虧板上前輩們的指點, 已經能用 group_by pipe 作出 BK.csv 這份資料 現在碰到的問題是所求的 X 非定值, 而是要讓後面 (給定的 B 乘上 ArrivalDiff 的結果) 最小化 弄了好幾天還是弄不出想要的結果,只好上來求救,請前輩指點! [程式範例]: # 給定的(懲罰)值 B, 以下列function表示 #################################################################### B <- function( TravelTime_refer) { ifelse( TravelTime_refer < -120, -10 , { ifelse( TravelTime_refer >= -120 & TravelTime_refer =< 300, 0, 2)})} # 目標是新增兩個欄位:TravelTime_refer(參考值), Total_Penalty(懲罰值加總) # 大概的結構如下,但這邊卡住了,因為不知道怎麼寫才能讓系統自動找出一個 X 好讓 Total_Penalty 的值最小化 #################################################################### result <- BK %>% group_by( Goback, Bus_No ) %>% mutate( TravelTime_refer = X * TravelTime_center[num_grp1或num_grp2較大者] ) %>% summarise( Total_Penalty = sum( {TravelTime - TravelTime_refer}*B ) ) ======================================================================== 主要問題敘述如上, 不好意思要再勞煩板上前輩們指點了,在這邊先謝謝大家!!! *[m [環境敘述]: 請提供 sessionInfo() 的輸出結果, 裡面含有所有你使用的作業系統、R 的版本和套件版本資訊, 讓版友更容易找出錯誤 [關鍵字]: 選擇性,也許未來有用 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.119.164 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1489512085.A.641.html ※ 編輯: joson4921 (140.113.119.164), 03/15/2017 01:25:03

03/16 09:08, , 1F
先找出grp1,2筆數 X=ifelse(Ngrp1>Ngrp2,center1,center2
03/16 09:08, 1F
回報進度,目前做出來的部分是取出 num_grp1 和 num_grp2 比較大的那群對應中心點 BK_1 <- BK %>>% group_by( Stop_No., Weekend) %>>% summarise( num_grp1 = sum(grp==1), num_grp2 = sum(grp==2), select_TTcenter = floor( ifelse( num_grp1 > num_grp2, TravelTime_center[which(grp==1)], { ifelse( num_grp1 < num_grp2, TravelTime_center[which(grp==2)], { (TravelTime_center[which(grp==1)]+TravelTime_center[which(grp==2)])/2 }) })) ) select_TTcenter 就是根據資料點數量較多的群集中心, 以 BK 來說就是能代表大部分駕駛 從A站開到B站行駛時間的點 ===================================================================== 接著是求出 X, 這邊的 X 值是ㄧ個給定的範圍 <- seq( 0.5, 1.5, 0.05 ) 找出給定範圍內可以讓 sum( X*select_TTcenter - TravelTime)最小化的 X 利用該 X 求出 TravelTime_refer = X*select_TTcenter 為達成上述目的,想用以以下程式碼實現,但這樣子跑出來的結果都是 X= 0.5 ==================================================================== BK_2 <- BK_1 %>>% group_by( Stop_No., Weekend) %>>% mutate( TravelTime_refer = X[ which.min( sum( search_penalty1( X*select_TTcenter - TravelTime)))]*select_TTcenter ) ==================================================================== 大概是這樣,目前還在努力尋找哪裡邏輯寫錯了 ※ 編輯: joson4921 (140.113.119.164), 03/16/2017 20:44:05

03/17 12:35, , 2F
很難看懂問題在哪,可否把實際可以執行的資料和程式貼在
03/17 12:35, 2F

03/17 12:37, , 3F
同一個網站頁面上,問題用comment #指出來 要不然ppt貼文
03/17 12:37, 3F

03/17 12:38, , 4F
那麼長,看完後面就忘前面,程式又不能run,很難幫忙看
03/17 12:38, 4F
c大抱歉,因為不熟悉ptt暫存檔的操作,以致於上面誤貼一大堆不相干的東西, 已修正在您的推文上方,很抱歉這是我的疏失 =================================================================== 主要問題出在 mutate()裡的 X跟後面[]的部分, 已知 X <- seq( 0.5, 1.5, 0.05) 我想要找出一個 X 讓中括號裡面的部分最小化,也就是: which.min( sum( search_penalty1( X*select_TTcenter - TravelTime))) 以讓中括號內的部分最小化求出的 X值, 但到目前為止還是找不出問題所在 再次謝謝c大撥冗閱讀,謝謝您! ※ 編輯: joson4921 (1.161.174.113), 03/18/2017 00:25:17

03/18 00:57, , 5F
求sum(X*(只要是正數))最小值之X當然永遠是最小的X=0.5
03/18 00:57, 5F
呃...耍笨了(抱頭) 我再來想想應該要怎麼寫@@" 謝謝您 ※ 編輯: joson4921 (1.161.174.113), 03/18/2017 01:12:23
文章代碼(AID): #1Oo2QLP1 (R_Language)
文章代碼(AID): #1Oo2QLP1 (R_Language)