Python 如何在没有库的情况下创建knn函数

Python 如何在没有库的情况下创建knn函数,python,knn,survey,Python,Knn,Survey,谢谢同事们,2问 请帮我填写这份数据可视化后4-5分钟的新冠病毒寿命调查 我正在尝试创建KNN,而不使用库来达到学术目的 请检查我的代码以改进 from math import sqrt from collections import Counter def euclidean_distance(obs1,obs2): distance=0 for i in range(len(obs1)): distance+=(obs1[i]-obs2[i])**2

谢谢同事们,2问

  • 请帮我填写这份数据可视化后4-5分钟的新冠病毒寿命调查
  • 我正在尝试创建KNN,而不使用库来达到学术目的
  • 请检查我的代码以改进

    from math import sqrt
    from collections import Counter
    
    def euclidean_distance(obs1,obs2):
        distance=0
        for i in range(len(obs1)):
            distance+=(obs1[i]-obs2[i])**2
        return sqrt(distance)
    
     # Locate the most similar neighbors
    def get_neighbors(dataset, test, size_neighbors):
        distances = list()
        for X_trains in X_train:
            dist = euclidean_distance(X_trains, X_test)
            distances.append((X_train, dist))
        distances.sort(key=lambda tup: tup[1])
        neighbors = list()
        for i in range(size_neighbors):
            neighbors.append(distances[i][0])
        return neighbors
    neighbors = get_neighbors(X_train, X_test, 13)
    for neighbor in neighbors:
        print(neighbor)
    

    我相信您需要
    numpy
    继续并尝试以下代码:

    将numpy导入为np
    KNearestNeighbor级:
    定义初始化(self,k):
    self.k=k
    self.eps=1e-8
    def传动系(自、X、y):
    self.X_列车=X
    self.y_train=y
    def预测(自、X_测试、num_循环=0):
    如果num_循环==0:
    距离=自身。计算距离向量化(X检验)
    elif num_循环==1:
    距离=自身。计算距离一个循环(X测试)
    其他:
    距离=自身。计算两个循环的距离(X检验)
    返回自我预测标签(距离)
    def计算距离两个循环(自、X测试):
    """
    低效的简单实现,仅限使用
    作为了解kNN正在做什么的一种方式
    """
    num_test=X_test.shape[0]
    num\u train=self.X\u train.shape[0]
    距离=np.零((num_测试,num_序列))
    对于范围内的i(num_测试):
    对于范围内的j(数量列车):
    #(无需使用sqrt:最小距离不会改变,因为sqrt是单调的)
    距离[i,j]=np.sqrt(
    self.eps+np.sum((X_测试[i,:]-self.X_训练[j,:])**2)
    )
    返回距离
    def计算距离单循环(自、X测试):
    """
    比两个循环好得多,但不如完全矢量化版本快。
    在X_列车中使用Numpy广播-X_测试[i,:]
    """
    num_test=X_test.shape[0]
    num\u train=self.X\u train.shape[0]
    距离=np.零((num_测试,num_序列))
    对于范围内的i(num_测试):
    #(无需使用sqrt:最小距离不会改变,因为sqrt是单调的)
    距离[i,:]=np.sqrt(
    self.eps+np.sum((self.X_列车-X_测试[i,:])**2,轴=1)
    )
    返回距离
    def计算距离矢量化(自、X测试):
    """
    要理解这一点很难,我们使用重
    矢量化以及numpy广播。
    想法:如果我们有两个向量a,b(两个例子)
    对于向量,我们可以计算(a-b)^2=a^2-2a(点)b+b^2
    在此基础上进行扩展,并对每个向量进行扩展,将
    所有示例的重矢量化公式同时使用。
    """
    X_检验的平方=np.和(X_检验**2,轴=1,keepdims=True)
    X_列的平方=np.和(self.X_列**2,轴=1,keepdims=True)
    two_X_test_X_train=np.dot(X_test,self.X_train.T)
    #(无需使用sqrt:最小距离不会改变,因为sqrt是单调的)
    返回np.sqrt(
    self.eps+X_test_squared-2*two_X_test_X_train+X_train_squared.T
    )
    def/U标签(自身、距离):
    num_test=距离。形状[0]
    y_pred=np.零(num_测试)
    对于范围内的i(num_测试):
    y_index=np.argsort(距离[i,:])
    k_最近的_类=self.y_列[y_索引[:self.k]].astype(int)
    y_pred[i]=np.argmax(np.bincount(k_最近的类))
    返回y_pred
    如果名称=“\uuuuu main\uuuuuuuu”:
    X=np.数组([[1,1],[3,1],[1,4],[2,4],[3,3],[5,1])
    y=np.array([0,0,0,1,1,1])
    KNN=KNearestNeighbor(k=1)
    KNN.列车(X,y)
    y_pred=KNN.predict(X,num_循环=0)
    打印(f“精度:{sum(y_pred==y)/y.shape[0]}”)