最近邻算法
最近邻算法是机器学习算法中比较简单的一种算法了,下面用图阐述一下该算法。
上面笔记只说了knn的最常出现的一种分类方式,下面还将补充一些其他方式。
knn加权分类:
加权的多数投票法;对于k个样本,每个样本到待测样本的距离的倒数作为当前样本的权重系数,在k个样本中,统计各个类别对应权重的累加和,最终将权重系数最大的那个对应类别作为待测样本的类别。
knn回归预测:
将k个样本的y值的均值作为待测样本的预测值。
knn加权回归预测:
对于k个样本,每个样本到待测样本的距离的倒数作为当前样本的权重系数,然后权重系数归一化,最后将归一化的权重和y一起做一个加权均值的操作,将最终的均值作为预测值。
下面是代码部分:
```python
from sklearn.datasets import load_iris #导入数据包
from sklearn.model_selection import train_test_split, GridSearchCV #导入把数据集分为测试集和训练集的包
from sklearn.preprocessing import StandardScaler #导入数据归一化的包
from sklearn.neighbors import KNeighborsClassifier #导入knn邻近算法的包
#(from sklearn.neighbors import KNeighborsRegressor #导入knn邻近算法的包 )
class KNN(object):
# 获取鸢尾花数据 三个类别(山鸢尾/0,虹膜锦葵/1,变色鸢尾/2),每个类别50个样本,每个样本四个特征值(萼片长度,萼片宽度,花瓣长度,花瓣宽度)
def get_iris_data(self): #生成数据的函数
iris = load_iris() #获取鸢尾花数据(该数据的数据类型是一个字典)
iris_data = iris.data #提出鸢尾花的特征数据
iris_target = iris.target #提出鸢尾花的标签数据
return iris_data, iris_target #返回一个包含特征数据和标签数据的元组
def run(self):
# 1.获取鸢尾花的特征值,标签值
iris_data, iris_target = self.get_iris_data()
# 2.将数据分割成训练集和测试集 test_size=0.25表示将25%的数据用作测试集
x_train, x_test, y_train, y_test = train_test_split(iris_data, iris_target, test_size=0.25)
# 3.特征工程(对特征值进行标准化处理,即数据归一化)
std = StandardScaler() #创建一个数据标准化的对象
x_train = std.fit_transform(x_train) #对特征值的训练集做数据标准化
x_test = std.transform(x_test) #对特征值的测试集做数据标准化
# 4.送入算法
knn = KNeighborsClassifier(n_neighbors=5) # 创建一个KNN算法实例,n_neighbors默认为5,后续通过网格搜索获取最优参数
knn.fit(x_train, y_train) # 将训练集送入算法来训练knn模型
y_predict = knn.predict(x_test) # 获取预测结果
print("准确率:",knn.score(x_test, y_test)) #输出预测的准确率
if __name__ == '__main__':
knn = KNN() # 实例化一个knn对象
knn.run() #调用knn对象里的run方法