KNN(K-Nearest Neighbors)是一种常用的分类算法,它的基本思想是根据样本之间的距离来判断它们的类别。在本文中,我们将介绍如何使用Python实现KNN分类算法,并提供两个示例说明。
KNN分类算法的实现
KNN分类算法的实现过程包括以下几个步骤:
- 加载数据集
- 划分训练集和测试集
- 计算样本之间的距离
- 选择K个最近邻样本
- 根据K个最近邻样本的类别进行投票
- 输出预测结果
下面是一个简单的示例,用于演示如何使用Python实现KNN分类算法。
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 计算样本之间的距离
def euclidean_distance(x1, x2):
return np.sqrt(np.sum((x1 - x2) ** 2))
# 选择K个最近邻样本
def get_neighbors(X_train, y_train, x_test, k):
distances = []
for i in range(len(X_train)):
dist = euclidean_distance(X_train[i], x_test)
distances.append((X_train[i], y_train[i], dist))
distances.sort(key=lambda x: x[2])
neighbors = []
for i in range(k):
neighbors.append((distances[i][0], distances[i][1]))
return neighbors
# 根据K个最近邻样本的类别进行投票
def vote(neighbors):
class_votes = {}
for neighbor in neighbors:
label = neighbor[1]
if label in class_votes:
class_votes[label] += 1
else:
class_votes[label] = 1
sorted_votes = sorted(class_votes.items(), key=lambda x: x[1], reverse=True)
return sorted_votes[0][0]
# 输出预测结果
def predict(X_train, y_train, X_test, k):
predictions = []
for i in range(len(X_test)):
neighbors = get_neighbors(X_train, y_train, X_test[i], k)
result = vote(neighbors)
predictions.append(result)
return predictions
# 训练模型并预测测试集
y_pred = predict(X_train, y_train, X_test, k=3)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy:', accuracy)
在这个示例中,我们首先使用load_iris函数加载鸢尾花数据集。然后,我们将数据集划分为训练集和测试集,其中测试集占总数据集的30%。接下来,我们定义了三个函数:euclidean_distance用于计算样本之间的欧几里得距离,get_neighbors用于选择K个最近邻样本,vote用于根据K个最近邻样本的类别进行投票。然后,我们定义了一个predict函数,用于训练模型并预测测试集。最后,我们计算模型的准确率,并输出结果。
示例1:使用KNN分类算法进行鸢尾花分类
下面是一个示例,用于演示如何使用KNN分类算法进行鸢尾花分类。在这个示例中,我们使用KNN分类算法来训练模型,并使用测试集来评估模型的准确率。
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 计算样本之间的距离
def euclidean_distance(x1, x2):
return np.sqrt(np.sum((x1 - x2) ** 2))
# 选择K个最近邻样本
def get_neighbors(X_train, y_train, x_test, k):
distances = []
for i in range(len(X_train)):
dist = euclidean_distance(X_train[i], x_test)
distances.append((X_train[i], y_train[i], dist))
distances.sort(key=lambda x: x[2])
neighbors = []
for i in range(k):
neighbors.append((distances[i][0], distances[i][1]))
return neighbors
# 根据K个最近邻样本的类别进行投票
def vote(neighbors):
class_votes = {}
for neighbor in neighbors:
label = neighbor[1]
if label in class_votes:
class_votes[label] += 1
else:
class_votes[label] = 1
sorted_votes = sorted(class_votes.items(), key=lambda x: x[1], reverse=True)
return sorted_votes[0][0]
# 输出预测结果
def predict(X_train, y_train, X_test, k):
predictions = []
for i in range(len(X_test)):
neighbors = get_neighbors(X_train, y_train, X_test[i], k)
result = vote(neighbors)
predictions.append(result)
return predictions
# 训练模型并预测测试集
y_pred = predict(X_train, y_train, X_test, k=3)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy:', accuracy)
在这个示例中,我们首先使用load_iris函数加载鸢尾花数据集。然后,我们将数据集划分为训练集和测试集,其中测试集占总数据集的30%。接下来,我们定义了三个函数:euclidean_distance用于计算样本之间的欧几里得距离,get_neighbors用于选择K个最近邻样本,vote用于根据K个最近邻样本的类别进行投票。然后,我们定义了一个predict函数,用于训练模型并预测测试集。最后,我们计算模型的准确率,并输出结果。
示例2:使用KNN分类算法进行手写数字识别
下面是一个示例,用于演示如何使用KNN分类算法进行手写数字识别。在这个示例中,我们使用KNN分类算法来训练模型,并使用测试集来评估模型的准确率。
import numpy as np
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载数据集
digits = load_digits()
X = digits.data
y = digits.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 计算样本之间的距离
def euclidean_distance(x1, x2):
return np.sqrt(np.sum((x1 - x2) ** 2))
# 选择K个最近邻样本
def get_neighbors(X_train, y_train, x_test, k):
distances = []
for i in range(len(X_train)):
dist = euclidean_distance(X_train[i], x_test)
distances.append((X_train[i], y_train[i], dist))
distances.sort(key=lambda x: x[2])
neighbors = []
for i in range(k):
neighbors.append((distances[i][0], distances[i][1]))
return neighbors
# 根据K个最近邻样本的类别进行投票
def vote(neighbors):
class_votes = {}
for neighbor in neighbors:
label = neighbor[1]
if label in class_votes:
class_votes[label] += 1
else:
class_votes[label] = 1
sorted_votes = sorted(class_votes.items(), key=lambda x: x[1], reverse=True)
return sorted_votes[0][0]
# 输出预测结果
def predict(X_train, y_train, X_test, k):
predictions = []
for i in range(len(X_test)):
neighbors = get_neighbors(X_train, y_train, X_test[i], k)
result = vote(neighbors)
predictions.append(result)
return predictions
# 训练模型并预测测试集
y_pred = predict(X_train, y_train, X_test, k=3)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy:', accuracy)
在这个示例中,我们首先使用load_digits函数加载手写数字数据集。然后,我们将数据集划分为训练集和测试集,其中测试集占总数据集的30%。接下来,我们定义了三个函数:euclidean_distance用于计算样本之间的欧几里得距离,get_neighbors用于选择K个最近邻样本,vote用于根据K个最近邻样本的类别进行投票。然后,我们定义了一个predict函数,用于训练模型并预测测试集。最后,我们计算模型的准确率,并输出结果。
总结
本文介绍了如何使用Python实现KNN分类算法,并提供了两个示例说明。在实际应用中,我们可以根据具体的问题选择不同的K值和距离度量方法,并结合其他算法进行综合处理,实现复杂的数据结构和算法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用Python处理KNN分类算法的实现代码 - Python技术站