# !/usr/bin/python
# -*- coding:utf-8 -*- """
Re-implement kNN algorithm as a practice
使用该 kNN re-implement 的前提:
train data 的标签必须转成0,1,2,...的形式
""" # Author: 相忠良(Zhong-Liang Xiang) <ugoood@163.com>
# Finished at July 11th, 2017 import sys
from numpy import array
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets, cross_validation
from sklearn import neighbors ## Euclidean Distance
def euclidean(v1, v2):
v11 = np.mat(v1)
v22 = np.mat(v2)
return np.sqrt((v11 - v22) * ((v11 - v22).T))[0, 0] ## Cosin Distance
def cosdis(v1, v2):
return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)) ## load data
def load_data():
iris = datasets.load_iris()
return cross_validation.train_test_split(iris.data, iris.target, test_size=0.25, random_state=0) class MyKNeighborsClassifier:
predict_label = []
n_neighbors = 0
X_train = []
y_train = []
content = [] # 中间变量 def __init__(self, n_neighbors=20):
self.n_neighbors = n_neighbors
return def fit(self, X, y):
self.y_train = y
self.X_train = X def predict(self, X):
for item in X:
for sample in self.X_train:
self.content.append(euclidean(item, sample))
temp = []
i = 1
while (i <= self.n_neighbors):
index = np.argmin(self.content)
temp.append(y_train[index])
self.content[index] = sys.maxint
i += 1
self.predict_label.append(np.argmax(np.bincount(temp))) # 重要1,2
self.content = []
temp = []
return self.predict_label def score(self, X, y):
pass ## 测试用例
X_train, X_test, y_train, y_test = load_data() cls = MyKNeighborsClassifier()
cls.fit(X_train, y_train)
mine = cls.predict(X_test)
print 'my kNN: ', mine cls1 = neighbors.KNeighborsClassifier(n_neighbors=20, p=2)
cls1.fit(X_train, y_train)
sklearnkNN = cls1.predict(X_test)
print 'sklearn kNN: ', sklearnkNN
print mine == sklearnkNN
print mine == y_test '''
下面是编程过程中留下的经验
''' # 重要1: np.bincount(list)
# >>> a=[1,1,2,2,4]
# >>> print np.bincount(a)
# 结果为 [0 2 2 0 1] # 重要2: np.argmax(list)
# 返回最大值索引 # 重要3: 标识整数最大值
# >>> import sys
# >>> sys.maxint ## kNN 小示例
# def createDataset():
# group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
# labels = ['A', 'A', 'B', 'B']
# return group, labels
#
#
# dataset, labels = createDataset()
# fig = plt.figure()
# ax = fig.add_subplot(111)
# index = 0
# testdata = [0.2, 0.2]
#
# for point in dataset:
# if labels[index] == 'A':
# ax.scatter(point[0], point[1], c='blue', marker='o', s=300)
# else:
# ax.scatter(point[0], point[1], c='red', marker='^', s=300)
# index += 1
#
# ax.scatter(testdata[0], testdata[1], c='green', marker='^', s=300)
# plt.show()

重写轮子之 kNN的更多相关文章

  1. 重写轮子之 GaussionNB

    我仿照sk-learn 中 GaussionNB 的结构, 重写了该算法的轮子,命名为 MyGaussionNB, 如下: # !/usr/bin/python # -*- coding:utf-8 ...

  2. 重写轮子之 ID3

    这是半成品, 已完成了 fit() 部分, 形成了包含一棵完整树的 node 对象. 后续工作是需解析该 node对象, 完成 predict() 工作. # !/usr/bin/python # - ...

  3. 跟着大神重写的KNN 文档归类小工具

    ·背景 在知道KNN之前,楼主有时候会粗糙地做一些分类模型的计算.在拜读了Orisun大神[http://www.cnblogs.com/zhangchaoyang/articles/2162393. ...

  4. 【转】C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1)

    C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1) #region 截获消息        /// 截获消息  处理XP不能关机问题        protected ...

  5. Asp.net Mvc 请求是如何到达 MvcHandler的——UrlRoutingModule、MvcRouteHandler分析,并造个轮子

    这个是转载自:http://www.cnblogs.com/keyindex/archive/2012/08/11/2634005.html(那个比较容易忘记,希望博主不要生气的) 前言 本文假定读者 ...

  6. 拆解轮子之XRecyclerView

    简介 这个轮子是对RecyclerView的封装,主要完成了下拉刷新.上拉加载更多.RecyclerView头部.在我的Material Design学习项目中使用到了项目地址,感觉还不错.趁着毕业答 ...

  7. 跨平台技术实践案例: 用 reactxp 重写墨刀的移动端

    Authors:  Gao Cong, Perry Poon Illustrators:  Shena Bian April 20, 2019 重新编写,又一次,我们又一次重新编写了移动端应用和移动端 ...

  8. 星级评分原理 N次重写的分析

    使用的是雪碧图,用的软件是CSS Sprite Tools 第一次实现与分析: <!DOCTYPE html> <html> <head> <meta cha ...

  9. [18/11/29] 继承(extends)和方法的重写(override,不是重载)

    一.何为继承?(对原有类的扩充) 继承让我们更加容易实现类的扩展. 比如,我们定义了人类,再定义Boy类就只需要扩展人类即可.实现了代码的重用,不用再重新发明轮子(don’t  reinvent  w ...

随机推荐

  1. GIT入门笔记(12)- 删除文件、提交删除和恢复删除

    在Git中,删除也是一个修改操作,我们实战一下, 1.先添加add一个新文件test.txt到Git并且提交commit到本地版本库: $ git add test.txt$ git commit - ...

  2. win10下安装Ubuntu16.04双系统

    其实我是不喜欢系统的,之前都是在win下面进行开发,现在来了个项目,经过各种环境的安装调研,最终选择在Ubuntu下面进行开发.之前想着为啥不在虚拟机里面安装Ubuntu进行操作呢,由于虚拟机的体验不 ...

  3. Hibernate(十五):QBC检索、本地SQL检索和HQL删除

    QBC检索 QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口. 1)通过Cr ...

  4. POJ-2263 Heavy Cargo---最短路变形&&最小边的最大值

    题目链接: https://vjudge.net/problem/POJ-2263 题目大意: 有n个城市,m条连接两个城市的道路,每条道路有自己的最大复载量.现在问从城市a到城市b,车上的最大载重能 ...

  5. WPF经纬度控件

    1.需求及思路 绘制一个控件,可以设置经纬度,经纬度用double类型表示,支持绑定数据,数据更改通知.错误验证,输入检校. 大致设计界面如下图: 2.主要代码 主要代码在于计算,double类型转换 ...

  6. 控件篇:CheckedListBox的全选与反选

    private void cbXmlAll_CheckedChanged(object sender, EventArgs e) { for (int i = 0; i < cblXmlList ...

  7. requests+xpath+map爬取百度贴吧

    # requests+xpath+map爬取百度贴吧 # 目标内容:跟帖用户名,跟帖内容,跟帖时间 # 分解: # requests获取网页 # xpath提取内容 # map实现多线程爬虫 impo ...

  8. jquery中的attr()与prop()的区别

    根据官方的建议:具有 true 和 false 两个属性的属性,如 checked, selected 或者 disabled 使用prop(),其他的使用 attr()

  9. sublime高亮代码导出

    何在word/博客中使用SublimeText风格的代码高亮样式 原文链接:http://www.cnblogs.com/Wayou/p/highlight_code_with_sublimetext ...

  10. bcrypt对密码加密的一些认识(学习笔记)

    学习nodejs和mongoDB的时候,接触了用户注册和登录的一些知识. 1.关于增强用户密码的安全性 用户的密码肯定不能保存为明文,避免撞库攻击. 撞库攻击:撞库是一种针对数据库的攻击方式,方法是通 ...