問題描述
我們可以先寫乙個函式用來判斷 目標點在直線的上方還是下方:
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的形式,即由 三個引數確定該直線,且滿足...