KNN是通过测量不同特征值之间的距离进行分类。
如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别,其中K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
找特征的距离计算,距离一般使用欧氏距离或曼哈顿距离:
其算法的描述为:
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。
K个点所在类别也是K个点的特征结果,比如房价。可以对K个点房价取平均值得到我们需要预测的结果值。
第一步是数据集的切分,
.copy().iloc[:200] .copy().iloc[201:] 讲数据集以200为划分为训练集和测试集
然后对训练集按照特征值距离的KNN算法得到预测值,预测值的准确性判定,使用均方根误差,用均方根误差作为判定模型得分的依据。
多个特征值的比对是,可以使用apply方法来计算所有特征值.
多个特征值一起使用时,一定要做标准化和归一化处理。
z-score标准化:这是最常见的特征预处理方式,基本所有的线性模型在拟合的时候都会做 z-score标准化。具体的方法是求出样本特征x的均值mean和标准差std,然后用(x-mean)/std来代替原特征。这样特征就变成了均值为0,方差为1了。
max-min标准化:也称为离差标准化,预处理后使特征值映射到[0,1]之间。具体的方法是求出样本特征x的最大值max和最小值min,然后用(x-min)/(max-min)来代替原特征。如果我们希望将数据映射到任意一个区间[a,b],而不是[0,1],那么也很简单。用(x-min)(b-a)/(max-min)+a来代替原特征即可。
多个特征值的处理最终还是要用Sklearn来处理。
ss
=
StandardScaler()
std_cps
=
ss.fit_transform(cps) 标准和归一化方法,
invers_tainsform()还原成原来的数据集。
多个特征值的欧式距离计算
from scipy import distance
distance.eucliean() 方法计算欧式距离
Sklearn 方法实现KNN算法
import numpy as np
import sklearn from sklearn
import datasets from sklearn.neighbors
import KNeighborsClassifier
X_train = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) #这里是数组形式哦,要注意哦,如果输入的dataframe(因为一般我们导入文件的话都是使用csv模式,导入进来一般是形成dataframe模式,我们需要在fit()函数中使用 X_train.values,y_train.values)
y_train=['A','A','B','B']
knn=KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train,y_train)
knn.predict([[5,0],[4,0]])#要注意哦,预测的时候也要上使用数组形式的