নামমাত্র / বৃত্তাকার ভেরিয়েবলের জন্য এসওএম ক্লাস্টারিং


11

কেবল ভাবছেন যে নামমাত্র উপকরণগুলির মধ্যে কেউ ক্লাস্টারিংয়ের সাথে পরিচিত কিনা। আমি সমাধান হিসাবে SOM এ খুঁজছি কিন্তু দৃশ্যত এটি শুধুমাত্র সংখ্যাগত বৈশিষ্ট্যগুলির সাথে কাজ করে। শ্রেণীবদ্ধ বৈশিষ্ট্যগুলির জন্য কোনও এক্সটেনশন রয়েছে? বিশেষত আমি সম্ভাব্য বৈশিষ্ট্য হিসাবে 'সপ্তাহের দিনগুলি' নিয়ে ভাবছিলাম। অবশ্যই এটি একটি সংখ্যাসূচক বৈশিষ্ট্যে রূপান্তর করা সম্ভব (অর্থাত সোম - রৌদ্র সংখ্যা 1-7 এর সাথে সম্পর্কিত) তবে তবে সূর্য এবং সোম (1 এবং 7) এর মধ্যে ইউক্লিডিয়ান দূরত্ব সোম থেকে মঙ্গল (1 এবং 2) দূরত্বের সমান হবে না )। কোন পরামর্শ বা ধারণা অনেক প্রশংসা করা হবে।


(+1) একটি খুব আকর্ষণীয় প্রশ্ন
স্টিফেন

2
চক্রীয় পরিবর্তনশীল কমপ্লেক্স প্লেনের ইউনিট বৃত্তের উপাদান হিসাবে বিবেচনা করা হয়। সুতরাং, সপ্তাহের দিনগুলিকে মানচিত্র বলা স্বাভাবিক হবে (বলুন) পয়েন্টগুলি , ; যেমন , , , ... । = 0 , ... , 6 ( কোসাইন্ ( 0 ) , পাপ ( 0 ) ) ( কোসাইন্ ( 2 π / 7 ) , পাপ ( 2 π / 7 ) ) ( কোসাইন্ ( 12 π / 7 ) , পাপ ( 12 π / 7 )exp(2jπi/7)j=0,,6(cos(0),sin(0))(cos(2π/7),sin(2π/7))(cos(12π/7),sin(12π/7))
whuber

1
আমার নিজের দূরত্বের ম্যাট্রিক্স কোড করতে হবে তারপরে চক্রীয় ভেরিয়েবলগুলির সাথে নির্দিষ্ট? কেবল ভাবছি এই ধরণের ক্লাস্টারিংয়ের জন্য ইতিমধ্যে বিদ্যমান অ্যালগরিদম রয়েছে কিনা। thx
মাইকেল

@ মিশেল: আমি বিশ্বাস করি যে আপনি আপনার নিজের দূরত্বের মেট্রিক নির্দিষ্ট করতে চাইবেন যা আপনার আবেদনের জন্য উপযুক্ত এবং এটি কেবলমাত্র ডাউ নয়, আপনার ডেটাতে সমস্ত মাত্রার উপর সংজ্ঞায়িত । আনুষ্ঠানিকভাবে, x, y আপনার ডেটা স্পেসে পয়েন্ট চিহ্নিত করতে আপনাকে সাধারণ বৈশিষ্ট্য সহ একটি মেট্রিক ফাংশন ডি (x, y) নির্ধারণ করতে হবে: d (x, x) = 0, d (x, y) = d (y) , x), এবং d (x, z) <= d (x, y) + d (y, z) একবার আপনি এটি সম্পন্ন করার পরে, এসওএম তৈরি করা যান্ত্রিক। সৃজনশীল চ্যালেঞ্জটি হ'ল () কে এমনভাবে সংজ্ঞায়িত করা যা আপনার আবেদনের পক্ষে উপযুক্ত "মিল" ধারণাটি ক্যাপচার করে।
আর্থার ছোট

উত্তর:


7

পটভূমি:

ঘন্টাকে রূপান্তরিত করার সর্বাধিক যৌক্তিক উপায় হ'ল দুটি ভেরিয়েবলগুলিতে যা সিঙ্কের বাইরে পিছনে পিছনে ঘুরছে। ২৪ ঘন্টা ঘড়ির কাঁটা হাতে রেখে শেষের অবস্থানটি কল্পনা করুন। xঅবস্থান সোমালিয়ার দিকে নিচ্ছে সঙ্গে আগে পিছে সিঙ্কের বাইরে yঅবস্থান। একটি 24-ঘন্টার ঘড়ি জন্য আপনার সাথে এই কাজ করা সম্ভব করতে পারেন x=sin(2pi*hour/24), y=cos(2pi*hour/24)

আপনার উভয় ভেরিয়েবলের প্রয়োজন বা সময়ের সাথে যথাযথ চলাচল নষ্ট হয়ে যায়। এটি পাপ বা কোস উভয়ের উদ্ভূত সময়ে (x,y)পরিবর্তিত হয় এবং ইউনিট বৃত্তের চারপাশে ভ্রমণ করার সাথে সাথে অবস্থানটি সহজেই পরিবর্তিত হয় to

অবশেষে, লিনিয়ার সময়ের সন্ধানে তৃতীয় বৈশিষ্ট্য যুক্ত করা সার্থক কিনা তা বিবেচনা করুন, যা প্রথম রেকর্ডের শুরু থেকে কোনও ইউনিক্স টাইম স্ট্যাম্প বা অনুরূপ কিছু তৈরির পরে ঘন্টা (বা মিনিট বা সেকেন্ড) হিসাবে নির্মিত যেতে পারে। এই তিনটি বৈশিষ্ট্য তখন সময়ের চক্র এবং রৈখিক অগ্রগতির উভয়ের জন্য প্রক্সি সরবরাহ করে যেমন আপনি জনগণের চলাফেরায় ঘুমের চক্রের মতো চক্রীয় ঘটনাটিও বের করতে পারেন এবং জনসংখ্যার তুলনায় লিনিয়ার বৃদ্ধিও সময়ের তুলনায়।

যদি সম্পন্ন হচ্ছে এর উদাহরণ:

# Enable inline plotting
%matplotlib inline

#Import everything I need...

import numpy as np
import matplotlib as mp

import matplotlib.pyplot as plt
import pandas as pd

# Grab some random times from here: https://www.random.org/clock-times/
# put them into a csv.
from pandas import DataFrame, read_csv
df = read_csv('/Users/angus/Machine_Learning/ipython_notebooks/times.csv',delimiter=':')
df['hourfloat']=df.hour+df.minute/60.0
df['x']=np.sin(2.*np.pi*df.hourfloat/24.)
df['y']=np.cos(2.*np.pi*df.hourfloat/24.)

df

এখানে চিত্র বর্ণনা লিখুন

def kmeansshow(k,X):

    from sklearn import cluster
    from matplotlib import pyplot
    import numpy as np

    kmeans = cluster.KMeans(n_clusters=k)
    kmeans.fit(X)

    labels = kmeans.labels_
    centroids = kmeans.cluster_centers_
    #print centroids

    for i in range(k):
        # select only data observations with cluster label == i
        ds = X[np.where(labels==i)]
        # plot the data observations
        pyplot.plot(ds[:,0],ds[:,1],'o')
        # plot the centroids
        lines = pyplot.plot(centroids[i,0],centroids[i,1],'kx')
        # make the centroid x's bigger
        pyplot.setp(lines,ms=15.0)
        pyplot.setp(lines,mew=2.0)
    pyplot.show()
    return centroids

এখন এটি চেষ্টা করে দেখুন:

kmeansshow(6,df[['x', 'y']].values)

এখানে চিত্র বর্ণনা লিখুন

আপনি সবেমাত্র দেখতে পাচ্ছেন যে মধ্যরাতের পরে কিছুটা পূর্ব মধ্যরাতের সবুজ গুচ্ছের সাথে অন্তর্ভুক্ত রয়েছে। এখন ক্লাস্টারের সংখ্যা হ্রাস করুন এবং দেখান যে মধ্যরাতের আগে এবং পরে একটি ক্লাস্টারে আরও বিশদে সংযুক্ত করা যেতে পারে:

kmeansshow(3,df[['x', 'y']].values)

এখানে চিত্র বর্ণনা লিখুন

দেখুন নীল ক্লাস্টারে কীভাবে বারবার মধ্যরাতের আগের এবং পরে একই ক্লাস্টারে একসাথে ক্লাস্টার থাকে ...

আপনি এটি সময়, বা সপ্তাহের দিন, বা মাসের সপ্তাহ, বা মাসের দিন, বা মরসুম বা অন্য যে কোনও কিছুর জন্য করতে পারেন।


সহায়ক (+1)। এটি এমন একটি অ্যাপ্লিকেশন যেখানে গ্রাফগুলি চৌম্বকীয় নয় এমন গুরুত্বপূর্ণ যা গুরুত্বপূর্ণ। আমি আপনার সফ্টওয়্যারটি জানি না তবে আমি ধারণা করি আপনি ডিফল্ট থেকে দূরে 1 তে অনুপাত সেট করতে পারেন।
নিক কক্স

এটি সত্য @ নিককক্স অথবা আপনি কেবল নিজের মাথায় লিনিয়ার রূপান্তর সম্পাদন করতে পারেন ;-)
user1745038

2

সাধারণত নামমাত্র ভেরিয়েবলগুলি ডেমি কোডড হয় যখন SOM এ ব্যবহৃত হয় (উদাহরণস্বরূপ, সোমবারের জন্য 0 এর জন্য 1 সহ একটি ভেরিয়েবল 0 সোমবার নয়, অন্য মঙ্গলবার ইত্যাদি)।

সংলগ্ন দিনের সংযুক্ত বিভাগ তৈরি করে আপনি অতিরিক্ত তথ্য সংযুক্ত করতে পারেন। উদাহরণস্বরূপ: সোমবার ও মঙ্গলবার, মঙ্গলবার ও বুধবার ইত্যাদি However তবে আপনার ডেটা যদি মানুষের আচরণের সাথে সম্পর্কিত হয় তবে সপ্তাহের দিন এবং উইকেন্ডকে বিভাগ হিসাবে ব্যবহার করা প্রায়শই বেশি কার্যকর।


2

নামমাত্র ভেরিয়েবলের জন্য, নিউরাল নেটওয়ার্ক বা বৈদ্যুতিক ইঞ্জিনিয়ারিং প্রসঙ্গে সাধারণত এনকোডিংকে "ওয়ান-হট" বলা হয় - সমস্ত 0 এর ভেক্টর, ভেরিয়েবলের মানটির জন্য যথাযথ স্থানে 1 করে। সপ্তাহের দিনগুলির জন্য, উদাহরণস্বরূপ, এখানে সাত দিন রয়েছে, সুতরাং আপনার এক-গরম ভেক্টরগুলির দৈর্ঘ্য সাত হবে। তারপরে সোমবারকে [1 0 0 0 0 0 0], মঙ্গলবার [0 1 0 0 0 0 0], ইত্যাদি হিসাবে উপস্থাপন করা হবে etc.

টিম ইঙ্গিত করার সাথে সাথে, এই পদ্ধতিরটিকে সহজেই সাধারণভাবে বুলিয়ান বৈশিষ্ট্যযুক্ত ভেক্টরকে অন্তর্ভুক্ত করতে পারে, যেখানে ভেক্টরের প্রতিটি অবস্থান আপনার ডেটাতে আগ্রহের বৈশিষ্ট্যের সাথে মিল রাখে এবং অবস্থানটি 1 বা 0 এ সেট করা থাকে যাতে উপস্থিতি বা অনুপস্থিতি নির্দেশ করে বৈশিষ্ট্য।

আপনার একবার বাইনারি ভেক্টর পরে, হ্যামিং দূরত্বটি প্রাকৃতিক মেট্রিকে পরিণত হয়, যদিও ইউক্যালিডিয়ান দূরত্বটিও ব্যবহৃত হয়। এক-গরম বাইনারি ভেক্টরগুলির জন্য, প্রতিটি ভেক্টর পজিশনের জন্য এসওএম (বা অন্যান্য ফাংশন আনুমানিক) স্বাভাবিকভাবে 0 এবং 1 এর মধ্যে বিভক্ত হবে। এই ক্ষেত্রে, এই ভেক্টরগুলিকে প্রায়শই নামমাত্র পরিবর্তনশীলের স্থানের উপরে একটি বল্টজম্যান বা সফটম্যাক্স বিতরণের পরামিতি হিসাবে বিবেচনা করা হয়; এই চিকিত্সা কিছুটা কেএল ডাইভারজেন্স দৃশ্যে ভেক্টরগুলি ব্যবহার করার একটি উপায় দেয়।

সাইক্লিক ভেরিয়েবলগুলি অনেক কৌতুকপূর্ণ। আর্থার মন্তব্যে যেমন বলেছিলেন, আপনাকে নিজের একটি দূরত্বের মেট্রিকের সংজ্ঞা দিতে হবে যা ভেরিয়েবলের চক্রীয় প্রকৃতিকে অন্তর্ভুক্ত করে।


1

ধরে নেওয়া সপ্তাহের দিন (ডাউন) [0, 6] থেকে চলে যায়, কোনও বৃত্তে ডেটা প্রজেক্ট করার পরিবর্তে অন্য বিকল্পটি ব্যবহার করা হয়:

dist = min(abs(dow_diff), 7 - abs(dow_diff))

কেন তা বুঝতে, একটি ঘড়ি হিসাবে ডাউটিকে বিবেচনা করুন

  6  0
5      1
4      2
    3

6 এবং 1 এর মধ্যে পার্থক্য 6 - 1 = 5 (1 থেকে 6 থেকে ঘড়ির কাঁটার দিকে এগিয়ে যাওয়া) বা 7 - (6 - 1) = 2 হতে পারে both

সাধারণভাবে আপনি ব্যবহার করতে পারেন: min(abs(diff), range - abs(diff))


0

আমি তার মন্তব্যে হুবহু প্রকাশিত হওয়ায় সাফল্যের সাথে সপ্তাহের দিনগুলি (এবং বছরের মাস) টিপল (কোপ, পাপ) হিসাবে এনকোড করেছি। ব্যবহৃত ইউক্লিডিয়ান দূরত্বের চেয়ে বেশি।

এটি আর-তে কোডের একটি উদাহরণ:

circularVariable = function(n, r = 4){
 #Transform a circular variable (e.g. Month so the year or day of the week) into two new variables (tuple).
 #n = upper limit of the sequence. E.g. for days of the week this is 7.
 #r =  number of digits to round generated variables.
 #Return
 #
 coord = function(y){
   angle = ((2*pi)/n) *y
   cs = round(cos(angle),r)
   s = round(sin(angle),r)
   c(cs,s)
 }
 do.call("rbind", lapply((0:(n-1)), coord))
}

0 থেকে 6 এর মধ্যে ইউক্লিডিয়ান দূরত্ব 0 এবং 1 এর সমান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.