# -*- coding: utf-8 -*- """ Created on Thu Jan 24 09:34:32 2019 1. 翼尾花数据 2. 用 KNeighborsClassifier """ # -*- coding:utf-8 -*- import numpy as np from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_iris iris = load_iris() #载入数据 features, labels = np.array(iris.data), np.array(pd.Categorical.from_codes(iris.target, iris.target_names).tolist()) #多个连续自变量 和 一个离散因变量 feature_names = iris.feature_names from sklearn.model_selection import train_test_split x_train,x_test,y_train,y_test= train_test_split(features,labels,test_size =0.33,shuffle=True,random_state=42) #shuffle随机 random_state设定随机种子 test_size测试数据占比33% def accuracy(test_labels, pred_lables): correct = np.sum(test_labels == pred_lables) n = len(test_labels) return float(correct) / n knn = KNeighborsClassifier(n_neighbors=5) y_test_pre = knn.fit(x_train, y_train).predict(x_test) print(accuracy(y_test_pre, y_test))
# 0.98
改进点:
1. 根据最近的K个值 的距离对最终结果,进行加权。
2. 通过先验知识,对训练数据进行筛选,缩小训练样本,提高样本质量,有利于提高计算速度。
3. 变量尽量少,这样可以提供速度。
优点:
1. 算法原理非常简单: 用 欧式距离最近(或曼哈顿距离)的K个样本点的分类中的众数,作为预测分类。
2. 便于并行计算。
3. 可以做 分类、也可以连续变量拟合预测
缺点:
1. 自变量必须是连续性,并且做好了归一化等处理,方便测量距离。
2. 对于连续性因变量,只能做插值预测,不适合做外推预测。
3. 分类新实例开销大,每次对一个测试样本,需要用到几乎全部的训练样本数据,分别计算距离
4. 会考虑所有属性/自变量。导致计算量大。