作者joson4921 (特务)
看板R_Language
标题[问题] 找出一个系数,让整体结果最小化
时间Wed Mar 15 01:21:16 2017
- 问题:
[问题类型]:
程式谘询(我想用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://webptt.com/cn.aspx?n=bbs/R_Language/M.1489512085.A.641.html
※ 编辑: joson4921 (140.113.119.164), 03/15/2017 01:25:03
1F:→ cywhale: 先找出grp1,2笔数 X=ifelse(Ngrp1>Ngrp2,center1,center2 03/16 09:08
回报进度,目前做出来的部分是取出 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
2F:推 cywhale: 很难看懂问题在哪,可否把实际可以执行的资料和程式贴在 03/17 12:35
3F:→ cywhale: 同一个网站页面上,问题用comment #指出来 要不然ppt贴文 03/17 12:37
4F:→ cywhale: 那麽长,看完後面就忘前面,程式又不能run,很难帮忙看 03/17 12:38
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
5F:→ cywhale: 求sum(X*(只要是正数))最小值之X当然永远是最小的X=0.5 03/18 00:57
呃...耍笨了(抱头)
我再来想想应该要怎麽写@@" 谢谢您
※ 编辑: joson4921 (1.161.174.113), 03/18/2017 01:12:23