机器学习——KNN算法
一、简介
全称是 k-nearest neighbors,通过寻找 k 个距离最近的数据,来确定当前数据值的大小或类别。是机器学习中最为简单和经典的一个算法。
二、距离计算公式
2.1 欧氏距离
2.2 曼哈顿距离

三、分类——KNeighborsClassifier
class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=None,**kwargs)
各个参数的意义:
n_neighbors:k 值,邻居的个数,默认为 5。【关键参数】
weights:权重项,默认 uniform 方法。Uniform:所有最近邻样本的权重都一样。【一般使用这一个】
Distance:权重和距离呈反比,距离越近的样本具有更高的权重。【确认样本分布情况,混乱使用这种形式】
Callable:用户自定义权重。
algorithm:用于计算最近邻的算法。
ball tree:球树实现
kd tree:KD 树实现,是一种对 n 维空间中的实例点进行存储以便对其进行快速搜索的二叉树结构。
brute:暴力实现
auto:自动选择,权衡上述三种算法。【一般按自动即可】
leaf_size:空值 KD 树或者球树的参数,停止建子树的叶子节点的阈值。
p:距离的计算方式。P=1 为曼哈顿距离,p=2 为欧式距离。
metric:用于树的距离度量1. 曼哈顿距离 2. 欧式距离 3. 切比雪夫距离 4. 闵可夫斯基距离 5. 带权重闵可夫斯基距离6. 标准化欧式距离 7. 马氏距离
metric_params:用于比较复杂的距离的度量附加参数。【用不上】
示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import kneighbors_graph, KNeighborsClassifier
data = np.loadtxt('datingTestSet2.txt')
x = data[:,:-1]
y = data[:,-1]
neigh = KNeighborsClassifier(n_neighbors=5)
neigh.fit(x,y)
print(neigh.predict([[367.69,10.264061,0.846786]]))
predict_data = [[9744, 11.440364, 0.760461],
[16191, 0.100000, 0.605619],
[42377, 6.519522, 1.058602],
[27353, 11.475155, 1.34567]]
print("多人预测")
print(neigh.predict(predict_data))

但是上述代码存在一个问题,某个数值计算的结果对整体计算的影响比较大,如
(42333-25667)、(11.23554-10.34746)、(1.57386-0.95768)发现后两项对整体计算结果相对于(42333-25667)的计算结果对整体的影响很小,造成整体预测效果差,为了应对这个问题,有个方案——标准化。
四、标准化
4.1 0-1标准化

也叫离差标准化,是对原始数据的线性变换,使结果映射到 [0,1] 区间
压缩的时候,是对每一列(各自列)进行压缩。1 列代表 1 个特征。
4.2 Z标准化

这种方法基于原始数据的均值(mean)和标准差s(standard deviation)进行数据的标准化。将 A 的原始值 x 使用 z-score 标准化到 x'。
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
#将datingTestSet2.txt中前700行作为训练,后300行作为测试
train_data = np.loadtxt('datingTestSet2.txt')
train_x = train_data[0:701,0:3]
train_y = train_data[0:701,3]
test_x = train_data[701:1001,0:3]
test_y = train_data[701:1001,3]
"""
z标准化
"""
scaler = StandardScaler()
train_z_scale = scaler.fit_transform(train_x)
test_z_scale = scaler.transform(test_x)
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(train_z_scale, train_y)
train_predict = knn.predict(train_z_scale)
train_score = knn.score(train_z_scale, train_y)
test_predict = knn.predict(test_z_scale)
test_score = knn.score(test_z_scale, test_y)
print(f"训练集准确率:{train_score:.4f}")
print(f"测试集准确率:{test_score:.4f}")
五、KNN算法的优缺点
优点:
1. 简单,易于理解,易于实现,无需训练;
2. 适合对稀有事件进行分类;
3. 对异常值不敏感。
缺点:
1. 样本容量比较大时,计算时间很长;
2. 不均衡样本效果较差;
更多推荐

所有评论(0)