मेरे पास निम्न डेटा है:

import pandas as pd
import random
import matplotlib.pyplot as plt

df = pd.DataFrame()
df['x'] = [3, 2, 4, 3, 4, 6, 8, 7, 8, 9]
df['y'] = [3, 2, 3, 4, 5, 6, 5, 4, 4, 3]
df['val'] = [1, 10, 1, 1, 1, 8, 1, 1, 1, 1]

k = 2
centroids = {i + 1: [np.random.randint(0, 10), np.random.randint(0, 10)] for i in range(k)}

plt.scatter(df['x'], df['y'], color='blue')
for i in centroids.keys():
    plt.scatter(*centroids[i], color='red', marker='^')
plt.show()

plot centroid

मैं प्रारंभिक सेंट्रोइड्स को उच्चतम मूल्य वाले डेटा बिंदुओं पर रखना चाहता हूं। फिर, इस मामले में, केन्द्रक निर्देशांक (2, 2) और (6, 6) के साथ डेटा बिंदुओं पर स्थित होना चाहिए।

   x  y  val
0  3  3    1
1  2  2   10
2  4  3    1
3  3  4    1
4  4  5    1
5  6  6    8
6  8  5    1
7  7  4    1
8  8  4    1
9  9  3    1
0
arizamoona 25 नवम्बर 2017, 16:22
1
क्या आप स्किकिट लर्न के KMeans अनुमानक का उपयोग कर रहे हैं? यदि ऐसा है, तो आप प्रारंभिक केंद्र देते हुए एक सरणी पास कर सकते हैं। init पैरामीटर यहां देखें। या आप पूछ रहे हैं कि उस सरणी को पहली जगह कैसे बनाया जाए?
 – 
Mark Dickinson
25 नवम्बर 2017, 16:27
हां, मैं पूछ रहा हूं कि मुझे उच्चतम मूल्य वाले नोड्स पर सेंट्रोइड्स रखने के लिए पायथन कोड कैसे लिखना है क्योंकि मैंने यहां स्किकिट लर्निंग का उपयोग नहीं किया है। मैंने kmeans के लिए अपने स्वयं के कोड लिखे।
 – 
arizamoona
25 नवम्बर 2017, 16:34

2 जवाब

आप शीर्ष k मानों की अनुक्रमणिका प्राप्त करने के लिए val कॉलम द्वारा डेटाफ़्रेम को सॉर्ट कर सकते हैं और फिर df.iloc का उपयोग करके डेटाफ़्रेम को स्लाइस कर सकते हैं।


अवरोही क्रम में छँटाई:

df = df.sort_values('val', ascending=False)
print(df)

   x  y  val
1  2  2   10
5  6  6    8
0  3  3    1
2  4  3    1
3  3  4    1
4  4  5    1
6  8  5    1
7  7  4    1
8  8  4    1
9  9  3    1

डेटाफ़्रेम को स्लाइस करना:

k=2 # Number of centroids
highest_points_as_centroids = df.iloc[0:k,[0,1]]

print(highest_points_as_centroids )

   x  y
1  2  2
5  6  6

आप highest_points_as_centroids.values द्वारा x, y मानों को एक संख्यात्मक सरणी के रूप में प्राप्त कर सकते हैं

array([[2, 2],
       [6, 6]], dtype=int64)

संपादित करें1:

या, अधिक संक्षेप में (जैसा कि @sharatpc द्वारा सुझाया गया है)

df.nlargest(2, 'val')[['x','y']].values
array([[2, 2],
   [6, 6]], dtype=int64)

EDIT2:

जैसा कि ओपी ने टिप्पणी की थी कि वे चाहते हैं कि सेंट्रोइड्स एक शब्दकोश में हों:

centroids = highest_points_as_centroids.reset_index(drop=True).T.to_dict('list')
print(centroids)
{0: [2L, 2L], 1: [6L, 6L]}

यदि 1 से शुरू करने के लिए डिक्शनरी कीज़ की सख्त आवश्यकता है:

highest_points_as_centroids.reset_index(drop=True, inplace=True)
highest_points_as_centroids.index +=1
centroids = highest_points_as_centroids.T.to_dict('list')
print(centroids)
{1: [2L, 2L], 2: [6L, 6L]}
1
akilat90 26 नवम्बर 2017, 04:51
1
आपको डेटाफ्रेम को टुकड़ा करने की आवश्यकता नहीं है। शीर्ष 2 प्राप्त करने के लिए बस सबसे बड़ा का उपयोग करें: df.nlargest(2, 'val'); या df.sort_values('val',ascending=False).head(2)
 – 
skrubber
25 नवम्बर 2017, 17:28
यदि आप आउटपुट से x और y चाहते हैं तो: df.nlargest(k, 'val')[['x','y']] या df.sort_values('val',ascending=False)[['x','y']].head(k)
 – 
skrubber
25 नवम्बर 2017, 17:37
धन्यवाद! nlargest के बारे में नहीं जानते थे। मैंने इसे उत्तर में जोड़ा।
 – 
akilat90
25 नवम्बर 2017, 18:05
1
centroids=df.nlargest(k, 'val')[['x','y']] plt.scatter(df['x'], df['y'], color='blue') plt.scatter(centroids.x, centroids.y, color='red', marker='^') plt.show() लाल मार्कर नीले रंग पर सुपरइम्पोज़ करेगा
 – 
skrubber
25 नवम्बर 2017, 20:49
1
लूप के बिना शब्दकोश में सेंट्रोइड्स प्राप्त करने के लिए उत्तर संपादित किया
 – 
akilat90
26 नवम्बर 2017, 04:52

बस एक ही स्थान पर @arzamoona के अन्य प्रश्नों का उत्तर देने के लिए:

import pandas as pd
import random
import matplotlib.pyplot as plt

df = pd.DataFrame()
df['x'] = [3, 2, 4, 3, 4, 6, 8, 7, 8, 9]
df['y'] = [3, 2, 3, 4, 5, 6, 5, 4, 4, 3]
df['val'] = [1, 10, 1, 1, 1, 8, 1, 1, 1, 1]

k = 2
centroids=df.nlargest(k, 'val')[['x','y']]

plt.scatter(df['x'], df['y'], color='blue')
plt.scatter(centroids.x, centroids.y, color='red', marker='^')
plt.show()

enter image description here

और फिर एक शब्दकोश में केन्द्रक मान जोड़ने के लिए:

{i:v for i,v in enumerate(centroids.values.tolist())}
{0: [2, 2], 1: [6, 6]}
0
skrubber 25 नवम्बर 2017, 22:34
आप लूप के बिना सेंट्रोइड्स को डिक्शनरी में बदलने के लिए to_dict का उपयोग कर सकते हैं।
 – 
akilat90
26 नवम्बर 2017, 04:53
लेकिन यह एक प्रसार देगा: {'x': {1: 2, 5: 6}, 'y': {1: 2, 5: 6}}
 – 
skrubber
26 नवम्बर 2017, 04:58
आपको orient तर्क बदलना होगा। मेरे उत्तर के संपादन 2 की जाँच करें
 – 
akilat90
26 नवम्बर 2017, 04:59
1
अच्छा पांडा रास्ता। :)
 – 
skrubber
26 नवम्बर 2017, 05:07
क्षमा करें, मैं for i in centroids.keys(): plt.scatter(*centroids[i], color='red', marker='^') का उपयोग {i:v for i,v in enumerate(centroids.values.tolist())} के साथ करना चाहता हूं, लेकिन इसमें त्रुटि हुई। मुझे क्या करना चाहिए?
 – 
arizamoona
26 नवम्बर 2017, 09:21