机器学习之KNN算法及TensorFlow实战

首发于我的科学网博客,不知道为啥被屏蔽了,以后逐渐退出科学网博客

K近邻算法-监督学习-分类方法

一、分类

要训练的数据已经标记好了,标签的种类是确定的,训练数据与标签是一一对应的。

通过对训练集数据进行学习(训练),这种学习可以称为特征提取(或模式获取),最后得到一个模型或认知或一种映射关系(分类方法中就是分类器),将此模型用于没有标签的测试集,模型能够识别已有特征(模式)的数据,并对其进行分类。这是一种检验模型好坏(或叫泛化能力)的方法。

注意:待分类数据的特征必须是已有数据的特征。举个反例:训练数据是猫和狗,测试数据是老鼠,你这不是逗比吗?显然测试结果肯定错误。如果你想把老鼠确定为新的类别还是用无监督学习吧,比如聚类。

二、KNN方法

K近邻分类方法在于将测试集数据与训练集数据进行比较,通过比较特征的相似程度来进行分类。相似程度是根据测试集数据与训练集数据距离最近的k个数据来确定的,这就是k近邻的由来。

具体算法为:1.先对训练集数据标记,指定其类别;(K近邻不需训练数据,这是一种懒惰学习);2.计算待分类数据与训练集数据所有点的距离(采用欧氏距离,也可给距离加权重);3.选择最近的k个数据(其中k最好不要是类别总数的倍数,避免k个数据中各个类别数全部相等,尴尬!);4.在k个近邻中,类别数占优势的类别标签则是待测数据的类别(Easy吧)。

三、KNN与K-means cluster的区别 

对比于k均值聚类,其中的k是将数据分成k个聚类,首先随机生成k个质心,并计算所有数据与质心的距离,将数据分配到与质心距离最近的簇中,然后计算簇的均值,将均值作为该簇新的质心,再次计算所有点与新质心的距离,并将距离最近的点分配到该簇中,以此类推,迭代的前提是每次迭代中所有簇中的点与其质心的距离的和都比前一次要小,否则迭代结束,质心可以作为该簇的特征代表,它能够代表该簇的数据。

k均值聚类部分可作为上次K均值聚类的内容补充:

http://blog.sciencenet.cn/blog-1966190-1118655.html

四、实战

理论很简单,下面来sklearn实现,参考sklearn官方例子:

http://scikit-learn.org/stable/auto_examples/neighbors/plot_classification.html#sphx-glr-auto-examples-neighbors-plot-classification-py

不得不说官方文档总有些毛病,你把原理讲清楚就好,搞那些花边有啥球用,无非是增加了初学者的负担,恶心。把那些没用的去掉了。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import neighbors, datasets
n_neighbors = 8

# import some data to play with
iris = datasets.load_iris()

# we only take the first two features. We could avoid this ugly
# slicing by using a two-dim dataset
X = iris.data[:, :2]
y = iris.target
h = .02  # step size in the mesh

weights='uniform'
# we create an instance of Neighbours Classifier and fit the data.
clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)
clf.fit(X, y)
# Plot the decision boundary. For that, we will assign a color to each
# point in the mesh [x_min, x_max]x[y_min, y_max].
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),np.arange(y_min, y_max, h))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
#分类结果,很多数据,你也可以画成散点,这里画成了色图
# Put the result into a color plot
Z = Z.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx, yy, Z, )#cmap=cmap_light

# Plot also the training points
plt.scatter(X[:, 0], X[:, 1], c=y,edgecolor='r', s=20)
#这个是已有数据的类别,散点
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("3-Class classification (k = %i, weights = '%s')"% (n_neighbors, weights))
plt.show()

 图在这里:

注意:上面代码中很多屏蔽小白的部分,clf是根据已有分类数据(散点)进行拟合,创建的分类器。

要预测的数据则是由h步长产生的meshgrid,也是散点,但这里画成了pcolor。

xx.ravel将数据一维化,np.c_各取数据中相同的索引组成的数组。

TensorFlow我都懒得吐槽,没法更垃圾了,打印个Hello World都得5行,这是一种倒退,还是sklearn好用。老子也没发现tf中有KNN的函数或者类,怪我孤陋寡闻了。不过这里给一个链接供参考,小白可以直接忽略了。看起来费劲,抓不住重点。

https://github.com/Mujadded/knn-with-tensorflow/blob/master/k-nearest.py

请来看看我吧。Please Do not Keep me Waiting.

另外有相关问题可以加入QQ群讨论,不设微信群

QQ群:868373192 

语音图像深度-学习群

或者发我邮箱:

[email protected]

发布了189 篇原创文章 · 获赞 170 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/SPESEG/article/details/103714247