6 K邻近算法(KNeighbors)
所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。
- 如果K=3,绿色圆点的最近的3个邻居是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。
- 如果K=5,绿色圆点的最近的5个邻居是2个红色三角形和4个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。
于此我们看到,当无法判定当前待分类点是从属于已知分类中的哪一类时,我们可以依据统计学的理论看它所处的位置特征,衡量它周围邻居的权重,而把它归为(或分配)到权重更大的那一类。这就是K近邻算法的核心思想。
6 .1 K邻近分类算法(KNeighbors Classifier)
类
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto', leaf_size=30,p=2, metric='minkowski', metric_params=None, n_jobs=1, **kwargs)
参数
参数 |
解释 |
n_neighbors |
int, optional (默认= 5),默认情况下用于查询的邻居数量。(一般也不需要更改,默认5是最佳的。也可以尝试在小范围调试看看效果) |
algorithm |
: {'auto','ball_tree','kd_tree','brute'}, optional。用于计算最近邻居的算法: •'ball_tree' 用于BallTree •'kd_tree'用于KDTree •'brute'用于强力搜查. •'auto'将尝试根据传递给fit方法的值来决定最合适的算法 注意:使用强力拟合稀疏输入将覆盖此参数的设置。 |
属性
属性 |
解释 |
classes_ |
array of shape (n_classes,)分类器已知的类标签使用的距离度量。 |
effective_metric_ |
str or callble如果度量参数设置为'minkowski',p参数设置为2,则它将与度量参数或其同义词相同,例如'euclidean'。 |
effective_metric_params_ |
dict度量类参数、属性和方法的其他关键字参数。对于大多数度量,都将与metric_params参数相同,但如果effective_metric_ attribute设置为'minkowski',则也可能包含p参数值。 |
n_samples_fit_ |
int拟合数据中的样本数。 |
outputs_2d_ |
bool如果y的形状在拟合过程中为(n_samples, ) 或 (n_samples, 1),则为False,否则为True。 |
方法
方法 |
解释 |
fit(X, y) |
从训练数据集中拟合k近邻分类器。 |
get_params([deep]) |
获取此估计器的参数。 |
kneighbors([X, n_neighbors, return_distance]) |
找到点的K邻域。 |
kneighbors_graph([X, n_neighbors, mode]) |
计算X上点的k邻域(加权)图 |
predict(X) |
预测所提供数据的类标签。 |
predict_proba(X) |
测试数据X的返回概率估计。 |
score(X, y[, sample_weight]) |
返回给定测试数据和标签的平均精度。 |
set_params(**params) |
设置此估计器的参数。 |
6.1.1 K邻近算法分析make_blobs数据集
2类
def sklearn_Kneighbors_for_make_blobs_2_centers(): myutil = util() # 产生200个新样本,分成2类 data = make_blobs(n_samples=200,centers=2, random_state=8) X,y =data print("X is :",X) print("y is :",y) #将数据集用散点图方式进行可视化分析 plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.spring,edgecolor='k') plt.show()
输出
X is : [[ 6.75445054 9.74531933] [ 6.80526026 -0.2909292 ] [ 7.07978644 7.81427747] … y is : [0 1 0 1 0 0 1 0 0 1 …0 1]
clf = KNeighborsClassifier() clf.fit(X,y) #下面代码用于画图 title = "KN邻近分类——2个类别" myutil.draw_scatter(X,y,clf,title) myutil.plot_learning_curve(KNeighborsClassifier(),X,y,title) myutil.show_pic(title)
5类
def sklearn_Kneighbors_for_make_blobs_5_centers(): myutil = util() data = make_blobs(n_samples=500,centers=5, random_state=8) X,y =data plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.spring,edgecolor='k') plt.show()
5类中有2类混合在一起
clf = KNeighborsClassifier() clf.fit(X,y) #下面代码用于画图 title = "KN邻近分类——5个类别" myutil.draw_scatter(X,y,clf,title) myutil.plot_learning_curve(KNeighborsClassifier(),X,y,title) myutil.show_pic(title)
6.1.2 K邻近算法分析load_iris数据集
from sklearn import datasets def KNeighborsClassifier_for_load_iris(): myutil = util() X,y = datasets.load_iris().data,datasets.load_iris().target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) title = "KNN分类_鸢尾花数据" clf = KNeighborsClassifier() clf.fit(X_train, y_train) myutil.print_scores(clf,X_train,y_train,X_test,y_test,title) myutil.plot_learning_curve(KNeighborsClassifier(),X,y,title) myutil.show_pic(title) 在Util.py中定义 #打印得分 def print_scores(self,clf,X_train,y_train,X_test,y_test,title): title = title+":\n{:.2%}" print(title.format(clf.score(X_train,y_train))) print(title.format(clf.score(X_test,y_test)))
输出:
KNN分类_鸢尾花数据: 97.50% KNN分类_鸢尾花数据: 96.67%
6.1.3 K邻近算法分析load_wine数据集
def KNeighborsClassifier_for_load_wine(): myutil = util() wine_dataset = datasets.load_wine() X,y = wine_dataset['data'],wine_dataset['target'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) title = "KNN分类_红酒数据" clf = KNeighborsClassifier() clf.fit(X_train, y_train) myutil.print_scores(clf,X_train,y_train,X_test,y_test,title) myutil.plot_learning_curve(KNeighborsClassifier(),X,y,title) myutil.show_pic(title) X_new = np.array([[25.5,3.14,3.22,18.5,95.8, 0.97, 2.52, 0.67, 1.52, 7.3, 0.98, 2.96, 990]]) prediction = clf.predict(X_new) print('预测的红酒为:{}:\n'.format(wine_dataset['target_names'][prediction]))
输出
KNN分类_红酒数据: 77.46% KNN分类_红酒数据: 72.22% 预测的红酒为:['class_0']:
6.1.4 K邻近算法分析load_breast_cancer数据集
def KNeighborsClassifier_for_load_breast_cancer(): myutil = util() wine_dataset = datasets.load_breast_cancer() X,y = wine_dataset['data'],wine_dataset['target'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) title = "KNN分类_乳腺癌数据" clf = KNeighborsClassifier() clf.fit(X_train, y_train) myutil.print_scores(clf,X_train,y_train,X_test,y_test,title) myutil.plot_learning_curve(KNeighborsClassifier(),X,y,title) myutil.show_pic(title) print('第310个样本预测结果: {}'.format(clf.predict([X[310]])))
输出
KNN分类_乳腺癌数据: 94.07% KNN分类_乳腺癌数据: 95.61% 第310个样本预测结果: [1]
6.1.5 比对线性分类方法(逻辑回归)与K邻近算法
逻辑回归算法 |
K邻近算法 |
|
鸢尾花数据 |
96.67%、100.00% |
97.50%、96.67% |
红酒数据 |
100.00%、94.44% |
77.46%、72.22% |
乳腺癌数据 |
94.95%、97.37% |
94.07%、95.61% |
可见红酒数据逻辑回归算法的正确率比较高,鸢尾花数据、乳腺癌数据两者的得分数据基本相同。另外可以看见由于KNN算法不是线性的,所以分布图的边界不是直线。