写一段knn算法代码
时间: 2023-09-21 14:06:13 浏览: 132
### 回答1:
```python
from sklearn.neighbors import KNeighborsClassifier
# 设置k值为5
knn = KNeighborsClassifier(n_neighbors=5)
# 训练模型
knn.fit(X_train, y_train)
# 预测
y_pred = knn.predict(X_test)
# 评估
print(metrics.accuracy_score(y_test, y_pred))
```
上面这段代码使用了 scikit-learn 库中的 KNeighborsClassifier 来实现 KNN 算法。
首先通过设置 n_neighbors=5 实例化了一个 knn 分类器对象,然后使用 fit 方法训练模型,
最后使用 predict 方法预测测试集的类别,并使用 accuracy_score 来评估模型的准确度。
值得注意的是,在上面的代码中,X_train, y_train, X_test, y_test 都是训练集和测试集数据。
### 回答2:
KNN(K-最近邻)算法是一种分类和回归的机器学习算法。其基本思想是根据实例之间的距离来确定新样本的分类。以下是一个简单的KNN分类算法的示例代码:
```python
import numpy as np
def euclidean_distance(x1, x2):
# 计算欧几里得距离
return np.sqrt(np.sum((x1 - x2)**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):
# 计算新样本x与所有训练样本之间的距离
distances = [euclidean_distance(x, x_train) for x_train in self.X_train]
# 对距离进行排序,获取距离最小的k个样本的索引
k_indices = np.argsort(distances)[:self.k]
# 获取距离最小的k个样本的对应标签
k_nearest_labels = [self.y_train[i] for i in k_indices]
# 统计k个样本中每个类别出现的次数
most_common = np.argmax(np.bincount(k_nearest_labels))
return most_common
```
上述代码中,首先定义了一个计算欧几里得距离的函数`euclidean_distance`,它用于衡量两个样本之间的距离。接下来定义了一个KNN类,其中初始化函数`__init__`用于指定k值,默认为3。`fit`函数用于训练模型,接收训练集X和对应的标签y作为输入。`predict`函数用于对新样本进行分类预测,接收测试集X作为输入,通过调用私有函数`_predict`来对每个样本进行预测。私有函数`_predict`计算新样本与所有训练样本之间的距离,并按照距离的远近进行排序,取出距离最小的k个样本的标签进行统计,最后返回出现次数最多的标签作为预测结果。
这段代码提供了一个简单的KNN算法的实现,可以通过实例化KNN类、调用fit函数进行模型训练,再通过调用predict函数进行分类预测。
### 回答3:
K最近邻(K-nearest neighbors,KNN)是一种简单且经典的分类算法。它根据事先标记好的数据集中的样本属性和类别,以及待分类样本的属性,通过比较距离确定待分类样本的类别。以下是一个简单的KNN算法的代码示例。
```python
import numpy as np
def knn(train_data, train_labels, test_data, k):
distances = []
# 计算待分类样本与训练样本之间的欧几里得距离
for i in range(len(train_data)):
distance = np.sqrt(np.sum(np.square(test_data - train_data[i])))
distances.append((distance, train_labels[i]))
# 根据距离进行排序
distances.sort(key=lambda x: x[0])
# 统计前k个最近邻居中的类别
class_count = {}
for i in range(k):
label = distances[i][1]
class_count[label] = class_count.get(label, 0) + 1
# 返回出现次数最多的类别作为待分类样本的类别
max_count = 0
max_label = None
for label, count in class_count.items():
if count > max_count:
max_count = count
max_label = label
return max_label
# 示例数据
train_data = np.array([[1, 1], [1, 2], [2, 2], [4, 4], [5, 5]])
train_labels = np.array(['A', 'A', 'A', 'B', 'B'])
test_data = np.array([3, 3])
k = 3
# 调用KNN算法进行分类
class_label = knn(train_data, train_labels, test_data, k)
print("待分类样本的类别为:", class_label)
```
在上述代码中,我们首先计算待分类样本与训练样本之间的欧几里得距离,并将距离以及对应的类别保存在列表`distances`中。然后,我们根据距离进行排序,选取前k个最近邻居,并统计它们的类别。最后,我们返回出现次数最多的类别作为待分类样本的类别。
以上就是一个简单的KNN算法的实现。该算法可以根据训练数据集对未知样本进行分类。
阅读全文