重写轮子之 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 ...
随机推荐
- Spring Security入门(2-3)Spring Security 的运行原理 3
关键组件关系 FilterSecurityInterceptor--- authenticationManager --- UserDetailService--- accessDecisionMan ...
- C#配置文件config的使用
做程序的时候总会有一些参数,可能会调整,这时候一般情况下我都会写在配置文件里,这样方便一点. 配置文件的读取 <?xml version="1.0" encoding=&qu ...
- O(logN)中logN的底数
转载:http://blog.csdn.net/jdbc/article/details/42173751 问题: 无论是计算机算法概论.还是数据结构书中, 关于算法的时间复杂度很多都用包含O(log ...
- HRBUST1522【单调队列+DP】
题目:输入一个长度为n的整数序列(A1,A2,--,An),从中找出一段连续的长度不超过m的子序列,使得这个子序列的和最大. #include<stdio.h> #include<s ...
- Spring(三):Spring整合Hibernate
背景: 本文主要介绍使用spring-framework-4.3.8.RELEASE与hibernate-release-5.2.9.Final项目整合搭建的过程. 开发环境简介: 1).jdk 1. ...
- Java:import com.sun.awt.AWTUtilities;报错
参考网址:http://stackoverflow.com/questions/860187/access-restriction-on-class-due-to-restriction-on-req ...
- 洛谷 P2590 [ZJOI2008]树的统计(树链剖分)
题目描述一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v ...
- [LeetCode] Minimum ASCII Delete Sum for Two Strings 两个字符串的最小ASCII删除和
Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...
- Logistic Regression vs Naive Bayes
相同 逻辑回归和朴素贝叶斯都是对条件概率\(P(X|y)\)进行建模,使得最终的分类结果有很好的解释性. 不同 具体流程 逻辑回归: 假设\(P(y=1|X)\)满足逻辑函数\(h(z)=1/1+ex ...
- [Luogu 3807]【模板】卢卡斯定理
Description 给定n,m,p(1≤n,m,p≤10^5) 求 C_{n+m}^{m} \mod p 保证P为prime C表示组合数. 一个测试点内包含多组数据. Input 第一行一 ...