本文实现了一个KNN算法,准备用作词频统计改进版本之中,这篇博文是从我另一个刚开的博客中copy过来的。

  KNN算法是一个简单的分类算法,它的动机特别简单:与一个样本点距离近的其他样本点绝大部分属于什么类别,这个样本就属于什么类别,算法的主要步骤如下:

1.计算新样本点与已知类别数据集中样本点的距离。

2.取前K个距离最近的(最相似的)点。

3.统计这K个点所在类别出现的频率。

4.选择出现频率最高的点作为新样本点的类别。

  KNN算法的优点在于一般精度高,对于异常的噪音数据不敏感。KNN一个明显的问题是当属于某个类别c的数据点在已知类别数据集中大量存在时,一个待预测的样本点的前K个最近的点总是存在很多类别c的点,解决这个问题的方法是计算类别的频率时,按照距离进行加权,使得离得近的点比离的远一些点更能影响类别频率排序的结果。

  KNN算法中K值的选定非常影响最后的结果,通常可以使用交叉检验来选取合适的k。下面是仿照sikit-learn的KNeighborsClassifier的调用方式写的KNN:

class KNN_Classifier:
def __init__(self, k):
self.k = k
self.train_data = None
self.train_labels = None def fit(self, train_data, train_labels):
self.train_data = normalize(train_data)
self.train_labels = train_labels def predict(self, test_data):
if (self.train_data is None) | (self.train_labels is None):
print 'fit train data first!'
pre_labels = []
train_data_size = len(self.train_labels)
# for every data point in test set
for x in normalize(test_data):
# calculate distance
sq_diff_mat = (np.tile(x, (train_data_size, 1)) - self.train_data) ** 2
distances = np.sum(sq_diff_mat, axis=1) ** .5
# get lowest k distances
sorted_dis_indices = distances.argsort()[0: self.k]
# count the times class occur
class_counts = {}
for idx in sorted_dis_indices:
label = labels[idx]
class_counts[label] = class_counts.get(label, 0) + 1
# sort class_count dict
sorted_class = sorted(class_counts.items(), key=lambda d: d[1], reverse=True)
# add max voted class to pre_labels
pre_labels.append(sorted_class[0][0])
return pre_labels

测试代码如下所示

    #  load data
data, labels = load_dating_data()
# split data into train set and test set
split_pos = int(len(labels) * 0.9)
train_data = normalize(data[0: split_pos])
train_labels = labels[0: split_pos]
test_data = normalize(data[split_pos: len(labels)])
test_labels = labels[split_pos: len(labels)]
# init classifier
classifier = KNN_Classifier(50)
# fit classifier
classifier.fit(train_data, train_labels)
# predict the class of test data and count error points
error_num = (test_labels != classifier.predict(test_data)).sum()
# calculate error rate and print
print 'error rate is %f' % (error_num * 1.0 / len(test_labels))

  这里使用machine learning in action中的提供的dating data,将90%的数据用作训练数据集,10%的数据用作测试集,选取k=50算法得到的错误率为0.08。

  下面我们来看一下如何使用scikit-learn提供的KNN实现。

scikit-learn中主要提供了2种KNN,KNeighborsClassifier和RadiusNeighborsClassifier。前者使用指定的前K个近邻来预测新样本点的类别,后者则是根据一个指定的半径,使用半径内所有的点来预测。创建一个KNN分类器时有这些重要的参数:

n_neighbors/radius: 使用近邻的个数K或半径

algorithm: 实现KNN的具体算法,如kd树等

metric: 距离的计算方法,默认为'minkowski'表示minkowski距离

p: minkowski距离中的参数p,p=1表示manhattan distance(l1范数),p=2表示euclidean_distance (l2范数)

  这里只列出了几个常用的参数,具体的可以参考链接。使用的方法和上面的测试代码类似,只需要将classifier替换成scikit-learn的实现就可以了。

KNN python实践的更多相关文章

  1. 机器学习算法与Python实践之(二)支持向量机(SVM)初级

    机器学习算法与Python实践之(二)支持向量机(SVM)初级 机器学习算法与Python实践之(二)支持向量机(SVM)初级 zouxy09@qq.com http://blog.csdn.net/ ...

  2. Python实践:开篇

    一.概述 Python实践 是应用Python解决实际问题的案例集合,这些案例中的Python应用通常 功能各异.大小不一. 该系列文章是本人应用Python的实践总结,会不定期更新. 二.目录 Py ...

  3. Python实践之(七)逻辑回归(Logistic Regression)

    机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) zouxy09@qq.com http://blog.csdn.net/zouxy09 机器学习算法与Pyth ...

  4. 机器学习算法与Python实践之(四)支持向量机(SVM)实现

    机器学习算法与Python实践之(四)支持向量机(SVM)实现 机器学习算法与Python实践之(四)支持向量机(SVM)实现 zouxy09@qq.com http://blog.csdn.net/ ...

  5. 机器学习算法与Python实践之(三)支持向量机(SVM)进阶

    机器学习算法与Python实践之(三)支持向量机(SVM)进阶 机器学习算法与Python实践之(三)支持向量机(SVM)进阶 zouxy09@qq.com http://blog.csdn.net/ ...

  6. MapReduce 原理与 Python 实践

    MapReduce 原理与 Python 实践 1. MapReduce 原理 以下是个人在MongoDB和Redis实际应用中总结的Map-Reduce的理解 Hadoop 的 MapReduce ...

  7. 机器学习算法与Python实践之(五)k均值聚类(k-means)

    机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学 ...

  8. KNN Python实现

    KNN Python实现 ''' k近邻(kNN)算法的工作机制比较简单,根据某种距离测度找出距离给定待测样本距离最小的k个训练样本,根据k个训练样本进行预测. 分类问题:k个点中出现频率最高的类别作 ...

  9. (转) K-Means聚类的Python实践

    本文转自: http://python.jobbole.com/87343/ K-Means聚类的Python实践 2017/02/11 · 实践项目 · K-means, 机器学习 分享到:1 原文 ...

随机推荐

  1. 迭代和JDB调试

    迭代和JDB调试 题目要求 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功能 2 m,n 要通过命令行传入 3 提交测试运行截图(至少三张:正 ...

  2. MySQL 基础四 存储过程

    -- 定义存储过程 DELIMITER // CREATE PROCEDURE query_student2() BEGIN SELECT * FROM student; END // DELIMIT ...

  3. async源码学习 - 控制流程waterfall函数

    waterfall函数会连续执行数组中的函数,每次通过数组下一个函数的结果.然而,数组任务中的任意一个函数结果传递失败,那么该函数的下一个函数将不会执行,并且主回调函数立马把错误作为参数执行. 以上是 ...

  4. ping + traceroute + tracert + tcpdump等命令的原理

    1.ping:关键就在这里,IP层协议通过机器B的IP地址和自己的子网掩码,发现它跟自己属同一网络,就直接在本网络内查找这台机器的. MAC如果以前两机有过通信,在 A 机的 ARP 缓存表应该 有 ...

  5. Zephyr的Logging

    1 前言 刚接触Zephyr,两眼一抹黑,光是阅读代码对系统没什么概念.还需要通过一些日志了解系统的运行机制,以及各种内核行为. 这就需要借助系统的Logging,大体分为两部分System Logg ...

  6. UVA1626 - Brackets sequence(区间DP--括号匹配+递归打印)

    题目描写叙述: 定义合法的括号序列例如以下: 1 空序列是一个合法的序列 2 假设S是合法的序列.则(S)和[S]也是合法的序列 3 假设A和B是合法的序列.则AB也是合法的序列 比如:以下的都是合法 ...

  7. 阿里云ubuntu 16.04搭建odoo11服务器

    ubuntu 16.04 具体如何搭建odoo11网站的具体步骤可以参考这一篇文章 按上面的文章配置环境后,自己网站的启动具体步骤如下: 1.登录阿里云 [远程连接],进入命令行界面1 2.cd到目录 ...

  8. Luogu P1265 公路修建

    一眼看去,就是一道MST的模板题. 然后果断准备跑Kruskal,然后5个TLE. Kruskal复杂度对于这个完全图要O(n^2*logn^2),快排就会导致超时. 然后打了刚学的Prim.朴素O( ...

  9. python打印列表的下标和值的例子:

    python打印列表的下标和值的例子: In [1]: list01=[1,4,5] In [10]: def funct01(ll):   ....:     for index,value in ...

  10. P4099 [HEOI2013]SAO

    P4099 [HEOI2013]SAO 贼板子有意思的一个题---我()竟然没看题解 有一张连成树的有向图,球拓扑序数量. 树形dp,设\(f[i][j]\)表示\(i\)在子树中\(i\)拓扑序上排 ...