202006 1 線性分類器 ccf csp

2021-10-24 01:42:58 字數 3927 閱讀 7799

問題描述

我們可以先寫乙個函式用來判斷 目標點在直線的上方還是下方:

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

#點在直線上面

return

false

#點在直線下面

乙個正確的線性分類器應該有:①同乙個type的點,返回的結果(在直線上方還是下方)應該是一致的 ②a點和b點返回的結果是不同的

寫主函式**:

n,m =

map(

int,

input()

.split())

list_n =

for i in

range(0

,n):

x,y,

type

=map

(str

,input()

.split())

x=int(x)

y=int(y)

list_temp =

(x,y,

type

)list_m =

for i in

range(0

,m):

theta0,theta1,theta2 =

map(

int,

input()

.split())

res_a =-1

#用來儲存上乙個a型別點的結果

res_b =-1

#用來儲存上乙個b型別點的結果

flag =

true

#同一型別的點返回的結果中是否有不一致的情況

for dot in list_n:

res = judge(theta0, theta1, theta2, dot[0]

, dot[1]

)if dot[2]

=='a'

:if res_a !=-1

and res_a != res:

#和上乙個點返回的結果不同,直接跳出一層迴圈,略過後面的步驟

flag =

false

break

res_a = res

if dot[2]

=='b'

:if res_b !=-1

and res_b != res:

flag =

false

break

res_b = res

if flag and res_a != res_b:

#當然,a的點和b的點也必須在直線的不同側

print

("yes"

)else

:print

("no"

)

提交執行發現只得了75分,開始找bug,發現:

怪自己太粗心了,theta2是可以等於0的,那麼我judge函式中會因此出錯:

def

judge

(theta0,theta1,theta2,x,y)

:# theta0 + theta1 * x + theta2 * y = 0

#theta2作為除數是不能等於0的,所以下面這句碰到theta2=0時會出錯

y =-1

*(float

)(theta0 + theta1 * x)

/theta2

if y > y:

return

true

#點在直線上面

return

false

#點在直線下面

修改judge函式的**後,再次執行,成功。完整**如下:

def

judge

(theta0,theta1,theta2,x,y)

:if theta2 !=0:

# theta0 + theta1 * x + theta2 * y = 0

y =-1

*(float

)(theta0 + theta1 * x)

/theta2

if y > y:

return

true

#點在直線上面

return

false

#點在直線下面

else

:# theta0 + theta1 * x = 0

x =-1

*float

(theta0)

/ theta1

if x < x:

return

true

#點在直線左邊

return

false

#點在直線右邊

n,m =

map(

int,

input()

.split())

list_n =

for i in

range(0

,n):

x,y,

type

=map

(str

,input()

.split())

x=int(x)

y=int(y)

list_temp =

(x,y,

type

)list_m =

for i in

range(0

,m):

theta0,theta1,theta2 =

map(

int,

input()

.split())

res_a =-1

res_b =-1

flag =

true

for dot in list_n:

res = judge(theta0, theta1, theta2, dot[0]

, dot[1]

)if dot[2]

=='a'

:if res_a !=-1

and res_a != res:

flag =

false

break

res_a = res

if dot[2]

=='b'

:if res_b !=-1

and res_b != res:

flag =

false

break

res_b = res

if flag and res_a != res_b:

print

("yes"

)else

:print

("no"

)

樣例1輸入:

931

1 a1

0 a1

-1 a

22 b

23 b

01 a

31 b

13 b

20 a02

-3-3

02-3

11

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的形式,即由 三個引數確定該直線,且滿足 不同...

CCF 202006 1 線性分類器 python

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