一般k邻近

import numpy as np
import matplotlib.pyplot as pltclass K_near:def __init__(self,X,Y,K=5,p=2):self.K = Kself.X = np.array(X)self.Y = np.array(Y)self.p = pdef cauclate_dis(self,x1,x2):return np.sum(abs(x1-x2)**self.p)**(1/self.p)def predict(self,x):result=[]for x_ in x:dis_set = [self.cauclate_dis(i,x_) for i in self.X]dis_max = dis_set[:self.K]dis_label = self.Y[:self.K]for i,j in zip(dis_set[self.K:],self.Y[self.K:]):max_dis = max(dis_max)if i < max_dis:min_index = dis_max.index(max_dis)dis_max[min_index] = idis_label[min_index] = jdict = {}for i in dis_label:if i not in dict.keys():dict[i]=1else:dict[i] +=1sort_ = sorted(dict.items(), key=lambda dict:dict[1],reverse = True)predict_ = sort_[0][0]result.append(predict_)return resultdef main():x = [[1,2],[2,3],[2,2],[2,1],[9,7],[10,2],[2,5]]y = [1,1,1,-1,-1,-1,1]x_predict = [[4,2],[8,4]]plt.show()K_near_ = K_near(x,y,3,2)print(K_near_.predict(x_predict))positive_ =  np.array(x)[np.array(y) == 1]negetive_ = np.array(x)[np.array(y) == -1]plt.scatter([k[0] for k in positive_],[k[1] for k in positive_],c='r',label='1')plt.scatter([k[0] for k in negetive_], [k[1] for k in negetive_],c='b',label='0')plt.scatter([k[0] for k in x_predict], [k[1] for k in x_predict], c='g', label='0')plt.show()if __name__ == '__main__':main()######result######################
/usr/bin/python3 /Users/zhengyanzhao/PycharmProjects/tongjixuexi/K_near
[1, -1]

平衡kd树构造与邻近搜索

搜索用遍历结点代替实现,怪我太菜了,不知道原算法中另一结点的超平面到点的距离该如何计算。

import numpy as np
import matplotlib.pyplot as pltclass Node:def __init__(self,values=None,left=None,right=None,layers=None,index=None):self.values = valuesself.left = leftself.right = rightself.layers = layersself.index = indexdef get_layer(self):return self.layersdef get_index(self):return self.indexclass Build_Kdtree:def __init__(self,X):self.X = Xself.feature_dim = len(X[0])self.root = Node(layers=0)self.closest_x_true = []self.closest_dis_true = []def bulid_tree(self):def return_mid_data(x,layer):if len(x) == 0:return None,None,None,Noneelse:sample_num = len(x)cut_feature_index = layer % self.feature_dimx.sort(key=lambda x:x[cut_feature_index])mid = sample_num // 2mid_value = x[mid]left_x = x[:mid]right_x = x[mid+1:]return  mid_value,cut_feature_index,left_x,right_xdef create_tree(root,x,layer):if len(x) == 1:root.values = x[0]root.layers = layerroot.index = Noneroot.left = Noneroot.right = Noneelse:mid_value,cut_feature_index,left_x,right_x = return_mid_data(x,layer)root.values = mid_valueroot.layers = layerroot.index = cut_feature_indexif left_x:root.left = Node()create_tree(root.left,left_x,layer+1)if right_x:root.right = Node()create_tree(root.right,right_x,layer+1)create_tree(self.root,self.X,0)def print_tree(self):root = self.rootdef pre_order(root):if root:print(root.layers,root.index,root.values)pre_order(root.left)pre_order(root.right)pre_order(root)def cauclate_dis(self,x1,x2,p=2):x1 = np.array(x1)x2 = np.array(x2)return np.sum(abs(x1-x2)**p)**(1/p)def search_leave(self,x,k):def search(x,root):if root:closest_x = root.valuesclosest_dis = self.cauclate_dis(closest_x,x)if len(self.closest_x_true)<k:self.closest_x_true.append(closest_x)self.closest_dis_true.append(closest_dis)elif closest_dis<max(self.closest_dis_true):self.closest_dis_true[self.closest_dis_true.index(max(self.closest_dis_true))] = closest_disself.closest_x_true[self.closest_dis_true.index(max(self.closest_dis_true))] = closest_xif root.right:search(x,root.right)if root.left:search(x,root.left)root = self.rootif len(x) != self.feature_dim:raise IndexErrorsearch(x,root)# def search_nearest_leave(x,root):#     while root:#         if root.left is None and root.right is None:#             break#         if root.left is None and root.right is not None:#             root = root.right#             break#         if root.left is not None and root.right is None:#             root = root.left#             break#         if x[root.index] <= root.values[root.index]:#             root = root.left#         else:#             root= root.right#     closest_x = root.values#     closest_dis = self.cauclate_dis(closest_x,x)#     return closest_x,closest_dis,root## closest_x, closest_dis,root = search_nearest_leave(x,root)# closest_x_true = closest_x# closest_dis_true = closest_disdef main():x=[[2,3],[5,4],[9,6],[4,7],[8,1],[7,2]]kdtree  = Build_Kdtree(x)kdtree.bulid_tree()kdtree.print_tree()predict_x = [6.9,6]kdtree.search_leave(predict_x,2)print(kdtree.closest_x_true,kdtree.closest_dis_true)plt.scatter([k[0] for k in x], [k[1] for k in x], c='g')plt.scatter(predict_x[0],predict_x[1],c='b')plt.scatter([k[0] for k in kdtree.closest_x_true], [k[1] for k in kdtree.closest_x_true],c='r')plt.show()if __name__ == '__main__':main()######result########################
/usr/bin/python3 /Users/zhengyanzhao/PycharmProjects/tongjixuexi/kd_search_tree
0 0 [7, 2]
1 1 [5, 4]
2 None [2, 3]
2 None [4, 7]
1 1 [9, 6]
2 None [8, 1]
[[5, 4], [9, 6]] [2.7586228448267445, 2.0999999999999996]

统计学习方法第三章作业:一般k邻近、平衡kd树构造、kd树邻近搜索算法代码实现相关推荐

  1. 统计学习方法第三章 k近邻法

    文章目录 第三章 k近邻法 k近邻算法 k近邻模型的距离划分 k值的选择 k近邻分类决策规则 第三章 k近邻法 只讨论分类问题的k近邻法 k近邻三个基本要素: k值选择 距离度量 分类决策规则 k近邻 ...

  2. 统计学习方法第十一章作业:随机条件场—概率计算问题、IIS/GD学习算法、维特比预测算法 代码实现

    随机条件场-概率计算问题.IIS/GD学习算法.维特比预测算法 这一章的算法不是很好写,整整研究了好几天,代码还是有点小问题,仅供参考. 用的是书上定义的特征函数. import numpy as n ...

  3. 统计学习方法第十七章作业:LSA潜在语义分析算法 代码实现

    LSA潜在语义分析算法 import numpy as np import jieba import collectionsclass LSA:def __init__(self,text_list) ...

  4. 统计学习方法第七章作业:SVM非线性支持向量机之SMO序列最小优化算法代码实现

    SMO序列最小优化算法 import numpy as np import math from sklearn.metrics import accuracy_score from sklearn.m ...

  5. 统计学习方法第六章作业:逻辑斯谛梯度下降法、最大熵模型 IIS / DFP 算法代码实现

    逻辑斯谛梯度下降法 import numpy as np import matplotlib.pyplot as pltclass logist:def __init__(self,a=1,c=Non ...

  6. 统计学习方法第二十一章作业:PageRank迭代算法、幂法、代数算法 代码实现

    PageRank迭代算法.幂法.代数算法 import numpy as npclass PageRank:def __init__(self,M,D=0.85):self.M = np.array( ...

  7. 统计学习方法第五章作业:ID3/C4.5算法分类决策树、平方误差二叉回归树代码实现

    ID3/C4.5算法分类决策树 import numpy as np import math class Node:def __init__(self,feature_index=None,value ...

  8. 统计学习方法——第1章(个人笔记)

    统计学习方法--第1章 统计学习及监督学习概论 <统计学习方法>(第二版)李航,学习笔记 1.1 统计学习 1.特点 (1)以计算机及网络为平台,是建立在计算机及网络上的: (2)以数据为 ...

  9. 统计学习方法 - 第1章 - 概论

    全书章节 第1章 统计学习方法概论 第2章 感知机 第3章 k近邻法 第4章 朴素贝叶斯法 第5章 决策树 第6章 逻辑斯谛回归与最大熵模型 第7章 支持向量机 第8章 提升方法 第9章 EM算法及其 ...

最新文章

  1. sql server varchar最大长度_来自灵魂的拷问—知道什么是SQL执行计划吗?
  2. 《微信公众平台开发最佳实践》——第3章 基 础 接 口 3.1 接收用户消息
  3. Python 操作redis
  4. eigen3.3.8帮助文档下载 chm_MAXHUB文档v1.10.1-MAXHUB文档电脑版下载
  5. APP测试流程和测试点
  6. Web前端——HTML
  7. inline函数的用法
  8. 阿里巴巴官方最新Redis开发规范!
  9. 机器学习- 吴恩达Andrew Ng Week6 知识总结 Machine Learning System Design
  10. 关于学习 unity3D 的知识预储备
  11. Android开启桌面模式,Android Q自带桌面模式:支持大宽屏幕
  12. 一些相似单词的区别之处
  13. 华为光纤交换机zone配置
  14. 《仰天大笑出门去,这个杀手有脾气-雾满拦江》
  15. 5.2 中心极限定理
  16. linux 转发永久修改,linux-networking – 如何使用systemd在Linux中正确永久启用ip转发?...
  17. python除法保留小数_python中的除法_python中除法_python 除法_python 除法保留小数
  18. imoo c1语言设置在哪里,不再被“辣眼睛”!imoo C1 护眼功能解析
  19. 安卓6.0+关机状态下通电自动开机方案
  20. 我和妹妹的“大富翁计划”

热门文章

  1. 面试lua笔试题各种坑
  2. Oracle添加定时任务
  3. Ubuntu中安装配置和卸载FTP(转)
  4. Android事件机制详解
  5. 《设计师要懂心理学》-第五章-人如何集中注意力
  6. 从零入门 FreeRTOS操作系统之信号量
  7. c 调用易语言dll字节集,总结VC与易语言DLL互相调用的方法
  8. C语言 | C语言实现十六进制转八进制
  9. php正则重复匹配,php – 用于匹配任何长度的所有重复子串的正则表达式
  10. CEdit 控件 更新内容的 方法(可以自动滚动至末尾)