重写轮子之 kNN
# !/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的更多相关文章
- 重写轮子之 GaussionNB
我仿照sk-learn 中 GaussionNB 的结构, 重写了该算法的轮子,命名为 MyGaussionNB, 如下: # !/usr/bin/python # -*- coding:utf-8 ...
- 重写轮子之 ID3
这是半成品, 已完成了 fit() 部分, 形成了包含一棵完整树的 node 对象. 后续工作是需解析该 node对象, 完成 predict() 工作. # !/usr/bin/python # - ...
- 跟着大神重写的KNN 文档归类小工具
·背景 在知道KNN之前,楼主有时候会粗糙地做一些分类模型的计算.在拜读了Orisun大神[http://www.cnblogs.com/zhangchaoyang/articles/2162393. ...
- 【转】C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1)
C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1) #region 截获消息 /// 截获消息 处理XP不能关机问题 protected ...
- Asp.net Mvc 请求是如何到达 MvcHandler的——UrlRoutingModule、MvcRouteHandler分析,并造个轮子
这个是转载自:http://www.cnblogs.com/keyindex/archive/2012/08/11/2634005.html(那个比较容易忘记,希望博主不要生气的) 前言 本文假定读者 ...
- 拆解轮子之XRecyclerView
简介 这个轮子是对RecyclerView的封装,主要完成了下拉刷新.上拉加载更多.RecyclerView头部.在我的Material Design学习项目中使用到了项目地址,感觉还不错.趁着毕业答 ...
- 跨平台技术实践案例: 用 reactxp 重写墨刀的移动端
Authors: Gao Cong, Perry Poon Illustrators: Shena Bian April 20, 2019 重新编写,又一次,我们又一次重新编写了移动端应用和移动端 ...
- 星级评分原理 N次重写的分析
使用的是雪碧图,用的软件是CSS Sprite Tools 第一次实现与分析: <!DOCTYPE html> <html> <head> <meta cha ...
- [18/11/29] 继承(extends)和方法的重写(override,不是重载)
一.何为继承?(对原有类的扩充) 继承让我们更加容易实现类的扩展. 比如,我们定义了人类,再定义Boy类就只需要扩展人类即可.实现了代码的重用,不用再重新发明轮子(don’t reinvent w ...
随机推荐
- Angular 学习笔记 ( CDK - Portal )
Portal 的主要使用场景是 dynamic component 动态的插入模板或组件. Portal 可分为 2 种. 进入和出去 (in or out) ComponentPortal, Tem ...
- VirtualBox网络配置使用案例
VirtualBox VirtualBox is a powerful x86 and AMD64/Intel64 virtualization product for enterprise as ...
- Linux-centos-7.2-64bit 安装配置mysql
2018-04-12 安装在/usr/local/下,配置文件在/etc/my.ini 1.下载mysql安装包到 /usr/local/software cd /usr/local/software ...
- hive:数据库“行专列”操作---使用collect_set/collect_list/collect_all & row_number()over(partition by 分组字段 [order by 排序字段])
方案一:请参考<数据库“行专列”操作---使用row_number()over(partition by 分组字段 [order by 排序字段])>,该方案是sqlserver,orac ...
- 更换yum源
1. 首先备份 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2. 使用阿里云的 ...
- CentOS 7 源码编译安装MySQL 5.7.14
一.添加用户和组 1. 进入root: su 2. 添加组: groupadd mysql 3. 添加用户: useradd -r -g mysql -s /bin/false mysql 二.安装 ...
- iframe 里的高度适应的问题
iframe 这个东西功能是很强大,但是有一个巨大的问题就是高度自适应的问题: 不过这个问题,百度或者谷歌上有很多解决办法,但是,很多时候都有兼容性问题: 所有我就每个方法都试了一遍,终于找到了一个 ...
- [LeetCode] Perfect Number 完美数字
We define the Perfect Number is a positive integer that is equal to the sum of all its positive divi ...
- [ZJOI2008]瞭望塔
题目描述 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安. 我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, y1), ...
- 17.10.31&11.01
10.31模拟考试 Prob.1(AC)裸的矩阵幂 Prob.2(WA)(类似括号匹配求合法方案数) 卡特兰数的一个模型运用.可以推出一个式子(推导方法一个erge讲的,一个骚猪讲的) Prob.3( ...