zoukankan      html  css  js  c++  java
  • elbow 求拐点

    distancePointLine <- function(x, y, slope, intercept) {
      ## x, y is the point to test.
      ## slope, intercept is the line to check distance.
      ##
      ## Returns distance from the line.
      ##
      ## Returns 9999 on 0 denominator conditions.
      x1 <- x-10
      x2 <- x+10
      y1 <- x1*slope+intercept
      y2 <- x2*slope+intercept
      distancePointSegment(x,y, x1,y1, x2,y2)
    }

    distancePointSegment <- function(px, py, x1, y1, x2, y2) {
      ## px,py is the point to test.
      ## x1,y1,x2,y2 is the line to check distance.
      ##
      ## Returns distance from the line, or if the intersecting point on the line nearest
      ## the point tested is outside the endpoints of the line, the distance to the
      ## nearest endpoint.
      ##
      ## Returns 9999 on 0 denominator conditions.
      lineMagnitude <- function(x1, y1, x2, y2) sqrt((x2-x1)^2+(y2-y1)^2)
      ans <- NULL
      ix <- iy <- 0   # intersecting point
      lineMag <- lineMagnitude(x1, y1, x2, y2)
      if( lineMag < 0.00000001) {
        warning("short segment")
        return(9999)
      }
      u <- (((px - x1) * (x2 - x1)) + ((py - y1) * (y2 - y1)))
      u <- u / (lineMag * lineMag)
      if((u < 0.00001) || (u > 1)) {
        ## closest point does not fall within the line segment, take the shorter distance
        ## to an endpoint
        ix <- lineMagnitude(px, py, x1, y1)
        iy <- lineMagnitude(px, py, x2, y2)
        if(ix > iy)  ans <- iy
        else ans <- ix
      } else {
        ## Intersecting point is on the line, use the formula
        ix <- x1 + u * (x2 - x1)
        iy <- y1 + u * (y2 - y1)
        ans <- lineMagnitude(px, py, ix, iy)
      }
      ans
    }
    ###############################################
    mydata = read.table('clipboard',header = T)
    ##########################
    #mydata=cbind(c(1:15),wss)
    #########################
    datanumber = nrow(mydata)
    mydist = c()
    for(i in c(1:datanumber)){
      d = as.numeric(c(mydata[i,],mydata[1,],mydata[datanumber,]))
      mydist[i] = distancePointSegment(d[1],d[2],d[3],d[4],d[5],d[6])
     
    }
    mydist
    max(mydist)
    ###############
    #filternew = filter(mydist,filter = c(rep(1/datanumber,3)))
    #plot(filternew)
    ################
    elbowpoints = which(mydist==max(mydist))
    plot(mydist)
    abline(v=elbowpoints,lty=2,col='red')
    plot(x=mydata[,1],y=mydata[,2],type='l')
    elbowp = mydata[elbowpoints,1]
    elbowp
    abline(v=elbowp,lty=2,col='red')



  • 相关阅读:
    C. Uncle Bogdan and Country Happiness solution
    B
    A
    Problem of Precision solution
    hdu-2255 D
    hdu1325 Is It A Tree? solution
    一体化办公系统
    dx:ASPxGridView 批量删除
    linq 多表查询出现‘查询包含对不同数据上下文上所定义项的引用。’
    DevExpress学习笔记之ASPxMenu
  • 原文地址:https://www.cnblogs.com/arcserver/p/9186008.html
Copyright © 2011-2022 走看看