You are on page 1of 35

Trí tuệ tính toán và ứng dụng

PGS.TS. Trần Văn Lăng


Thuật toán K-láng giềng gần nhất

• Tê n tie) ng Anh là KNN (K-Nearest Neighbor),


• Là thuậ t toá n thuộ c loạ i supervised-learning đơn giả n nha) t
• KNN có theE á p dụ ng được cho cả ClassiHication và Regression
• Khi training, KNN khô ng họ c mộ t đieL u gı̀ từ dữ liệ u, mọ i tı́nh toá n được thực hiệ n khi dự
đoá n ke) t quả củ a dữ liệ u mới

2
• Với việc phân lớp, nhã n (đaL u ra) củ a mộ t đieE m dữ liệ u (Data Point) mới được suy ra từ K
đieE m dữ liệ u gaL n nha) t trong tậ p hua) n luyệ n.
• Với hồi quy, đaL u ra củ a mộ t đieE m dữ liệ u baV ng chı́nh đaL u ra củ a đieE m dữ liệ u đã bie) t gaL n
nha) t (trong trường hợp K=1)
• Tóm tại, KNN là thuậ t toá n đi tı̀m đaL u ra củ a mộ t đieE m dữ liệ u mới baV ng cá ch chı̉ dựa
trê n thô ng tin củ a K đieE m dữ liệ u trong tậ p hua) n luyệ n gaL n nó nha) t (K-lâ n cậ n), mà
khô ng quan tâ m đe) n việ c có mộ t và i đieE m dữ liệ u trong những đieE m gaL n nha) t nà y là
nhieY u (dữ liệ u mà có lời giả i sai)

3
Minh hoạ

• Giả sử có mộ t dataset goL m 2 loạ i dữ liệ u là màu
đỏ (class 1) và màu xanh (class 0) như hı̀nh bê n
cạ nh.
• Thuậ t toá n K-NN hã y tı̀m đieE m (50,25) – có hình
dấu O màu đen – đeE bie) t đieE m nà y thuộ c class 1
hay class 2
• Cá ch là m: • Có 2 đieE m thuộ c class 1, và 1 đieE m
thuộ c class 0.
• Tı́nh khoả ng cá ch từ điểm O đe) n ta) t cả cá c
đieE m có trong Data Set. • Vậ y điểm O nà y thuộ c class 1
• Sau đó chı̉ ra K đieE m gaL n (ở đâ y la) y K = 3) với
đieE m dấu O nà y nha) t File: Draw-graph.ipynb
4
• Tạ o dữ liệ u
x = np.arange( 0,N*5,5 )
y1, y2 = [], []

• Chương trı̀nh giả i quye) t va) n đeL nà y như sau: for i in range(0,N):
y1.append( X[i][1] )
• Tạ o dữ liệ u y2.append( X[i+N][1] )
import random
N, M = 21, 2 • Vẽ hı̀nh
X1, X2, Y1, Y2 = [], [], [], [] plt.figure( figsize=(10,6) )
for i in range(0, N): plt.scatter( x,y1,c='r',marker='x',label='cl
X1.append([]), X2.append([]) ass 1' )
X1[i].append(i*5) plt.scatter( x,y2,c='b',marker='+',label='cl
X1[i].append( int(random.random()*50) ) ass 0' )
X2[i].append(i*5) plt.plot( 50, 25, 'o', color="black" )
X2[i].append( int(random.random()*50) ) plt.legend()
Y1.append( 1 ) plt.show()
Y2.append( 0 )
y = Y1 + Y2
X = X1 + X2

5
• Hua) n luyệ n và dự bá o
from sklearn import neighbors
model = neighbors.KNeighborsClassifier( n_neighbors=3 )
model.fit( X,y )
print( "Thuộc lớp: ", model.predict( [[50,25]]) )
print( "với xác suất là ", model.predict_proba( [[50,25]]) )

6
File: Draw-graph.py
Định nghĩa về khoảng cách

• Cho 2 vector X, Y có cá c thà nh phaL n là • Trong mộ t so) trường hợp riê ng, có
X = (x1, x2, . . . , xn)T, Y = (y1, y2, . . . , yn)T • Khoả ng cá ch Euclide (hay là chuaE n L2)
• Khoả ng cá ch bậ c p củ a 2 vector nà y là con so) N
| xi − yi |2

được ký hiệ u là , người ta cò n gọ i là khoả ng ∥X − Y∥2 =
cá ch Miskowsky i=1
1/p
N

(∑ )
• Khoả ng cá ch tuyệ t đo) i (p = 1) hay cò n
∥X − Y∥p = | xi − yi |p gọ i là khoả ng cá ch Hamming, hay
i=1 Manhattan
• Trong mộ t so) trường hợp riê ng N


∥X − Y∥ = | xi − yi |
i=1
7
• La) y dữ liệ u bệ nh tieE u đường củ a người Aj n
Ví dụ KNN Độ (https://www.kaggle.com/uciml/
pima-indians-diabetes-database)
• Dữ liệ u bao goL m:
• Pregnancies: So) laL n mang thai
• Glucose: Lượng Glucose
• Khoả ng cá ch Chebyshev • BloodPressure: An p huye) t tâ m trương
∥X − Y∥ = lim ∥X − Y∥p
p→∞ • SkinThickness: VeL da
N
1/p • Insulin: NoL ng độ insulin
(∑ )
= | xi − yi |p • BMI: Body mass index (tỷ lệ giữa trọ ng
i=1 lượng và chieL u cao)
= max | xi − yi | • DiabetesPedigreeFunction: loạ i tieE u
1≤i≤n
đường
• Age: TuoE i
• Outcome: Ke) t quả 1 hoặ c 0
8
Python với sci-kit learn
• Tạ o mô hı̀nh và thử nghiệ m
NUM_K = 3
model = neighbors.KNeighborsClassifier( n_neighbors=NUM_K,p=2 )

• Mô tả và chuaE n bị dữ liệ u model.fit( X_train,y_train )

import pandas as pd y_pred = model.predict( X_test )

import numpy as np
from sklearn import model_selection,metrics,neighbors
import matplotlib.pyplot as plt
data = pd.read_csv( '../dataset/diabetes.csv' )
N = len( data.columns ) - 1
X = data.iloc[:,:-1].values
y = data.iloc[:,N].values
X_train, X_test, y_train, y_test =
model_selection.train_test_split( X,y,test_size=0.3,random_state=42 )

9
plt.figure( figsize=(8,6) )
plt.title( "Đồ thị số lượng khác nhau giữa kết quả đự đoán và dataset" )
plt.plot( range(1,NUM_K),error,color='red',linestyle='dashed',marker='o',markerfacecolor='blue',
markersize=5 )
plt.xlabel( "Số láng giềng K" )
plt.ylabel( "Số lượng khác trên tổng số dữ liệu cần test" )
plt.show()

• Thử với nhieL u K khá c nhau đeE bieE u dieY n thà nh


đoL thị, qua đó bie) t được với K baV ng ma) y thı̀ có
tỷ lệ so) trường hợp dự đoá n sai

NUM_K, error = 50, []


for i in range(1,NUM_K):
model = neighbors.KNeighborsClassifier(
n_neighbors=i )
model.fit( X_train,y_train )
y_pred = model.predict( X_test )
error.append( np.mean(y_pred != y_test) ) File: KNN-sklearn.py
10
KNN dùng TensorFlow ver 2
data = pd.read_csv( '../dataset/diabetes.csv' )
• La) y lạ i dữ liệ u đã có trong vı́ dụ trước veL N = len( data.columns ) - 1
bệ nh tieE u đường.
X = data.iloc[:,:-1].values
• Mô tả thê m thư việ n TensorFlow y = data.iloc[:,N].values
import tensorflow as tf X_train,X_test,Y_train,Y_test =
import pandas as pd model_selection.train_test_split( X,y,test_size=0.3
3,random_state=42 )
import numpy as np
from sklearn import model_selection, metrics • Ơu đâ y ta định nghı̃a hà m đeE tı̀m khoả ng cá ch nhỏ
nha) t từ cá c phaL n tử trong tậ p kieE m tra đe) n tậ p
• Load dữ liệ u từ tậ p tin sau đó dà nh ra
30% là m dữ liệ u kieE m tra, và dữ liệ u nà y hua) n luyệ n.
def mindist( x_test, x_train ):
co) định trong cá c laL n thực thi khá c nhau
L = tf.sqrt( tf.reduce_sum(
củ a chương trı̀nh
tf.square(tf.subtract(x_test,x_train)),1 ) )
return tf.argmin( L,0 ).numpy()

11
• Gọ i hà m mindist() ở trê n đeE laL n lượt tı̀m phaL n tử nà o trong tậ p
hua) n luyệ n mà gaL n với từng phaL n tử củ a tậ p kieE m tra nha) t, sau
đó la) y nhã n củ a phaL n tử tương ứng cuả tậ p hua) n luyệ n gá n cho
tậ p dự đoá n nà y.
• Từ đó tı́nh độ chı́nh xá c
y_pred = tf.Variable( [1]*len(X_test) )
for i in range( len(X_test) ):
File: KNN-tensorHlow.py
k = mindist( X_test[i,:],X_train )
y_pred[i].assign( Y_train[k] )
print( "Accuracy: ",
metrics.accuracy_score(y_pred.numpy(),Y_test) )

• Ke) t quả
Accuracy: 0.6968503937007874

12
• Tổng kết lại: KNN được sử dụ ng cho việ c dự bá o cả phâ n loạ i và hoL i quy.
• Tuy nhiê n, nó được sử dụ ng rộ ng rã i cho phâ n loạ i, và thường được sử dụ ng trong cá c ứng
dụ ng tı̀m kie) m.
• 1-NN đeE tạ o mộ t mô hı̀nh có cá c lớp dựa trê n 1 đieE m dữ liệ u ở khoả ng cá ch nhỏ nha) t. Tương
tự, 2-NN có nghı̃a là chú ng ta phả i tạ o mộ t mô hı̀nh có cá c lớp dựa trê n 2 đieE m dữ liệ u với
khoả ng cá ch nhỏ nha) t.
• Cá c bước thuậ t toá n bao goL m:
• Tı́nh khoả ng cá ch giữa cá c đieE m dữ liệ u mới so với ta) t cả cá c dữ liệ u hua) n luyệ n
• Chọ n ra K mụ c có trong dữ liệ u hua) n luyệ n gaL n nha) t với đieE m dữ liệ u mới.
• Bı̀nh chọ n lớp hay nhã n phoE bie) n nha) t trong so) cá c mụ c K , đó là lớp củ a đieE m dữ liệ u
mới.

13
• Thuậ t toá n KNN được chọ n khi cá c so) lượng cá c lớp dữ liệ u tương ứng nhau veL kı́ch cỡ
• Khi mộ t đieE m dữ liệ u phụ thuộ c nhieL u tham so) thı̀ KNN sẽ phả i tı́nh khoả ng cá ch giữa cá c
đieE m ra) t chậ m
• Chọ n K baV ng bao nhiê u cũ ng là va) n đeL khó trê n mộ t dataset cụ theE

14
Thao tác thông dụng về TensorFlow version 2

• Khi dù ng TensorFlow chú ng ta


phả i khai bá o trong vù ng củ a nó .
• Khai bá o bie) n dù ng tf.Variable()
• Khai bá o haV ng, dù ng
tf.constant()
• Truy cậ p mộ t phaL n tử củ a
tensor, vı́ dụ :
• t4[1,1,2] có giá trị là 11.0
• t3[0,3] có giá trị là 4

15
• ChuyeE n vị ma trậ n, nhâ n ma trậ n

• ChuyeE n mộ t bie) n củ a TensorFlow trở thà nh mộ t


bie) n củ a Python dù ng phương thức numpy() củ a
đo) i tượng đó
• Ngược lạ i, dù ng phương thức • Tı́nh giá trị trung bı̀nh
convert_to_tensor() củ a TensorFlow

16
Thuật toán K-means

• Trong thực te) thường hay có việ c phâ n loạ i mang tı́nh tương đo) i, cha{ ng hạ n trong mộ t toE
chức do con người đieL u hà nh và quả n lý, thı̀ có những nhó m người có cù ng mộ t nhậ n định
veL mộ t sự kiệ n nà o đó .
• Va) n đeL đặ t ra là caL n phâ n loạ i đeE bie) t mộ t người trong toE chức nà y cơ bả n là thuộ c veL
nhó m nà o.
• Cũ ng như vậ y, có bao nhiê u người trong cù ng mộ t loạ i bệ nh trong mộ t cộ ng đoL ng dâ n cư
• Va) n đeL phức tạ p ở đâ y là khô ng bie) t trước cá c đặ c trưng củ a nhó m đeE phâ n lớp như trong
thuậ t toá n KNN.
• K-means hay K-means clustering, là thuậ t toá n gom cụm K nhóm theo trung bình.
• Thuậ t toá n giú p cho chú ng ta giả i quye) t va) n đeL nà y. Đâ y chı́nh là thuậ t toá n thuộ c loạ i họ c
khô ng giá m sá t
17
Minh hoạ

• Trong KNN, sau khi phâ n lớp xong thı̀ moY i


• Phâ n cụ m K-means là thuậ t toá n đơn giả n đieE m dữ liệ u chı̉ thuộ c mộ t lớp hay nhã n
trong unsupervised learning. duy nha) t.
• Trong K-means clustering, nhã n củ a từng • Trong khi đó với K-means, moY i phaL n tử có
đieE m dữ liệ u (Data point) khô ng bie) t theE thuộ c nhieL u nhó m hay cụ m.
trước.
• Nhó m/cụ m ở đâ y là tậ p hợp cá c đieE m có cá c
• Va) n đeL là là m theE nà o đeE phâ n dữ liệ u vector đặ c trưng gaL n nhau.
thà nh cá c nhó m/cụ m (cluster) sao cho
dữ liệ u trong cù ng mộ t cụ m có những • Việ c đo khoả ng cá ch giữa cá c vector thường
được thực hiệ n dựa trê n cá c chuaY n như đã
tı́nh cha) t gio) ng nhau.
trı̀nh bà y, trong đó khoả ng cá ch Euclide
được sử dụ ng phoE bie) n nha) t.
18
• Thuậ t toá n goL m cá c bước dựa trê n cá c đieE m dữ liệ u X– lưu ý là khô ng có nhã n và so)
nhó m K.
• Chọ n K đieE m ba) t kỳ là m đieE m trung tâ m củ a cá c nhó m (Center) gọ i là trọ ng tâ m
(Centroid) hay cò n gọ i là đieE m đạ i diệ n (Representative Point)
• Tı́nh khoả ng cá ch từ cá c đieE m dữ liệ u đe) n K đieE m Centroid

• Phâ n boE cá c đieE m dữ liệ u nà y và o cá c nhó m có khoả ng cá ch đe) n Centroid củ a nhó m
nà y gaL n nha) t
• Tı́nh lạ i Centroid củ a K nhó m baV ng cá ch la) y trung bı̀nh cộ ng củ a cá c đieE m đã được gá n
và o nhó m.

19
Ứng dụng

• ĐeE deY hı̀nh dung ta giả sử mộ t


cá theE (mộ t người dâ n, mộ t
người là m việ c, ...) trong quaL n
theE (mộ t cộ ng đoL ng dâ n cư, mộ t
toE chức, ...) được so) hoá baV ng
mộ t toạ độ (xi, yi)
• Cha{ ng hạ n ta có 600 đieE m dữ
liệ u được phâ n boE như hı̀nh

20
• Dữ liệ u nà y được tạ o ngaY u nhiê n baV ng phâ n pho) i Gauss xung quanh 3 đieE m chı́nh (ta tạ o
ra đeE định hướng) với ma trậ n hiệ p phương sai chı̉ định
centroids = [[5,15],[12,5],[20,20]]
DATASIZE = 600
K = 3
def myrand(centroid):
return np.random.multivariate_normal( mean=centroid,cov=[[10,0],[0,10]],size=DATASIZE )
X0 = myrand( centroids[0] )
X1 = myrand( centroids[1] )
X2 = myrand( centroids[2] )
X = np.concatenate((X0, X1, X2), axis = 0)

21
• ĐeE hua) n luyệ n baV ng K-means
model = cluster.KMeans( n_clusters=3 )
model.fit(X)
y_pred = model.predict(X)

• Sau khi có ke) t quả dự bá o, ta thử coi lạ i cá c đieE m trung tâ m
print( "Các điểm trọng tâm là\n", model.cluster_centers_ )
print( "Kết quả phân nhóm\n", y_pred )
for i in range(len(y_pred)):
print( y_pred[i], end=' ' )

• Coi qua hı̀nh minh hoạ

22
Dùng TensorFlow
• Xâ y dựng hà m hua) n luyệ n
• La) y dữ liệ u như trong vı́ def pred(tt):
cents_expanded = tf.expand_dims( tt,1 )
dụ dù ng phương thức củ a
L = tf.sqrt(tf.reduce_sum(tf.square(tf.subtract(
sklearn, ở đâ y cũ ng gio) ng
X,cents_expanded)),axis=2))
như khi dù ng TensorFlow
y = tf.argmin( L,0 )
cho KNN, ta khai bá o thê m
means = []
cá c bie) n Tensor như sau:
for c in range(K):
X = tf.Variable( X_train )
means.append( tf.reduce_mean(tf.gather(X,tf.reshape(tf.where(tf.
• La) y K thà nh phaL n trong equal(y,c)),[1,-1])),[1]) )

tậ p hua) n luyệ n X đeE là m K new_cents = tf.concat( means,0 )

trọ ng tâ m return new_cents, y

cents = tf.Variable( X[0:K]


)

23
• Lặ p lạ i 1000 laL n
for _ in range(1000):
cents, y_pred = pred( cents )

• Vẽ lạ i hı̀nh đeE trực quan hoá


plt.figure( figsize=(10,6) )
plt.title( "Có 3 nhóm cụ thể sau 1000 lần lặp" )
plt.xlabel('Trục x')
plt.ylabel('Trục y')
plt.scatter( X_train[:,0],X_train[:,1],c=y_pred,s=20 )
plt.plot( cents[:,0],cents[:,1],'k*',color='blue',markersize=15)
plt.show()
File: Kmeans-tensorHlow.py
24
Ví dụ thực tế về K-means

• Trê n internet có ra) t nhieL u


dataset đeE cho phé p chú ng ta
thực nghiệ m cá c phương phá p,
cũ ng như đeE daL n quen với việ c
giả i quye) t những va) n đeL thực
te) baV ng cá c tı́nh toá n thô ng
minh.
• Cha{ ng hạ n, https://
www.kaggle.com/datasets

25
• Hay tạ i kho veL Machine Learning củ a
Center for Machine Learning and
Intelligent Systems (http://
archive.ics.uci.edu/ml/datasets.php)
thuộ c University of California-Irvine.
• Tạ i đâ y lưu trữ dataset củ a ra) t nhieL u
lı̃nh vực từ nă m 1987 đe) n nay. NhaV m
đeE phâ n tı́ch thực nghiệ m cá c thuậ t
toá n họ c má y.

26
• Giả sử ta dù ng dữ liệ u veL bệ nh
ung thư vú (http://
archive.ics.uci.edu/ml/datasets/
Breast+Cancer+Coimbra)
• Dataset tạ i http://
archive.ics.uci.edu/ml/machine-
learning-databases/00451/
dataR2.csv
• Có 9 thuộ c tı́nh và được gá n nhã n
là 1 khoẻ mạ nh (healthy controls)
và 2 là bị bệ nh (patients)

27
• Chú ng ta có theE đọ c trực tie) p Hile nà y từ internet cũ ng với
những import như vı́ dụ trước
dataset = pd.read_csv( "http://archive.ics.uci.edu/ml/
machine-learning-databases/00451/dataR2.csv" )

• Có theE dữ liệ u khô ng đaL y đủ , baV ng cá ch kieE m tra, roL i sau
đó có theE xử lý baV ng cá ch thay giá trị trung bı̀nh tương
ứng,
dataset.isnull().any()
data = dataset.fillna( dataset.mean() )
dataset.isnull().any()

28
• Do cộ t cuo) i cù ng là nhã n được gá n (đã phâ n lớp, nê n ta dù ng cộ t nà y như là dữ liệ u đeE so sá nh
ke) t quả ), từ đâ y tạ o ra X_train và y_train như cá ch là m trong cá c vị dụ trước
N = len(data.columns)-1
X_train = data.iloc[:,0:-1].values
y_train = data.iloc[:,N].values

• Chọ n so) cụ m là 2, và lặ p lạ i 100 laL n to) i đa
model = cluster.KMeans( n_clusters=2, max_iter=100 ).fit(X_train)
y_pred = model.predict( X_train )
print( "Number of iterations run: ", model.n_iter_ )
print( "Sum of squared distances of samples to their closest cluster center: ", model.inertia_ )
print( "Coordinates of",NUM_CLUSTERS,"cluster centers\n", model.cluster_centers_ )
y_pred += 1 # Do nhãn lưu giá trị là 1 và 2
print( "Accuracy: ", metrics.accuracy_score(y_train,y_pred) )

29
• Ke) t quả sau khi hua) n luyệ n baV ng K-means

File: Kmeans-sklearn2.py

30
Tóm lại

• Với ý tưởng củ a thuậ t toá n là bộ dữ liệ u khả o sá t (mà ta hay gọ i là dataset) được phâ n thà nh
K nhó m.
• MoY i nhó m tı̀m centroid (trọ ng tâ m) tương ứng
• Sau đó tı́nh toE ng khoả ng cá ch (sum of squared distances) củ a ta) t cả cá c dữ liệ u thuộ c nhó m
nà y đe) n centroid; sau đó cộ ng doL n đeE được toE ng củ a ta) t cả (Total sum of squared distances -
TSS).
• Mụ c tiê u phâ n bộ dữ liệ u ban đaL u thà nh K cụ m khá c nhau sao cho cá c dữ liệ u thuộ c cù ng
mộ t cụ m là tương đoL ng nha) t; đieL u đó có nghı̃a TSS là nhỏ nha) t.
• Khó khá c củ a sử dụ ng K-means là lựa chọ n K sao cho to) i ưu.
• Mộ t hạ n che) củ a K-means đó là việ c gom cụ m mang tı́nh to) i ưu cụ c bộ vı̀ lời giả i tı̀m được
că n cứ và o đieE m trọ ng tâ m được "định hướng" ban đaL u
31
• Do TSS giả m khi K tă ng, và giả m cho đe) n khô ng ne) u K baV ng so) dữ liệ u.
• Mặ t khá c khi tă ng K (có nghı̃a là so) cụ m tă ng), nê n thuậ t toá n trở nê n khô ng có ý nghı̃a
khi so) cụ m là quá nhieL u.
• Chọ n K baV ng đoL thị Elbow: khi đoL thị có choY ga) p nà y rõ né t nha) t, đó là so) K to) i ưu.
• Cha{ ng hạ n với vı́ dụ trước, cho K được thử từ 2 cho đe) n 40
tss = []
K = range(2,41)
for k in K:
model = cluster.KMeans( n_clusters=k, max_iter=100 ).fit(X)
tss.append( model.inertia_ )

32
• Nhı̀n và o đoL thị Elbow, ta tha) y K = 3 là choY
bị ga) p khú c nha) t
plt.figure( figsize=(10,6) )
plt.plot( K,tss )
plt.title( "Đồ thị Elbow để chọn số K" )
plt.xlabel( "Số cụm" )
plt.ylabel( "Tổng của tất cả tổng các
khoảng cách đến các điểm trung tâm" )
plt.grid( True )
plt.show())

33
• Nhưng do ta khô ng theE chı̉ cho má y "nhı̀n và o đoL thị" được như người, mà phả i dù ng tie) ng nà o đó đeE
chı̉, ở đâ y ta lạ i dù ng "tie) ng Python".
• Nhưng trước he) t phả i dù ng Toá n họ c đeE nhậ n bie) t đâ u là Elbow Point.
• ĐieE m Elbow là đieE m mà khoả ng cá ch từ nó đe) n đường tha{ ng đi qua 2 đieE m đaL u và cuo) i củ a đường
cong là lớn nha) t.
• Trước tiê n: đâ y là phương trı̀nh đường tha{ ng qua 2 đieE m A, B (là mả ng cá c giá trị tung độ )
def fx(X,A,B):
y = []
for i in range(len(X)):
x = X[i]
temp = A[1] + (X[i]-A[0])*(B[1]-A[1])/(B[0]-A[0])
y.append( temp )
return y

34
• Tı́nh khoả ng cá ch giữa những đieE m trê n đường tha{ ng nà y và những đieE m ở trê n đường cong mà có
cù ng hoà nh độ , sau đó tı̀m đieE m có khoả ng cá ch lớn nha) t đeE trả veL .
import numpy as np
from scipy.spatial import distance • So) lượng cụ m caL n phâ n nhó m đó là vị trı́
def ElbowPoint( x_axis, curve ): củ a khoả ng cá ch lớn nha) t nà y
N = len(curve) NUM_CLUSTERS = ElbowPoint( K, tss ) + 1
S = [x_axis[0],curve[0]]
E = [x_axis[N-1],curve[N-1]] • Do chı̉ so) mà ng ba• t đaL u từ 0 nê n phả i cộ ng
y = fx( K,S,E ) thê m 1 là vậ y đó !
dist = []
for i in range(N):
x = x_axis[i]
dist.append( distance.cdist([[x,curve[i]]],[[x,y[i]]]) )
return np.argmax( dist ) File: Kmeans-sklearn.py
35

You might also like