k近邻 注释

编程实现k近邻分类器,利用西瓜数据集3.0α,给出其中编号为8的西瓜的预测结果。

代码全是《机器学习》上的,只是将其整合到了一起,能够运行手写体识别。
内容大部分进行了注释,可能有些注释不够精准或者不容理解,见谅!

代码:

from numpy import * #引入numpy用来构建数据类型
import operator #用来计算距离

dataMat=array([[0.697,0.460],[0.774,0.376], [0.634,0.264],
[0.608,0.318],[0.556,0.215],[0.403,0.237],
[0.481,0.149],[0.666,0.091],[0.243,0.267],
[0.245,0.057],[0.343,0.099],[0.639,0.161],
[0.657,0.198],[0.360,0.370],[0.593,0.042],
[0.719,0.103]]) #准备训练数据

def classify0(inX, dataSet, labels, k): #k临近距离计算,并且输出频率最大的数
dataSetSize = dataSet.shape[0] #统计数据的行数
diffMat = tile(inX, (dataSetSize,1)) - dataSet #计算被测数据与训练数据的差
sqDiffMat = diffMat2 #平方
sqDistances = sqDiffMat.sum(axis=1) #求和
distances = sqDistances
0.5 #开方求距离
sortedDistIndicies = distances.argsort() #给距离排序,返回他们的索引
classCount={} #建立一个字典
for i in range(k): #遍历前k个数
voteIlabel = labels[sortedDistIndicies[i]] #返回第k索引的标签
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #统计该标签的个数
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) #将标签个数按照降序排序
return sortedClassCount[0][0]

if name==‘main’:
labels=[‘是’,‘是’,‘是’,‘是’,‘是’,‘是’,‘是’,‘否’,‘否’,‘否’,‘否’,‘否’,‘否’,‘否’,‘否’,‘否’,]
inX=[0.437 ,0.211]
k=int(input(“请输入k值:”))
ccc=classify0(inX,dataMat,labels,k) #调用函数
print(ccc) #输出标签结果

运行结果

在这里插入图片描述
k的取值范围1-16,都可以,建议1-6.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
K-近邻算法(K-Nearest Neighbor,KNN)是一种简单有效的分类和回归算法,其核心思想是在训练集中找到与测试样本最相似的K个样本,然后根据这K个样本的类别(或数值)进行分类(或回归)。KNN的主要优点是实现简单,对于非线性和复杂的数据集有很好的效果;缺点是需要大量时间和空间存储训练数据,并且测试时需要进行大量的计算。 下面是KNN的快速算法实现,其中样本集划分采用K均值聚类,搜索时采用分枝定界算法。代码使用Python实现,具体注释见代码: ```python import numpy as np from sklearn.cluster import KMeans class FastKNN: def __init__(self, k=5): """ 初始化KNN模型,设置近邻数K """ self.k = k def fit(self, X, y): """ 训练KNN模型,X为训练集数据,y为训练集标签 """ # 将数据和标签组合成一个矩阵 self.train_data = np.hstack([X, y.reshape(-1, 1)]) # 划分训练集,采用K均值聚类 kmeans = KMeans(n_clusters=self.k, random_state=0).fit(X) self.clusters = kmeans.cluster_centers_ # 计算每个样本所属的簇 self.cluster_labels = kmeans.predict(X) # 对每个簇的样本进行排序 self.sorted_clusters = [] for i in range(self.k): cluster_data = self.train_data[self.cluster_labels == i] sorted_cluster = cluster_data[np.argsort(cluster_data[:, -2])] self.sorted_clusters.append(sorted_cluster) def predict(self, X): """ 预测新样本的标签,X为测试集数据 """ y_pred = [] for x in X: # 初始化近邻列表 neighbors = [] for i in range(self.k): # 计算测试样本和簇中心的距离 dist = np.linalg.norm(x - self.clusters[i]) # 计算测试样本和簇中每个样本的距离 cluster_data = self.sorted_clusters[i][:, :-2] cluster_dist = np.linalg.norm(cluster_data - x, axis=1) # 将距离和标签组成一个元组,加入近邻列表 neighbors.extend(zip(cluster_dist, self.sorted_clusters[i][:, -1])) # 对近邻列表进行排序,并取前K个作为最终的近邻 neighbors = sorted(neighbors)[:self.k] # 统计最终K个近邻的标签 labels = [label for _, label in neighbors] y_pred.append(max(set(labels), key=labels.count)) return np.array(y_pred) ``` 接下来,我们用一个简单的二分类任务来测试KNN模型的性能。首先,我们生成一个随机的二分类数据集: ```python import numpy as np from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split # 生成随机的二分类数据集 X, y = make_classification(n_samples=1000, n_features=10, n_classes=2, random_state=0) # 将数据集划分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) ``` 然后,我们使用KNN模型进行训练和预测,并计算模型的精度: ```python from sklearn.metrics import accuracy_score # 初始化KNN模型,设置K=5 knn = FastKNN(k=5) # 训练KNN模型 knn.fit(X_train, y_train) # 预测测试集数据 y_pred = knn.predict(X_test) # 计算模型精度 accuracy = accuracy_score(y_test, y_pred) print("模型精度:", accuracy) ``` 最终,我们得到了一个精度为0.96的KNN模型,说明该算法在这个简单的二分类任务中表现良好。 分枝定界算法是一种常用的搜索算法,其主要思想是在搜索过程中,根据已知信息对搜索空间进行剪枝,从而减少搜索的时间和空间复杂度。在KNN算法中,分枝定界算法可以用来加速近邻搜索过程。具体来说,我们可以将训练集样本按照某种方式进行排序,然后对于每个测试样本,只搜索距离其最近的一些训练样本,从而减少搜索的时间和空间复杂度。 下面是KNN模型中的近邻搜索过程,其中采用了分枝定界算法: ```python def predict(self, X): """ 预测新样本的标签,X为测试集数据 """ y_pred = [] for x in X: # 初始化近邻列表 neighbors = [] for i in range(self.k): # 计算测试样本和簇中心的距离 dist = np.linalg.norm(x - self.clusters[i]) # 如果距离大于当前最近邻的距离,则跳过该簇 if neighbors and dist > neighbors[-1][0]: continue # 计算测试样本和簇中每个样本的距离 cluster_data = self.sorted_clusters[i][:, :-2] cluster_dist = np.linalg.norm(cluster_data - x, axis=1) # 将距离和标签组成一个元组,加入近邻列表 for j, d in enumerate(cluster_dist): # 如果距离大于当前最近邻的距离,则跳过该样本 if neighbors and d > neighbors[-1][0]: continue neighbors.append((d, self.sorted_clusters[i][j, -1])) # 对近邻列表进行排序,并取前K个作为最终的近邻 neighbors = sorted(neighbors)[:self.k] # 统计最终K个近邻的标签 labels = [label for _, label in neighbors] y_pred.append(max(set(labels), key=labels.count)) return np.array(y_pred) ``` 在这个近邻搜索过程中,我们首先计算测试样本和每个簇中心的距离,并按照距离进行排序。然后,对于每个簇,我们只搜索距离测试样本最近的一些样本,从而避免搜索整个簇,从而减少搜索的时间和空间复杂度。 最终,我们得到了一个快速的KNN算法实现,可以在大规模数据集上进行高效的分类和回归任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值