Memilih metode untuk mencari operasi serupa

Kami dihadapkan pada tugas untuk mengidentifikasi kelompok klien yang memiliki perilaku investasi yang sama ketika melakukan transaksi di pasar sekuritas yang terorganisir.





Untuk solusi yang efektif untuk masalah ini, pertama-tama, perlu ditentukan formulasi yang benar.





, . «» . – , . , , , .  , !





, :





  • ,





  • ( )





  • (/).





2 , , , , . – !





:





from matplotlib import pyplot as plt
from mpl_toolkits import mplot3d

fig = plt.figure()
ax = plt.axes(projection = '3d')
ax.scatter3D(X[:,0],X[:,1],X[:,2])
plt.show()
      
      



2 SKlearn ML – KMeans, DBSCAN () BallTree.





DBSCAN

DBSCAN (Density-based spatial clustering of applications with noise), ), , . β€”  Ο΅- . , , , DBSCAN ? .





:





, , , . , , :





X = df[['ORDERDATETIME','SECURCODE','OPERATION']].values
model = DBSCAN(min_samples=2, eps = 0.5).fit(X)
df['LabelsDBS'] = model.labels_
df['ORDERDATETIME']=pd.to_datetime(df['ORDERDATETIME'])
gr=df.groupby(['LabelsDBS','CLIENTCODE']).count()

l=[]
ll=[]
for i in range(gr.shape[0]):
    l.append(gr.index[i][0])
    ll.append(gr.index[i][1])
l=pd.DataFrame(l)
l.rename(columns={0:'Ind'}, inplace=True)
l['Code']=ll
l=l.query('Ind > 0')
a = l.groupby('Ind').count()
a=a.query('Code>1 & Code<4').index.values
a=list(a)
l=l.query('Ind == @a')
l = pd.DataFrame(l.groupby('Ind')['Code'].apply(list))
      
      



, DBSCAN , .





KMeans

 k- .  k  – , . , .





  – ,  X. , .





  – , , . , – Β« k-Β».





  , , k- n- 1. . .. , , . .





, DBSCAN ( ) :





X = df[['ORDERDATETIME','SECURCODE','OPERATION']].values
model = KMeans(n_clusters=9900).fit(X)
      
      



, , – .





BallTree

ML – . . , , , .





, :





tree = BallTree(X, leaf_size=2)
dist, ind = tree.query(X, k=2)
l=[]
ll=[]
lll=[]
dist, ind = tree.query(X, k=2)
for i, (ind, d) in enumerate(zip(ind, dist)):
    print(f'Y index {i}, closest index X is {ind[1]}, dist {d[1]}')
    l.append(ind[0])
    ll.append(ind[1])
    lll.append(d[1])
for i in range(len(l)):
    l[i]=df.iloc[l[i]].CLIENTCODE
    ll[i]=df.iloc[ll[i]].CLIENTCODE
l=pd.DataFrame(l)
l.rename(columns={0:'Ind1'}, inplace=True)
l['Ind2']=ll
l['DIST']=lll
l = l.query('DIST>0 & Ind1 != Ind2')
l
      
      



, , , – , , , .





Berdasarkan pekerjaan yang dilakukan, kami dapat menyimpulkan bahwa, meskipun metode untuk menemukan operasi pelanggan yang serupa berbeda dan menggunakan metode matematika yang berbeda, kesimpulannya hampir sama. Ini berarti bahwa salah satu metode dapat digunakan untuk mempersempit pencarian untuk operasi serupa. Masih ada pertanyaan tentang memilih alat yang lebih nyaman untuk tugas tertentu - mengorbankan kecepatan demi kenyamanan atau untuk mencari penerapan jarak yang ditemukan sendiri. Kamu putuskan!








All Articles