Một cách tốt để chuyển đổi các thuộc tính Cyclic Ordinal là gì?


21

Tôi có trường 'giờ' là thuộc tính của mình, nhưng nó có giá trị theo chu kỳ. Làm cách nào tôi có thể chuyển đổi tính năng để lưu giữ thông tin như '23' và '0' giờ gần không xa.

Một cách tôi có thể nghĩ là thực hiện chuyển đổi: min(h, 23-h)

Input: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]

Output: [0 1 2 3 4 5 6 7 8 9 10 11 11 10 9 8 7 6 5 4 3 2 1]

Có bất kỳ tiêu chuẩn để xử lý các thuộc tính như vậy?

Cập nhật: Tôi sẽ sử dụng phương pháp học giám sát, để đào tạo phân loại rừng ngẫu nhiên!


1
Câu hỏi đầu tiên tuyệt vời! Bạn có thể thêm một số thông tin về mục tiêu của bạn để thực hiện chuyển đổi tính năng cụ thể này là gì không? Bạn có định sử dụng tính năng chuyển đổi này làm đầu vào cho một vấn đề học tập có giám sát không? Nếu vậy, hãy xem xét thêm thông tin đó vì nó có thể giúp người khác trả lời câu hỏi này tốt hơn.
Nitesh

1
@Nitesh, Vui lòng xem cập nhật
Mangat Rai Modi

Bạn có thể tìm thấy câu trả lời tại đây: datascience.stackexchange.com/questions/4967/iêng
MrMeritology

Xin lỗi nhưng tôi không thể bình luận. @ AN6U5 bạn có thể vui lòng mở rộng cách xem xét đồng thời ngày trong tuần và giờ theo cách tiếp cận tuyệt vời của bạn không? Tôi đang vật lộn với điều này kể từ một tuần và tôi cũng đã đăng một Q nhưng bạn đã không đọc nó.
Seymour

Câu trả lời:


33

Cách hợp lý nhất để chuyển đổi giờ là hai biến xoay qua lại khỏi bồn rửa. Hãy tưởng tượng vị trí của kim giờ của đồng hồ 24 giờ. Vị xtrí dao động qua lại ra khỏi bồn rửa với yvị trí. Đối với một đồng hồ 24 giờ bạn có thể thực hiện điều này với x=sin(2pi*hour/24), y=cos(2pi*hour/24).

Bạn cần cả hai biến hoặc chuyển động thích hợp qua thời gian bị mất. Điều này là do thực tế là đạo hàm của sin hoặc cos thay đổi theo thời gian khi (x,y)vị trí thay đổi trơn tru khi nó di chuyển xung quanh vòng tròn đơn vị.

Cuối cùng, hãy xem xét liệu có đáng để thêm tính năng thứ ba để theo dõi thời gian tuyến tính hay không, có thể được xây dựng theo giờ của tôi (hoặc phút hoặc giây) từ khi bắt đầu bản ghi đầu tiên hoặc dấu thời gian Unix hoặc một cái gì đó tương tự. Ba tính năng này sau đó cung cấp các proxy cho cả sự tiến triển theo chu kỳ và tuyến tính của thời gian, ví dụ: bạn có thể kéo theo hiện tượng tuần hoàn như chu kỳ giấc ngủ trong chuyển động của mọi người và cả sự tăng trưởng tuyến tính như dân số theo thời gian.

Hi vọng điêu nay co ich!

Thêm một số mã ví dụ có liên quan mà tôi đã tạo cho câu trả lời khác:

Ví dụ về nếu được hoàn thành:

# 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

nhập mô tả hình ảnh ở đây

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

Bây giờ hãy thử xem:

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

nhập mô tả hình ảnh ở đây

Bạn chỉ có thể thấy rằng có một số sau nửa đêm bao gồm các cụm màu xanh lá cây trước nửa đêm. Bây giờ, hãy giảm số cụm và chỉ ra rằng trước và sau nửa đêm có thể được kết nối trong một cụm chi tiết hơn:

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

nhập mô tả hình ảnh ở đây

Xem cách cụm màu xanh chứa thời gian từ trước và sau nửa đêm được nhóm lại với nhau trong cùng một cụm ...

QED!


Cách tuyệt vời để xử lý nó. Nó sẽ cho điểm 0 và 23 giờ tương tự nhưng nó cũng không làm cho thời gian sáng / chiều giống nhau sao? Trong thực tế được ngăn cách bởi cửa sổ 12 giờ.
Mangat Rai Modi

Thời gian 12 giờ (AM / PM) không hoạt động, chỉ cần chuyển đổi thành thời gian 24 giờ.
AN6U5

Tôi chỉ nhận thấy rằng bạn đang chia cho 24. Khi bạn đưa ra sự tương tự với đồng hồ, tôi nghĩ đó là đồng hồ 12 giờ tiêu chuẩn. Tuy nhiên, bạn đang dùng đồng hồ 24 giờ. Nó dường như là cách tốt nhất để tôi biến đổi. Cảm ơn bạn!
Mangat Rai Modi

Câu trả lời tuyệt vời Chính xác những gì tôi đang tìm kiếm Cảm ơn ..
Aditya

Câu trả lời được chấp nhận kết hợp sin () & cost () là tuyệt vời; đây là một bổ sung cho một lời giải thích rất chi tiết và tốt đẹp cho nó bởi Ian London.
FlorianH

3

Câu hỏi rất thú vị và tôi không nhớ đã đọc về câu trả lời thú vị. Vì điều đó tôi dám cho bạn một giải pháp khả thi ngay cả khi nó có vẻ đủ điên rồ.

Thông thường, một người tránh có cùng thông tin trong nhiều tính năng, vì nhiều thuật toán không thể xử lý được. Nhưng đây không phải là trường hợp rừng ngẫu nhiên. Tương phản hồi quy tuyến tính (và tất cả các mô hình dựa trên các ý tưởng tương tự), các khu rừng ngẫu nhiên kiểm tra tất cả các tính năng, bằng cách xem xét từng tính năng một. Bằng cách này, có thể mã hóa cùng một thông tin theo nhiều cách mà không ảnh hưởng đến hiệu suất học tập, không gian và thời gian chạy.

(h+offSet)

Nó lãng phí một số không gian và thời gian, nhưng tôi sẽ thử xem nó hoạt động như thế nào.


0

Lý tưởng nhất là bạn không cần bất kỳ sự chuyển đổi nào. Chênh lệch thời gian tương đối giữa hai điểm có thể được sử dụng làm hàm khoảng cách. Trường hợp phân loại có thể được dựa trên điều này.

trong java:

public class TimeDistanceMeasurer implements DistanceMeasure {

    @Override
    public double compute(double[] a, double[] b) throws DimensionMismatchException {
        String time1 = String.format("%02d", (int)a[0]) + String.format("%02d", (int)a[0]);
        String time2 = String.format("%02d", (int)b[0]) + String.format("%02d", (int)b[0]);

        SimpleDateFormat format = new SimpleDateFormat("HHmm");
        try {
            Date date1 = format.parse(time1);
            Date date2 = format.parse(time2);
            return Math.abs(date2.getTime() - date1.getTime());
        } catch (Exception e) {
            throw new IllegalStateException("Something went wrong.", e);
        }
    }
}

1
Không sao đâu nhưng câu hỏi cần thứ khác ..
Aditya
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.