跳到主要内容

k-邻近算法

∑ 是一个数学符号,读作“sigma”。它表示求和或总和。


1.K-近邻算法
1.1 R-近邻算法简介
1.定义:
就是通过你的"邻居"来判断你属于哪个类别
2.如何计算你到你的"邻居"的举例
一般时候,都是使用欧氏距离
1.2 k近邻算法api初步使用
1.sklearn 框架
优势:
1. 文档多,且规范,
2.包含的算法多
3.实现起来容易
2.sklearn中包含内容
分类、聚类、回归
特征工程
模型选择、调优
3.knn中的api
sklearn.neighbors. KNeighborsClassifier (n neighbors=5)
参数:
n beighbors
选定参考几个邻居
4.机器学习中实现的过程
1.实例化一个估计器
2.使用fit方法进行训练


K值过小:
容易受到异常点的影响
k值过大:
受到样本均衡的问题


近似误差 --导致 过拟合 -- 在训练集上表现好,测试集表现不好
估计误差好才是真的好!



1.3 距离度量
1.欧式距离
通过距离平方值进行计算 直角三角形
2.曼哈顿距离 (Manhattan Distance):
通过举例的绝对值进行计算 标准方格平移
3.切比雪夫距离 (Chebyshev Distance):
维度的最大值进行计算 国际象棋
4.闵可夫斯基距离(Minkowski Distance):
当p=1时,就是曼哈顿距离;
当p=2时,就是欧氏距离;
当p-~时,就是切比雪夫距离。
小结:前面四个距离公式都是把单位相同看待了,所以计算过程不是很科学
5.标准化欧氏距离 (Standardized EuclideanDistance):
在计算过程中添加了标准差,对量刚数据进行处理
6. 余弦距离(Cosine Distance)
通过cos思想完成
7.汉明距离(Hamming Distance)【了解】:
一个字符串到另一个字符串需要变换几个字母,进行统计
8.杰卡德距离(Jaccard Distance)【了解】:
通过交并集进行统计
9.马氏距离 (Mahalanobis Distance) 【了解】
通过样本分布进行计算




1.6 家例:鸢尾花种类预测--数据集介绍
1.获取数据集
sklearn.datasets.
小数据:
sklearn.datasets. load *
注意:
该数据从本地获取
大数据集:
sklearn.datasets. fetch *
注意:
该数据从网上下载
subset--表示获取到的数据集类型
2.数据集返回值介绍
返回值类型是bunch--是一个字典类型
返回值的属性:
data:特征数据数组
target:标签(目标)数组
DESCR:数据描述
feature names: 特征名,
target names: 标签(目标值)名

3数据可视化
import seaborn
seaborn. 1mplot ()
参数
x,y--具体x轴,y轴数据的索引值
data -- 具体数据
hue -- 目标值是什么
fit_reg --是否进行线性拟合

4.数据集的划分
api: sklearn.model_selection.train_test_split (arrays, *options)
参数:
x -- 特征值
y -- 目标值
test size -- 测试集大小
ramdom state -- 随机数种子
返回值:
x train, x test, y train, y test

k近邻算法总结
优点:
1.简单有效
2.重新训练代价底
3.适合类域交叉样本
4.适合大样本自动分类
缺点:
1.惰性学习
2.类别评分不是规格化
3.输出可解释性不强
4.对不均衡的样本不擅长
样本不均衡:收集到的数据每个类别占比严
重失衡
5.计算量较大


总结
优点:
简单有效
重新训练的代价低
适合类域交叉样本
KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因
此对于类域的交叉或重疊较多的待分样本集来说,KNN方法较其他方法更为适合。
适合大样本自动分类
•该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这
种算法比较容易产生误分。

缺点:
惰性学习
KNN算法是懒散学习方法 (azy learning,基本上不学习),一些积极学习的算法要快很多
类别评分不是规格化
•不像一些通过概率评分的分类
输出可解释性不强
•例如决策树的输出可解释性就较强
对不均衡的样本不擅长
•当样本不大衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输
入一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算“最近的”邻
居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很
靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距
离小的邻居权值大)来改进。
计算量较大
•目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。
  
from sklearn.neighbors import KNeighborsClassifier
# 获取数据
x =[[1], [2], [0], [0]]
y = [1, 1, 0, 0]
# 机器学习
# 1.实例化一个训练模型
estimator = KNeighborsClassifier(n_neighbors=2)
#2.调用fit方法进行训练
estimator.fit(x, y)
# 预测其他值
ret = estimator.predict([[11]])
print( ret)