1) 实现过程
2) 距离的确定
该算法的「距离」在二维坐标轴就表示两点之间的距离,计算距离的公式有很多。
我们常用欧拉公式,即“欧氏距离”。(x1、x2、x3为特征)
$$
\sqrt{(x_1 - y_1)^2 + (x_2 - y_2)^2 + (x_3 - y_3)^2+...+(x_n - y_n)^2} =\sqrt{ \sum_{i=1}{n}{(x_i-y_i)2}}
$$
算法超参数是 k(人为设置的参数为超参数),k 可以理解为标记数据周围几个数作为参考对象,参数选择需要根据数据来决定。(通过学习曲线找最优的k)
变种一:默认情况下,在计算距离时,权重都是相同的,但实际上我们可以针对不同的邻居指定不同的距离权重,比如距离越近权重越高。
变种二:使用一定半径内的点取代距离最近的 k 个点
# 红酒参数 rowdata = {'颜色深度':[14.13,13.2,13.16,14.27,13.24,12.07,12.43,11.79,12.37,12.04], '酒精浓度': [5.64,4.28,5.68,4.80,4.22,2.76,3.94,3.1,2.12,2.6], '品种': [0,0,0,0,0,1,1,1,1,1]} # 0 代表 “黑皮诺”,1 代表 “赤霞珠” wine_data = pd.DataFrame(rowdata)
def KNN(x): #x是输入的点 返回类别 # 1.把10个训练数据提取到data中 data = wine_data.iloc[:,:2].values #将前两列提取出来----data # 2. 新数据点与10个一维数组的欧式距离 # 数据点第一个特征与10个点的欧式距离 a = ((x-data) ** 2)[:,0] #第一列抽取出来 # 数据点第二个特征与10个点的欧式距离 b = ((x-data) ** 2)[:,1] #第二列抽取出来 # 得到数据点与10个点的欧氏距离 Distance = np.sqrt(a+b) np.sort(Distance) # 3.排序找出最近的K个点 K=3 K3 = np.argsort(Distance)[:3] #得到开始表的索引值 6 1 4 # 4.判断类别 y = wine_data.品种 # 根据频数统计判断属于哪一类 return pd.Series([y[i] for i in K3]).value_counts().idxmax()
KNN([[12.3,4.1]]) # OUT:0
scikit-learn,简称 sklearn, 支持了包括分类、回归、降维和聚类四大机器学习算法,以及特征提取、数据预处理和模型评估三大模块。
主要设计原则:
1) 一致性
所有对象共享一个简单一致的界面(接口)。
2)监控
3)防止类扩散
4) 合成
5)合理默认值
6)SKlearn KNN 实现
class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, *, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=None)[source]
参数名 | 形式 | 意义 |
---|---|---|
n_neighbors | int, default=5 | 近邻 个数 |
weights | {‘uniform’, ‘distance’}, callable or None, default=’uniform’ | • 'uniform':默认参数,不管远近权重都一样,就是最普通的 KNN 算法的形式。 • 'distance':权重和距离成反比,距离预测目标越近具有越高的权重。 • 自定义函数:自定义一个函数,根据输入的坐标值返回对应的权重,达到自定义权重的目的。 |
algorithm | {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, default=’auto’ | •'brute' :蛮力实现 • 'kd_tree':KD 树实现 KNN • 'ball_tree':球树实现 KNN • 'auto': 默认参数,自动选择合适的方法构建模型 |
leaf_size | int, default=30 | 当使用KD树或球树,它就是是停止建子树的叶子节点数量的阈值 |
p | int, default=2 | p=1为曼哈顿距离 p=2为欧式距离 |
metric | str or callable, default=’minkowski‘ | • 'euclidean' :欧式距离 • 'manhattan':曼哈顿距离 • 'chebyshev':切比雪夫距离 • 'minkowski': 闵可夫斯基距离,默认参数 |
n_jobs | int, default=None | 指定多少个CPU进行运算,-1表示全部都算 |
from sklearn.neighbors import KNeighborsClassifier clf = KNeighborsClassifier(n_neighbors=3) clf = clf.fit(wine_data.iloc[:,0:2].values,wine_data.iloc[:,-1].values)
#测试单个点 clf.predict([[12.3,4.1]]) # OUT: array([0]) 属于“黑皮诺”红酒