定义:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
核心思想:根据“邻居”来推测出你的类别。
关于K的取值:
过小:容易受到异常点的影响
过大:会受到样本不均衡的影响
特点:
优点:简单,易于理解,无需训练
缺点:对测试样本分类时计算量大,内存开销大
必须指定K值,K值选择会影响分类精度
使用场景:小数据场景
一些函数用法
train_test_split
语法
X_train,X_test, y_train, y_test =cross_validation.train_test_split(X,y,test_size, random_state)
参数说明:X:待划分的样本特征集合
y:待划分的样本目标
test_size: 若在0~1之间,为测试集样本数目与原始样本数目之比;若为整数,则是测试集样本的数目。
random_state:随机数种子
返回值:X_train:划分出的训练数据 X_test:划分出的测试集数据
y_train:划分出的训练集目标 y_test:划分出的测试集目标
fit_transform
fit():求得训练集X的均值,方差,最大值,最小值,这些训练集X固有的属性。
transform():在fit的基础上,进行标准化,降维,归一化等操作
fit_transform() : 二者的结合
StandardScaler()
数据归一化(针对的是每一个特征)
KNeighborsClassifier()
sklearn中KNN算法实现调用函数
参考KNN算法说明以及sklearn 中 neighbors.KNeighborsClassifier参数说明_一年又半的博客-CSDN博客_kneighborsclassifier 参数
主要方法:
fit(X,y):X作为训练数据,y作为训练的目标值,来得到拟合模型
predict(X):通过测试集X来得到测试预测目标
score(X, y[, sample_weight]):返回给定测试数据和标签的平均准确值。
KNN算法的具体实现(数据集为iris数据集)附数据可视化:
from sklearn import neighbors
import random
import math
import operator
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
def loadData(data,split,target=[],traindata=[],testdata=[],traintarget=[],testtarget=[]):
for x in range(len(data)-1):
#target[x] = float(target[x])
for y in range(4):
data[x][y]=float(data[x][y])
if random.random()predicted = " + repr(result) + ",actual = " + repr(testtarget[x]))
Accuracy = accuracy(testtarget, predata)
print("Accuracy:" + repr(Accuracy) + "%")
pca = PCA(n_components=2)
xr = pca.fit_transform(testdata)
red_x,red_y=[],[]
blue_x,blue_y=[],[]
green_x, green_y = [], []
red1_x, red1_y = [], []
blue1_x, blue1_y = [], []
green1_x, green1_y = [], []
for i in range (len(xr)):
if predata[i] == 0:
red_x.append(xr[i][0])
red_y.append(xr[i][1])
elif predata[i] == 1:
blue_x.append(xr[i][0])
blue_y.append(xr[i][1])
elif predata[i] == 2:
green_x.append(xr[i][0])
green_y.append(xr[i][1])
if testtarget[i] == 0:
red1_x.append(xr[i][0])
red1_y.append(xr[i][1])
elif testtarget[i] == 1:
blue1_x.append(xr[i][0])
blue1_y.append(xr[i][1])
elif testtarget[i] == 2:
green1_x.append(xr[i][0])
green1_y.append(xr[i][1])
plt.scatter(red_x,red_y,c='r')
plt.scatter(blue_x, blue_y, c='b')
plt.scatter(green_x, green_y, c='g')
plt.scatter(red1_x, red1_y, c='r',marker='^')
plt.scatter(blue1_x, blue1_y, c='b',marker='^')
plt.scatter(green1_x, green1_y, c='g',marker='^')
plt.show()
if __name__=="__main__":
main()
*调用sklearn中的KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
def KNN_iris():
iris_data=load_iris()
x_train,x_test,y_train,y_test=train_test_split(iris_data.data,iris_data.target,random_state=6) #划分数据集
transfer=StandardScaler() #数据归一化处理
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test) #测试集目标值归一化处理要与测试集训练值归一化参数一样
estimator=KNeighborsClassifier(n_neighbors=3)
estimator.fit(x_train,y_train)
y_predict=estimator.predict(x_test)
print("y_predict:\n",y_predict)
print("比对真实值和预测值:\n",y_test==y_predict)
score=estimator.score(x_test,y_test)
print("准确率:\n",score)
return None
if __name__=="__main__":
KNN_iris()