KNN代码整理

SKNN+train_test_split实例

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

1. 导入鸢尾花的数据集

iris=datasets.load_iris()
x=iris.data
y=iris.target
x.shape
(150, 4)
y.shape
(150,)
y
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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 2, 2, 2, 2, 2, 2, 2])

2.train_test_split过程

2.1 将x训练集中的元素进行乱序处理,返回索引np.random.permutation(len(x))

shuffle_indexes=np.random.permutation(len(x))
shuffle_indexes
array([ 65,   9, 132,  90, 128,  40,  63,  28, 130,   3,  27, 108, 105,
        71,  26,  94,  37,  43,  73,  22,  31, 138,  15,  52, 131,  29,
        84,  93,  55, 149,  49,  91,   7, 116, 127,  36, 106, 137, 115,
        46, 124,  96,  77,   4,   8,  57, 136,  21, 113,  82, 134, 143,
       114,  42, 112,  88,  85, 118, 147,  50,  13,  14,  48,  69,  67,
        12,  16,  11, 141, 117, 142,   5, 126, 121,  19,  17, 122,  39,
        30,  38,  45,  75, 144, 123,  34,  51,  23, 109, 148, 110,  56,
        81,  54,  68,  61,  35,  41,  78, 103,  32,  99,   0, 145, 140,
        58,  10,  47,  72, 104,  87, 111,  64, 107, 102,  33,  80,  74,
        83,  59,  95, 135,  20,  89, 146,  18,  24,  86,  92,  66,  76,
        25,   2,  98, 101,  53,  79,  70,  60, 129, 133, 139,  62, 119,
         1,  97, 125, 120,   6,  44, 100])

2.2 测试数据集

test_ratio=0.2
test_size=int(len(x)*test_ratio)
test_size
30
test_indexes=shuffle_indexes[:test_size]
train_indexes=shuffle_indexes[test_size:]
x_test=x[test_indexes]
y_test=y[test_indexes]
x_train=x[train_indexes]
y_train=y[train_indexes]
print(x_train.shape)
print(y_train.shape)
(120, 4)
(120,)
print(x_test.shape)
print(y_test.shape)
(30, 4)
(30,)

3. sklearn 中的train_test_split

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=666)
print(x_train.shape)
print(y_train.shape)
(120, 4)
(120,)
print(x_test.shape)
print(y_test.shape)
(30, 4)
(30,)

4.进行预测y_predict——SKNN算法

from sklearn.neighbors import KNeighborsClassifier
kNNClassifier=KNeighborsClassifier(n_neighbors=3)
kNNClassifier.fit(x_train,y_train)
y_predict=kNNClassifier.predict(x_test)
y_predict
array([1, 2, 1, 2, 0, 1, 1, 2, 1, 1, 1, 0, 0, 0, 2, 1, 0, 2, 2, 2, 1, 0,
       2, 0, 1, 1, 0, 1, 2, 2])

5. 算准确率用y_test与y_predict结果对比

y_test
array([1, 2, 1, 2, 0, 1, 1, 2, 1, 1, 1, 0, 0, 0, 2, 1, 0, 2, 2, 2, 1, 0,
       2, 0, 1, 1, 0, 1, 2, 2])
sum(y_predict==y_test)/len(y_test)
1.0

具体SKNN过程实现举例

import numpy as np
import matplotlib.pyplot as plt
raw_data_x=[[3.3,2.3],
            [3.1,1.7],
            [1.3,3.6],
            [3.5,4.6],
            [2.2,2.8],
            [7.4,4.6],
            [5.7,3.5],
            [9.1,2.5],
            [7.7,3.4],
            [7.9,0.7]
           ]
raw_data_y=[0,0,0,0,0,1,1,1,1,1]
x_train=np.array(raw_data_x)
y_train=np.array(raw_data_y)

x_train
array([[3.3, 2.3],
       [3.1, 1.7],
       [1.3, 3.6],
       [3.5, 4.6],
       [2.2, 2.8],
       [7.4, 4.6],
       [5.7, 3.5],
       [9.1, 2.5],
       [7.7, 3.4],
       [7.9, 0.7]])
y_train
array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])
x=np.array([8.0,3.3])
1. 计算测试集中y离x的距离distance
from math import sqrt
distances=[]
for x_train in x_train:
    d=sqrt(np.sum((x_train-x)**2))
    distances.append(d)
distances
[4.805205510693586,
 5.154609587543949,
 6.706713054842886,
 4.684015371452148,
 5.821511831131154,
 1.431782106327635,
 2.308679276123039,
 1.360147050873544,
 0.31622776601683783,
 2.601922366251537]
distances= [sqrt( np.sum((x_train- x)** 2)) for x_train in x_train ]
distances
[4.805205510693586,
 5.154609587543949,
 6.706713054842886,
 4.684015371452148,
 5.821511831131154,
 1.431782106327635,
 2.308679276123039,
 1.360147050873544,
 0.31622776601683783,
 2.601922366251537]

2. 求离x最近的k个数据对应的结果

np.argsort(distances)
array([8, 7, 5, 6, 9, 3, 0, 1, 4, 2], dtype=int64)
nearest=np.argsort(distances)
k=6
topK_y=[y_train[i] for i in nearest[:k]]
topK_y
[1, 1, 1, 1, 1, 0]

3. 结果中个数最多的值为预测值

from collections import Counter
Counter(topK_y)
Counter({1: 5, 0: 1})
votes=Counter(topK_y)
votes.most_common(1)
[(1, 5)]
y_predict=votes.most_common(1)[0]

4. votes.most_common()求票数最多的几个,返回结果为一个二维数组

votes=Counter(topK_y)
votes.most_common(1)
[(1, 5)]
y_predict=votes.most_common(1)[0][0]
y_predict
1
<think>好的,用户想要用Python实现KNN算法的代码示例。我需要先回忆KNN的基本原理,然后根据用户提供的引用材料,整理出不同的实现方式。用户提到的引用有三个,分别来自scikit-learn库、手动实现以及一个排序部分的代码。 首先,我应该区分两种实现方式:使用库和手动实现。因为用户可能对这两种都感兴趣。引用[1]中的scikit-learn示例比较标准,适合快速应用。引用[2]和[3]是手动实现的代码,适合理解算法内部机制。 接下来需要检查用户的要求是否有特别偏好。用户的问题中没有明确说明,所以应该两者都涵盖。另外,用户可能需要代码的详细解释,确保他们理解每一步的作用。比如在手动实现中,欧氏距离的计算、排序和选择最近邻是关键步骤,需要解释清楚。 然后,考虑代码的正确性。比如在手动实现的示例中,createDataSet函数生成的数据是否正确,预测函数是否考虑了距离的排序和多数表决。同时,引用[3]提到的sortedClassCount使用了operator.itemgetter,这在Python3中是否仍然适用(因为iteritems在Python3中已改为items)。需要确保示例代码在当前Python版本下能够运行,可能需要调整。 另外,用户可能对KNN的参数如k值的选择、距离度量方式感兴趣,但根据问题,用户主要需要代码示例,所以这些可以作为扩展或相关问题提到,但不需要深入解释,除非用户后续提问。 还需要注意格式要求,比如行内公式用$...$,独立公式用$$...$$。不过KNN算法中的公式可能涉及距离计算,例如欧氏距离公式:$\sqrt{\sum_{i=1}^n (x_i - y_i)^2}$,需要正确应用LaTeX格式。 最后,生成相关问题,帮助用户进一步学习。比如如何选择k值,距离度量的不同方法,或者KNN的优缺点和应用场景。这些问题应该基于代码示例的延伸,帮助用户全面理解KNN的实现和应用。 总结步骤: 1. 分两部分回答:使用scikit-learn库和手动实现。 2. 分别提供代码示例,并解释关键步骤。 3. 检查代码的正确性,特别是手动实现部分是否适配Python3。 4. 确保引用正确,比如引用[1]、[2]、[3]在适当的位置标注。 5. 生成相关问题,促进用户深入学习。</think>以下是用Python实现KNN算法的两种典型方法及代码示例: ### 一、使用scikit-learn库实现(推荐) ```python from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 假设X是特征矩阵,y是标签向量 # X = [[特征1, 特征2,...], [特征1, 特征2,...], ...] # y = [标签1, 标签2, ...] # 分割数据集(80%训练,20%测试) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建KNN分类器(默认使用欧氏距离) knn = KNeighborsClassifier(n_neighbors=5) # K值设为5 # 训练模型 knn.fit(X_train, y_train) # 预测测试集 y_pred = knn.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print(f'准确率:{accuracy:.2f}') # 示例输出:准确率:0.93 ``` *特点:标准化实现,支持加权投票、多种距离度量(metric参数)[^1]* ### 二、手动实现KNN算法 ```python import numpy as np from collections import Counter def euclidean_distance(x1, x2): return np.sqrt(np.sum((x1 - x2)**2)) # 欧氏距离公式$d = \sqrt{\sum_{i=1}^n (x_i - y_i)^2}$ class KNN: def __init__(self, k=3): self.k = k def fit(self, X, y): self.X_train = X self.y_train = y def predict(self, X): y_pred = [self._predict(x) for x in X] return np.array(y_pred) def _predict(self, x): # 计算所有距离 distances = [euclidean_distance(x, x_train) for x_train in self.X_train] # 获取最近的k个样本索引 k_indices = np.argsort(distances)[:self.k] # 提取对应标签并进行多数表决 k_labels = [self.y_train[i] for i in k_indices] return Counter(k_labels).most_common(1)[0][0] # 使用示例(引用自文献[2]的数据集) X_train = np.array([[1.0,1.1], [1.0,1.0], [0,0], [0,0.1]]) y_train = ['A', 'A', 'B', 'B'] knn = KNN(k=3) knn.fit(X_train, y_train) test_sample = np.array([0.5, 0.5]) print(knn.predict([test_sample])) # 输出:['B'] ``` *关键步骤说明:* 1. 距离计算:使用$L_2$范数(欧氏距离) 2. 排序选择:np.argsort实现升序排列 3. 多数表决:Counter统计最高频标签[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值