CCF 202006 1 線性分類器 python

2022-03-20 09:51:15 字數 3475 閱讀 8443

題目:

線性分類器(line)

【題目描述】

考慮乙個簡單的二分類問題——將二維平面上的點分為a和b兩類。

訓練資料報含n個點,其中第i個點(1≤i≤n)可以表示為乙個三元組(x,y,type),即該點的橫座標、縱座標和類別。

在二維平面上,任意一條直線可以表示為 θ₀+θ₁x+θ₂y=0的形式,即由θ₀,θ₁,θ₂三個引數確定該直線,且滿足θ₀,θ₁不同時為0。

基於這n個已知類別的點,我們想要在平面上找到一條直線作為乙個線性分類器。具體來說,這條線要把訓練資料中的a、b兩類點完美分隔開來,即一側只有a類點、另一側只有b類點。這樣,對於任意乙個的未知類別的點,我們就可以根據它是位於直線的哪一側來**它的類別了。

在本題中我們僅需要處理m個如下查詢:給定一條直線,判斷它是否能將訓練資料中的a、b兩類點完美分開。

【輸入格式】

從標準輸入讀入資料。輸入共n+m+1行。

第一行包含用空格分隔的兩個正整數n和m,分別表示點和查詢的個數。

第二行到第n+1行依次輸入n個點的資訊。第i+1行(1≤i≤n)包含用空格分隔的三項x,y和type,分別表示第i個點的橫、縱座標和類別,其中座標為整數、類別為乙個大寫英文本母a或b。

第n+2行到第n+m+1行依次輸入m個查詢。第j+n+1行(1≤j≤m)包含用空格分隔的三個整數θ₀,θ₁和θ₂,表示第j個查詢中給定直線的三個引數。

【輸出格式】

輸出到標準輸出。

輸出共m行,每行輸出乙個字串。

第j行(1≤j≤m)輸出的字串對應第個查詢的結果:如果給定直線可以完美分隔a、b兩類點,則輸出yes;否則輸出no。

【樣例1輸入】

9 31 1 a

1 0 a

1 -1 a

2 2 b

2 3 b

0 1 a

3 1 b

1 3 b

2 0 a

0 2 -3

-3 0 2

-3 1 1

【樣例1輸出】

nono

yes**,用的python,從別人那裡扒過來的。已獲得同意  

#

-*- coding: utf-8 -*-

defjudga(lis1, z):

s =0

for i in

lis1:

if z[0] + i[0] * z[1] + i[1] * z[2] >0:

s += 1

if s == len(lis1) or s ==0:

return

true

else

:

return

false

defjudg(x, y, z):

flag =false

if (z[0] + x[0] * z[1] + x[1] * z[2]) * (z[0] + y[0] * z[1] + y[1] * z[2]) <0:

flag =true

return

flag

if__name__ == '

__main__':

da_list = #

存放a類點

db_list = #

存放b類點

d_list =

n, m =map(int, input().split())

for i in

range(n):

raw =input()

x, y, z =raw.split()

x =int(x)

y =int(y)

tub1 =(x, y, z)

if tub1[2] == 'a'

:

else

:

for i in

range(m):

a, b, c =map(int, input().split())

tub2 =(a, b, c)

for i in

range(m):

if judga(da_list, d_list[i]) == true and judga(db_list, d_list[i]) ==true:

ifjudg(da_list[0], db_list[0], d_list[i]):

print('

yes'

)

else

:

print('no'

)

else

:

print('

no')

再補乙個我自己寫的

#

-*- coding: utf-8 -*-

def f(a, b, c, x, y): #

判斷是哪一類點

l = a + b * x + c *y

if l >0:

return'a

'else

:

return'b

'n, m =map(int, input().split())

lista =

listb =

for i in

range(n):

x, y, t =input().split()

x, y =int(x), int(y)

if t == 'a'

:

else

:an =

for i in

range(m):

a =b =

a, b, c =map(int, input().split())

for j in

lista:

for j in

listb:

seta = set(a) #

set函式去除列表中的重複元素,

setb =set(b)

#如果列表中的點都在一邊,set()後只有乙個元素(有可能是a或b,但那不重要,只要知道他只有乙個元素就夠了)

if len(seta) == len(setb)==1: #

如果a、b列表中的元素都是統一的,即這條線做到了劃分

yes'

)

else:'

no')for i in

an:

print

(i)'''

9 31 1 a

1 0 a

1 -1 a

2 2 b

2 3 b

0 1 a

3 1 b

1 3 b

2 0 a

0 2 -3

-3 0 2

-3 1 1

'''

滿分

CCF 202006 1 線性分類器

標籤 相似題目 題目 考慮乙個簡單的二分類問題 將二維平面上的點分為a 和b 兩類。訓練資料報含 n 個點,其中第 i 個點 1 i n 可以表示為乙個三元組 xi xi yiyi typeitypei 即該點的橫座標 縱座標和類別。在二維平面上,任意一條直線可以表示為 0 1x 2y 0 0 1 ...

CCF202006 1 線性分類器

線性分類器 line 題目描述 考慮乙個簡單的二分類問題 將二維平面上的點分為a和b兩類。訓練資料報含n個點,其中第i個點 1 i n 可以表示為乙個三元組 x,y,type 即該點的橫座標 縱座標和類別。在二維平面上,任意一條直線可以表示為 x y 0的形式,即由 三個引數確定該直線,且滿足 不同...

202006 1 線性分類器 ccf csp

問題描述 我們可以先寫乙個函式用來判斷 目標點在直線的上方還是下方 def judge theta0,theta1,theta2,x,y theta0 theta1 x theta2 y 0 y 1 float theta0 theta1 x theta2 if y y return true 點在...