k近邻(knn)原理及python实现
时间: 2024-06-17 12:06:41 浏览: 23
k近邻(k-Nearest Neighbors,简称k-NN)是一种常用的分类和回归算法,其原理是通过比较一个新样本与训练集中所有样本的距离,然后找到距离最近的k个训练样本,利用它们的类别标签进行分类预测,或者利用它们的数值标签进行回归预测。
具体实现过程如下:
1. 对于一个新样本,计算它与训练集中所有样本的距离(比如欧式距离或曼哈顿距离等);
2. 找到距离最近的k个训练样本,即邻居;
3. 利用这k个邻居的类别标签(或数值标签)进行分类或回归预测。对于分类问题,可以采用多数表决的方式确定新样本的类别;对于回归问题,可以采用平均值或加权平均值的方式确定新样本的数值。
在Python中,可以使用scikit-learn库实现k近邻算法。具体实现代码如下:
```
from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor
# 分类问题
clf = KNeighborsClassifier(n_neighbors=k)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
# 回归问题
reg = KNeighborsRegressor(n_neighbors=k)
reg.fit(X_train, y_train)
y_pred = reg.predict(X_test)
```
其中,X_train和y_train是训练集的特征和标签,X_test是测试集的特征。n_neighbors参数表示k值,即邻居的个数。
相关问题
K近邻法及Python实现
K近邻法是一种基于实例的学习方法,它的主要思想是通过计算待分类样本与训练样本之间的距离来确定待分类样本所属的类别。具体来说,对于一个未知类别的样本,首先计算它与训练集中每个样本之间的距离,然后选取距离最近的K个训练样本,并统计它们所属类别的出现次数,最后将该未知样本归为出现次数最多的类别。
下面是一个简单的K近邻法的Python实现:
```python
import numpy as np
from collections import Counter
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 = []
for x in X:
distances = np.sqrt(np.sum((x - self.X_train) ** 2, axis=1))
indices = np.argsort(distances)[:self.k]
closest_labels = [self.y_train[i] for i in indices]
c = Counter(closest_labels)
y_pred.append(c.most_common()[0][0])
return np.array(y_pred)
```
这里的 `fit` 方法用于训练模型,接受训练集的特征向量 `X` 和标签 `y` 作为输入;`predict` 方法用于预测新的样本,接受待分类样本的特征向量 `X` 作为输入,并返回预测的标签。
在使用K近邻法时,需要注意选择合适的K值,一般来说,K值越小,模型越复杂,容易出现过拟合;K值越大,模型越简单,容易出现欠拟合。因此需要通过交叉验证等方法来确定最优的K值。
K近邻法及Python实现输出结果
K近邻法是一种简单而有效的机器学习算法,常用于分类和回归问题。它的基本思想是找到最接近一个样本的K个样本,然后根据这K个样本的标签来确定该样本的标签。
下面是一个简单的Python实现K近邻法的例子:
```python
import numpy as np
from collections import Counter
# 定义KNN算法函数
def knn(x_train, y_train, x, k):
distances = [] # 记录距离
for i in range(len(x_train)):
distance = np.sqrt(np.sum(np.square(x - x_train[i]))) # 计算欧氏距离
distances.append((distance, y_train[i])) # 将距离和标签加入列表
distances.sort() # 按距离排序
k_labels = [label for _, label in distances[:k]] # 取前k个样本的标签
label = Counter(k_labels).most_common(1)[0][0] # 找出出现次数最多的标签
return label
# 测试数据
x_train = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]])
y_train = np.array([0, 0, 0, 1, 1, 1])
x_test = np.array([3, 3])
# 调用KNN算法
k = 3
label = knn(x_train, y_train, x_test, k)
# 输出结果
print("测试样本属于类别:", label)
```
在上面的代码中,我们定义了一个`knn()`函数来实现K近邻算法。该函数接受四个参数:训练数据集、训练数据集的标签、测试数据集和K值。在函数内部,我们计算了测试数据集与每个训练数据集之间的欧氏距离,并将距离和标签存储在一个列表中。然后,我们将这个列表按照距离从小到大排序,并取前K个样本的标签。最后,我们使用`Counter`函数找到出现次数最多的标签,并返回该标签作为测试样本的预测结果。
在该代码中,我们使用了一个简单的二维数据集来测试算法。如果你运行上述代码,你应该会看到输出结果“测试样本属于类别: 0”,这意味着该测试样本属于标签为 0 的类别。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)