python编程之k-近邻算法 史上最详细最全面版本

要求

核心是一个绿色的圆圈,当k=3的时候(k是距离圆圈最近的物体的个数),有2个三角1个正方形,2>1,所以是三角区域;

当k=5的时候,3个正方形>2个三角形,所以是正方形区域;

编一个程序,输入k时,返回一个区域类型;

python编程之k-近邻算法 史上最详细最全面版本_第1张图片

解决方案


1、自定义一个类number,里面有name、kinds、x、y属性

2、初始化9个值;

3、求距离

4、排序

5、传一个k,进行计数比较,得出究竟是什么范围?

 

##author命运的信徒
##date:2019.12.4
##k-近邻算法
class number(object):  ##定义一个类,有名称、类型、x,y轴坐标
    def __init__(self, name, kinds, x, y):  ##有参构造方法
        self.name = name;  ##是共有属性
        self._kinds = kinds;  ##是私有属性,不可以被类.属性名调用
        self.x = x;
        self.y = y;

    def setKinds(self, kinds):  # 对私有属性的赋值
        self._kinds = kinds

    def getKinds(self):  # 对私有属性的取值
        return self._kinds


class haha:  ##定义另一个类
    num0 = number("核心", "五角星", 0, 0)
    ###第一部分传值
    num7 = number("B", "三角形", -1, 2)
    num8 = number("A", "三角形", 1, 3)
    num3 = number("C", "正方形", 2, 4)
    num6 = number("D", "正方形", 3, 6)
    num5 = number("E", "正方形", 2, 7)
    num2 = number("F", "正方形", 3, 8)
    num4 = number("G", "三角形", 4, 9)
    num1 = number("H", "三角形", 4, 10)

    lisnum = [num1, num2, num3, num4, num5, num6, num7, num8]
    lislables = []
    ##第二部分计算距离
    for i in lisnum:
        ##x差平方+y差平方之和,在开方
        line=((i.x-num0.x)**2+(i.y-num0.y)**2)**0.5
        lislables.append(line)
    ##复制一份求距离的列表
    lables=lislables[:]
    ##minlab是按照最小值进行排序的集合
    minlab=[]
###第三部分从小到大排序
    while len(lables)>0:
        mi=min(lables)
        index=lislables.index(mi)
        minlab.append(index)
        del lables[lables.index(mi)]

    print(minlab)
###第四部分根据k返回区域类型
    k=5;
    m=0
    n=0
    for j in range(k):
       if(lisnum[minlab[j]].getKinds()=="三角形"):
           m=m+1
       else:
           n=n+1;

    if(m>n):
        print("是三角形区域")
    elif(m

 

运行结果

k=5的时候是正方形区域

python编程之k-近邻算法 史上最详细最全面版本_第2张图片

你可能感兴趣的:(python编程专栏)