1 定义画图函数,用来可视化数据分布

(注:jupyternotebook来编写的代码)

import  matplotlib.pyplot as plt
import numpy as np %config ZMQInteractiveShell.ast_node_interactivity='all'
def draw(X_train,y_train,X_new):
# 正负实例点初始化
X_po=np.zeros(X_train.shape[1])
X_ne=np.zeros(X_train.shape[1])
# 区分正、负实例点
for i in range(y_train.shape[0]):
if y_train[i]==1:
X_po=np.vstack((X_po,X_train[i]))
else:
X_ne=np.vstack((X_ne,X_train[i]))
# 实例点绘图
plt.plot(X_po[1:,0],X_po[1:,1],"g*",label="")
plt.plot(X_ne[1:, 0], X_ne[1:, 1], "rx", label="-1")
plt.plot(X_new[:, 0], X_new[:, 1], "bo", label="test_points")
# 测试点坐标值标注
for xy in zip(X_new[:, 0], X_new[:, 1]):
plt.annotate("test{}".format(xy),xy)
# 设置坐标轴
plt.axis([0,10,0,10])
plt.xlabel("x1")
plt.ylabel("x2")
# 显示图例
plt.legend()
# 显示图像
plt.show()

 2 KNN实现

import numpy as np
from collections import Counter
class KNN:
def __init__(self, X_train, y_train, k):
# 所需要的参数初始化
self.k = k
self.X_train = X_train
self.y_train = y_train def predict(self, X_new):
# 计算欧式距离
# np.linalg.norm() 表示求范数,ord = 2 表示求2阶范数
# 得到的结果形式为:[(d0, 1), (d1, -1), ...],其中d0和d1表示距离,1和-1表示标签
dist_list = [(np.linalg.norm(X_new - self.X_train[i], ord = 2), self.y_train[i]) for i in range(self.X_train.shape[0])]
# 对所有距离进行排序
dist_list.sort(key = lambda x : x[0])
# 取前k个最小距离对应的类型(也就是y值)
y_list = [dist_list[i][-1] for i in range(self.k)] # [-1, 1, 1 ,-1,...]
# 对上述k个点的分类进行统计
y_count = Counter(y_list).most_common() # [(-1, 3), (1, 2)]
return y_count[0][0]
def main():
# 训练数据集
X_train = np.array([
[5,4],
[9,6],
[4,7],
[2,3],
[8,1],
[7,2]
])
# 标签
y_train = np.array([1,1,1,-1,-1,-1])
# 测试数据
X_new = np.array([[5, 3]])
# 绘图
draw(X_train, y_train, X_new)
# k取不同值对分类结果的影响
for k in range(1,6,2): # 表示1-5每隔2个取一个数
# 构建KNN实例
clf = KNN(X_train, y_train, k=k)
# 对测试数据进行分类预测
y_predict = clf.predict(X_new)
print('k = {},被分类为:{}'.format(k, y_predict))
if __name__ == '__main__':
main()

 3 运行结果

最新文章

  1. mysql 锁优化
  2. 如何真正抓住微信小程序的红利? 阿禅知乎live总结
  3. navicat 连接sqlserver提示要安装 sql server native client
  4. 线性判别分析(LDA)准则:FIsher准则、感知机准则、最小二乘(最小均方误差)准则
  5. bitset常用函数用法记录 (转载)
  6. Spring.Net AOP实例
  7. 一个上传EXCEL导入示例
  8. cesium编程入门(三)开始使用cesium开发
  9. MySQL数据库写入图片并读取图片显示到JLabel上的详解
  10. Python函数式编程(一):高级函数
  11. JavaScript_几种创建对象(2017-07-04)
  12. centos7安装配置mysql5.6
  13. 在WPS绿色版中增加自定义皮肤
  14. Mysql 索引与Key
  15. phpstudy报告80端口被占用
  16. 【ORACLE】创建表空间
  17. 计蒜客 30994 - AC Challenge - [状压DP][2018ICPC南京网络预赛E题]
  18. jquery怎么根据后台传过来的值动态设置下拉框、单选框选中
  19. varnish squid nginx比较
  20. 【洛谷 P4072】 [SDOI2016]征途(斜率优化)

热门文章

  1. R语言 绘图——条形图可以将堆积条形图与百分比堆积条形图配合使用
  2. C#索引器1 数字作为索引号
  3. 安装win10笔记
  4. lamba
  5. js用逗号分隔字符串,保留双引号中的字符串
  6. 微信小程序-wxml-空格
  7. Day01_初识Python
  8. 整合spring cloud云架构 - 根据token获取用户信息
  9. css3 clac()方法
  10. 纯CSS手动滑动轮播图(隐藏滚动条)