CSP 202006-1 线性分类器 python

Posted 风信子的猫Redamancy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSP 202006-1 线性分类器 python相关的知识,希望对你有一定的参考价值。

CSP 202006-1 线性分类器 python

题目描述


思路

简单来说,就是判断是否能够二分类两条直线,一般来说,如果在直线两侧,分别输入两类,一个是大于0,一个是小于0,有个符号的变换

在这里,如果每次都要判断两次符号,分别计算就比较麻烦,我们可以设置一个标志,就是说如果A点是在直线上方,那么带入就是大于0,A的标志为1,B的标志就为-1,这样子就是得到直线f乘上标志位flag都是大于0的,如果每次都大于0,就说明我们是分对了。

但是我万万没想到,这样只能拿60分,因为还有一个任务,我们要判断一下,A和B是不是都出现过,如果只有一类样本,我们也是输出No

所以最后我们只需要判断f*flag < 0,小于说明没分好类,直接就break退出了

代码

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# @File    :   202006-1.py
# @Time    :   2021/11/20 12:24:38
# @Author  :   DKJ
# @Contact :   1016617094@qq.com
# @Software:   VScode

n,m = map(int,input().split(' '))
data = []
for i in range(n):
    # 将输入数据压入data
    data.append(list(input().split(' ')))
    
def f(z,x,y,X,Y):
    # 得到直线方程
    return z + x*X + y*Y

for i in range(m):
    key = 
    count = 
    z,x,y = map(int,input().split())
    
    if f(z,x,y,int(data[0][0]),int(data[0][1])) > 0:
        key['A'] = 1
        key['B'] = -1
    else:
        key['A'] = -1
        key['B'] = 1
    flag = 1
    for j in range(1,n):
        # 如果是正确分类的话,满足f*key > 0,key是进行符号变换的
        if f(z,x,y,int(data[j][0]),int(data[j][1])) * key[data[j][2]] < 0:
            flag = 0
            break
        else:
            count[key[data[j][2]]] = 1
    # 子任务,A和B都要存在,如果不存在也是No
    if 'A' and 'B' not in count.keys():
        flag = 0
    if flag:
        print('Yes')
    else:
        print('No')

以上是关于CSP 202006-1 线性分类器 python的主要内容,如果未能解决你的问题,请参考以下文章

用线性分类器实现预测鸢尾花的种类(python)

机器学习之路:python线性回归分类器 进行良恶性肿瘤分类预测

python实现感知机线性分类模型

python: ccf考试202006-1,202006-2 题解(100分)

@CSP模拟2019.10.16 - T3@ 垃圾分类

CCF-CSP 202006 赛题训练