机器学习6 K近邻

6 K近邻

6.1 KNN学习

'''
KNN点到所有样本的
# 1.计算样本点a到所有样本的距离dis
# 2.对dis排序,取出前 k 个样本
# 3.计算k 个样本所属类别,找出类别数出现次数最多的类作为a的类别

import numpy as np
import pandas as pd

class KNN():
    def knn(self,X,y,x,k):
        # 1.计算样本点a到所有样本的距离dis
        dis = np.sqrt(np.sum((X - x)**2,axis =1))
        # 2.对dis排序,取出前 k 个样本
        ind = dis.argsort()
        dis_k = ind[:k]
        # 3.计算k 个样本所属类别,找出类别数出现次数最多的类作为a的类别
        pd.value_counts(dis_k).keys()[0]


'''
import numpy as np
import pandas as pd

#1.生成数据

def knn(x, y, k, samples):
    m,n = samples.shape
    #2.计算距离
    result = []
    for i in range(m):
        if samples.ndim > 1:
            dist = np.sqrt(np.sum((x-samples[i])**2, axis=-1))
        else:
            dist = np.sqrt((x-samples[i])**2)


        #3.排序,从小到大排列
        ind = np.argsort(dist,axis=-1)[:k]
        #4.找出类别最多样本的标签[pd.value_counts(i).idxmax()foriiny[ind]]==list(map(lambdax:pd.value_counts(x).idxmax(),y[ind]))

        if ind.ndim > 1:
            res = [pd.value_counts(i).idxmax() for i in y[ind]]#要用map吗?list(map(lambdax:pd.value_counts(x).idxmax(),y[ind]))
        else:
            res = pd.value_counts(y[ind]).idxmax()
        result.append(res)
    return result



if __name__=="__main__":
    '''
    # 1 samples.shape=[m,n]
    x = [np.array([np.random.randn(60)*0.019+i*10]).reshape([-1, 2]) for i in range(3)]
    x = np.concatenate([x[0], x[1], x[2]], axis=0)
    y = np.concatenate([np.ones(30)*0,
                        np.ones(30)*1,
                        np.ones(30)*2])

    samples = np.array([[0, 0],[10,10],[30,30]])
    k = 5
    knn = knn(x, y, k, samples)
    print('{}'.format(knn))'''

    # 2 samples.shape=[1,]
    x1 = [np.array([(np.random.randn(30)+i*10)]).reshape(-1,1) for i in range(3)]
    x1 = np.concatenate([x1[0], x1[1], x1[2]], axis=0)
    y1 = np.concatenate([np.ones(30)*0,
                        np.ones(30)*1,
                        np.ones(30)*2])
    samples1 = np.array([0,10,20]).reshape(-1,1)
    k = 5
    knn1 = knn(x=x1, y=y1, k=k, samples=samples1)
    print('{}'.format(knn1))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值