您的位置:首页 > 编程语言 > Python开发

【k近邻法】简单原理及python示例

2017-03-23 12:25 288 查看

一、k近邻法,k-NN

k近邻法是一种懒惰学习,没有明显的训练学习过程,对于输入的新的实例,根据其k个最近的训练实例来确定其所属类别。k值选择、距离度量和分类决策规则是k近邻法的三个基本要素。k值的选择会对算法结果产生重大影响,开始时k值越大分类性能会越来越好之后k再增大分类效果会逐渐下降,最优的k值并不好确定。距离度量是空间中两个实例点的距离,一般常用的是欧式距离。分类决策规则常常用的是多数表决,即距离输入实例的k个近邻训练集中,多数类即为输入实例的类。

二、python程序示例

k-NN比较简单,下面使用sklearn实现k-NN。程序分为两部分,第一部分固定k值,查看分类结果。第二部分,逐渐改变k值,查看准确度随k值的变化趋势。源代码如下:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import metrics
from sklearn.neighbors import KNeighborsClassifier
from sklearn.cross_validation import train_test_split
from sklearn.datasets.samples_generator import make_classification
#生成分类数据,1000个样本,2个特征,0冗余,每个类别1簇,3个类别。每次生成的数据都不同
N=1000
x, y = make_classification(n_samples=N, n_features=2, n_redundant=0,n_clusters_per_class=1, n_classes=3)
#程序分两部分,第一部分查看k固定的情况下分类可视化结果。第二部分查看不同k值下精确度的变化情况
#第一部,分生成随机测试集来测试
print("******************第一部分,固定k值**********************")
fix_k=15 #固定的k值
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF']) #分类区域颜色
cmap_bold =['b', 'r', 'y'] #散点颜色
#模型
model = KNeighborsClassifier(n_neighbors=fix_k)
model.fit(x, y)
print(model)
#确定训练集边界
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, 0.02),np.arange(y_min, y_max, 0.02))#xx为第一个特征,yy为第二个特征,np.meshgrid此处生成的xx和yy都是2行多列的矩阵
print(xx)
Z = model.predict(np.c_[xx.ravel(), yy.ravel()]) #预测。xx.racel()是将xx变为一维数组。np.c_是按列将xx和yy组合到一起

#第二部分
print("******************第二部分,改变k值**********************")
acc=[] #精确度数组
k_range=range(1,101) #k值从1到100
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3) #划分数据集
for j in k_range:
model = KNeighborsClassifier(n_neighbors=j)
model.fit(x_train, y_train)
expected = y_test
predicted = model.predict(x_test)
acc.append(metrics.accuracy_score(expected, predicted))
print("k=",j)
print("精确度:",acc[j-1])
#绘图
#第一部分
#画出测试数据集
Z = Z.reshape(xx.shape)
plt.subplot(121)
plt.pcolormesh(xx, yy, Z, cmap=cmap_light)
#画出数据集
for i in range(N):
plt.scatter(x[i, 0], x[i, 1], c=cmap_bold[int(y[i])])
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("classification area when k is fixed" )
#第二部分
plt.subplot(122)
plt.plot(k_range,acc)
plt.title("accuracy_score curve when k varies from 1 to 100" )
plt.xlabel("k")
plt.ylabel("accuracy_score")
plt.show()

程序先随机生成1000个数据,每个数据2维,一共3个类别。第一部分先固定k值为15,再用k-NN分类。第二部分k值从1变化到100,观测准确度随k值的变化而变化。由于每次随机生成的数据不同,所以每次结果也不同。某两次的结果如下:





左图是第一部分的分类结果,不同的颜色代表不同的分类区域。右图是第二部分结果,随着k值的增加,准确度的趋势是先增加后减小。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  k-NN 机器学习