前言
邻近算法,或者说K最近邻(KNN,K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的K个邻近值来代表。近邻算法就是将数据集合中每一个记录进行分类的方法
一、KNN分类算法
1.1 引入数据加粗样式
iris.data所显示的数据是二维的
前面两个数据是花萼的长和宽
后面两个数据是花瓣的长和宽
使用shape查看莺尾花的数量
总共150中朵莺尾花,故因给对应150个target
但只有三个种类 每种莺尾花都有它对应的种类
1.2 可视化
散点图可以帮助我们分析不同特征的分布关系
横轴是一个特征,纵轴是一个特征
- 安装库
单从以上两幅图来看,选哪种作为我们的分类?
主要观察某种特征下的哪种数据聚集性更好,以及交错性差 -------->由此,我们选择花瓣来区分
二、KNN算法实现
自己创造一个莺尾花数据,并显示
x = np.array([6.0,3.0,4.0,1.4])
新的莺尾花特征数据更接近哪一类,那就是这类别
离新样本点(测试点)最近的K个点,在最近的K个点中,哪一个类别最多,那就是这一种类:人以类聚物以群分
- 算距离 坐标系两点间距离:sqrt((x1-x2)^2 +(y1-y1)^2)
- 对距离排序取K名
- 对这K个样本点进行统计,看得到的哪一类最多
计算x的这一朵莺尾花至150朵莺尾花的的距离
- 测试结果展示:
- 函数封装
- 类的封装
class KNNClassify:
def __init__(self,k=7):
self.k = k
self._X_train = None
self._y_train = None
# 学习训练数据
def fit(self,X_train,y_train):
self._X_train = X_train
self._y_train = y_train
# 分类预测 -- 多个
def predict(self,X_predict):
y_predict = np.array([self._predict(x) for x in X_predict])
return y_predict
# 分类预测 -- 一个
def _predict(self,x_predict):
distance = np.sqrt(np.sum((self._X_train-x)**2,axis = 1))
np.partition(distance,k)
votes = Counter(self._y_train[np.argpartition(distance,self.k)[:self.k]])
return votes.most_common(1)[0][0]
knn = KNNClassify()
knn.fit(X,y)
y_predict = knn.predict(X)
y_predict
- 结果:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
这里还涉及准确度的问题