R语言的二分法和knn算法

真菜鸟第一次写博客,记录下自己的所学的东西,也为了日后找的东西方便,类似云盘的

二分法:讲道理,也就是f(a)

1 确定区间[a,b],验证f(a)·f(b)<0,给定精确度ξ.
2 求区间(a,b)的中点c.
3 计算f(c).
(1) 若f(c)=0,则c就是函数的零点;
(2) 若f(a)·f(c)<0,则令b=c;
(3) 若f(c)·f(b)<0,则令a=c.
(4) 判断是否达到精确度ξ:即若|a-b|<ξ,则得到零点近似值a(或b),否则重复2-4

以下是R的代码:
f<-function(x) x^3-x-1
binary<-function(f,a,b,Accuracy){
  if(f(a)*f(b)>0){
    print("NO solution")
  }else{
      while(abs(a-b)>Accuracy){
        mid<-(a+b)/2
        if(f(mid)*f(a)>0){
          a=mid
        }else if(f(mid)*f(a)==0){
          return(mid)
        }else{
          b=mid
        }
      }
      return(mid)
  }
}
binary(f,1,2,1e-6)

knn算法:分为测试元组和训练元组
流程:1.先分别算出测试元组到训练元组的距离
           2.得到的距离按递增顺序排序
           3.得出每个测试元组到训练元组最近的K个样本
           4.计算K个样本中出现的类别频率的最高的样本
           5.于测试样本的类别作比较,得出结果
trans<- iris[sample(1:nrow(iris),nrow(iris)*0.7,replace = FALSE),]
test<-iris[-sample(1:nrow(iris),nrow(iris)*0.7,replace = FALSE),]
  matrix<-NULL
knn<-function(trans,test,k){
   test_temp<-NULL
   predict_temp<-NULL
  #计算测试元祖到这K个训练元祖的距离,
  #即用test[i,]与trans的每一列对应的值相减平方
  #训练元组标号和距离存入优先级队列
  for(i in 1:nrow(test)){
    distance = apply(trans[,1:4],1,function(x)sqrt((sum(test[i,1:4]-x)^2)))
    df<-data.frame(trans$Species,distance)
    #按距离递增顺序排序
    newdf<-df[order(df$distance),]
    #选取与当前距离最小的k个点
    #确定K 个点所在类别出现的频率
     # print(newdf[1:k,1])
    test_temp<-rbind(test_temp,as.character(test[i,5]))
    predict_temp<-rbind(predict_temp,names(which.max(table(newdf[1:k,1]))))
  
  }
    matrix<-cbind( test_temp,predict_temp)
    matrix<-as.data.frame(matrix)
    names(matrix)<- c("primite","predict")
  
   # factor(matrix)
    matrix   
        count<-nrow(matrix)
        Accurany<- nrow(matrix[which(matrix$primite==matrix$predict),])/count
        Accurany
    
}
knn(trans,test,9)

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 二分法查找算法,也叫折半查找算法,是一种在有序数组中查找特定元素的算法。其基本思想是将数组从中间分成左右两个部分,如果查找的元素比中间元素小,则在左半部分继续查找;如果查找的元素比中间元素大,则在右半部分继续查找;否则就找到了该元素。 下面是使用Python语言实现二分法查找算法的示例代码: ```python def binary_search(arr, target): left, right = 0, len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 ``` 其中,`arr`表示有序数组,`target`表示要查找的目标元素。算法通过不断缩小查找范围来实现快速查找,最终返回目标元素在数组中的索引位置。如果目标元素不存在于数组中,则返回-1。 ### 回答2: 二分法查找算法,也称为折半查找算法,是一种在有序数组中查找特定元素的高效算法。下面是使用Python语言实现二分法查找算法: ```python def binary_search(arr, target): low = 0 high = len(arr) - 1 while low <= high: mid = (low + high) // 2 if arr[mid] == target: return mid elif arr[mid] < target: low = mid + 1 else: high = mid - 1 return -1 ``` 上述代码中,`binary_search`函数接受一个有序数组`arr`和目标元素`target`作为输入。首先,定义`low`和`high`分别表示数组的最低索引和最高索引。然后,通过循环不断将搜索范围缩小至最小。 在每次循环中,首先计算中间索引`mid`,并将该索引对应的元素与目标元素进行比较。如果相等,说明已找到目标元素,函数返回该索引。如果中间元素小于目标元素,则在右半部分查找,将`low`更新为`mid + 1`。如果中间元素大于目标元素,则在左半部分查找,将`high`更新为`mid - 1`。 当`low`大于`high`时,说明整个数组已遍历完毕,目标元素未找到,函数返回-1表示未找到。 使用二分法查找算法可以极大地提高查找效率,时间复杂度为O(logN),其中N是数组的长度。 ### 回答3: 二分法查找,也称为二分查找或折半查找,是一种非常常用的查找算法。它通过将有序数组一分为二,然后判断目标元素在哪一半中,从而缩小查找范围,再将剩余的一分为二,重复这个过程直到找到目标元素或查找范围为空。 下面使用Python语言来示范如何实现二分法查找算法: ```python def binary_search(arr, target): left = 0 right = len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 ``` 在上述代码中,`arr`是输入的有序数组,`target`是要查找的目标元素。`left`和`right`分别表示当前查找范围的左右边界。通过计算中间元素的索引`mid=(left+right)//2`,可以将数组一分为二。然后根据中间元素与目标元素的大小关系,决定下一步的查找范围。如果中间元素正好是目标元素,返回其索引;如果中间元素小于目标元素,说明目标元素在右半部分,更新`left=mid+1`;如果中间元素大于目标元素,说明目标元素在左半部分,更新`right=mid-1`。重复执行上述步骤,直到找到目标元素或查找范围为空,返回-1。 使用二分法查找算法可以在有序数组中快速定位元素的位置,时间复杂度为O(log n),效率较高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值