[問題] 找出一個係數,讓整體結果最小化
- 問題:
[問題類型]:
程式諮詢(我想用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
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
03/17 12:37, 3F
→
03/17 12:38, , 4F
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
03/18 00:57, 5F
呃...耍笨了(抱頭)
我再來想想應該要怎麼寫@@" 謝謝您
※ 編輯: joson4921 (1.161.174.113), 03/18/2017 01:12:23
R_Language 近期熱門文章
PTT數位生活區 即時熱門文章