Sử dụng các thành phần nhúng Thông tin chi tiết về biến động dân số

Chuẩn bị dữ liệu thực tế

Để sử dụng các thành phần nhúng Động lực học dân số, dữ liệu thực tế của bạn phải được tổng hợp thành một ranh giới địa lý được hỗ trợ. Vì các loại ranh giới hành chính khác nhau trên toàn cầu, nên bạn có thể điều chỉnh dữ liệu của mình bằng cách sử dụng hệ thống lưới toán học phổ biến (chẳng hạn như ô S2) hoặc các khu vực hành chính địa phương (chẳng hạn như quận hoặc huyện, tuỳ thuộc vào tập dữ liệu cụ thể của quốc gia).

Cách 1: Kết hợp các mục nhúng vào một mô hình hiện có

  • Chuẩn bị dữ liệu cơ sở thực tế dựa trên mô hình hiện có: Sử dụng các vectơ nhúng làm biến số phụ không gian địa lý để cải thiện mô hình hiện có.
  • Huấn luyện mô hình sửa lỗi: Cải thiện một mô hình hiện có bằng cách tích hợp các mục nhúng vào một mô hình lấy đầu ra của mô hình ban đầu, giá trị dự kiến hoặc đầu ra thực sự và các mục nhúng để tìm hiểu một mô hình sửa lỗi mới.

Cách 2: Điều chỉnh cho các trường hợp sử dụng cụ thể

  • Chọn một mô hình dự đoán: Bạn có thể sử dụng bất kỳ mô hình nào, chẳng hạn như GBDT, MLP hoặc mô hình tuyến tính để đưa ra dự đoán.
  • Sử dụng các vectơ nhúng để dự đoán: Sử dụng các vectơ nhúng Động lực học dân số làm các đặc điểm đầu vào, cùng với các dữ liệu theo bối cảnh khác, để cải thiện độ chính xác của dự đoán.

Tổng hợp ranh giới tuỳ chỉnh

Nếu dữ liệu thực tế của bạn sử dụng các đa giác tuỳ chỉnh, chẳng hạn như mã bưu chính, đường đẳng thời gian lái xe hoặc khu vực thương mại, bạn có thể thực hiện một quy trình tổng hợp ranh giới. Quy trình này kết hợp nhiều vectơ ô S2 thành một biểu diễn duy nhất cho đa giác mục tiêu. Việc chọn phương pháp tính trọng số phù hợp sẽ đảm bảo vectơ nhúng tổng hợp phản ánh chính xác các mục tiêu mô hình hoá hạ nguồn của bạn.

Sử dụng phương pháp tổng hợp có trọng số theo dân số cho các trường hợp sử dụng lấy con người làm trung tâm, chẳng hạn như hiệu suất của cửa hàng bán lẻ hoặc mô hình hành vi của người tiêu dùng.

Việc sử dụng phương pháp tổng hợp không gian có trọng số theo diện tích cho dữ liệu nhân khẩu học có thể làm sai lệch các đặc điểm học máy của bạn. Điều này xảy ra khi những khu vực không có người sinh sống, chẳng hạn như công viên, khu công nghiệp hoặc vùng nước, làm sai lệch hồ sơ của cư dân thực tế.

Để giải quyết vấn đề này, bạn có thể tính giá trị trung bình có trọng số theo dân số trong BigQuery. Phương pháp này sử dụng các tập dữ liệu nhân khẩu học có độ phân giải cao, chẳng hạn như WorldPop trong Danh mục dữ liệu Earth Engine, để tính toán mật độ chính xác của từng đoạn ô S2 giao nhau.

Để xem ví dụ đầy đủ về quy trình có trọng số theo dân số, hãy chạy sổ tay tương tác.

2. Giá trị trung bình theo trọng số diện tích

Đối với các trường hợp sử dụng liên quan đến môi trường hoặc thể chất, hãy sử dụng phương pháp tổng hợp theo trọng số diện tích. Thông tin này hữu ích cho việc phân tích việc sử dụng đất, nghiên cứu môi trường xây dựng hoặc lập kế hoạch cơ sở hạ tầng, nơi bạn phải đánh giá các khu vực bất kể sự phân bố dân số.

Trong những trường hợp này, diện tích đất thực tế sẽ phù hợp hơn so với mật độ dân số. Điều này đảm bảo rằng mọi ki-lô-mét vuông trong ranh giới đa giác đều đóng góp như nhau vào vectơ tổng hợp.

Theo phương thức này, vectơ nhúng của mỗi ô S2 thành phần được tính trọng số theo diện tích bề mặt địa lý mà ô đó bao phủ trong đa giác mục tiêu.

Các hoạt động không gian địa lý và chuyển đổi ô S2

Thông tin chi tiết về biến động dân số sử dụng mã thông báo S2 cấp 12 (được lưu trữ trong cột geo_id dưới dạng chuỗi thập lục phân gồm 7 ký tự) làm đơn vị không gian chính. Bạn có thể sử dụng các hàm địa lý tích hợp sẵn trong BigQuery để chuyển đổi toạ độ điểm hoặc ranh giới không gian tuỳ chỉnh thành mã thông báo ô S2 phù hợp. Để chuyển đổi mã thông báo ô S2 thành hình học đa giác để trực quan hoá, bạn có thể sử dụng các thư viện phía máy khách. Để biết thêm thông tin, hãy xem bài viết Lấy hình học ô S2 từ mã thông báo hex S2 cấp 12.

Chuyển đổi toạ độ điểm thành mã thông báo hex S2 cấp 12

Để so khớp toạ độ điểm vĩ độ/kinh độ với cột geo_id trong Thông tin chi tiết về động lực học dân số, hãy sử dụng hàm S2_CELLIDFROMPOINT của BigQuery kết hợp với ST_GEOGPOINT.

BigQuery lưu trữ mã nhận dạng ô S2 dưới dạng các giá trị INT64 có dấu, khiến mã nhận dạng ô ở một số khu vực nhất định được đánh giá là số nguyên âm. Trong các ví dụ bên dưới, chúng ta xác định một hàm trợ giúp có tên là TO_S2_HEX, hàm này chuyển đổi số nguyên thành mã thông báo thập lục phân tiêu chuẩn và loại bỏ các số 0 ở cuối theo quy cách S2 Geometry.

Truy vấn sau đây chuyển đổi toạ độ điểm cho Quảng trường Thời đại, Thành phố New York (Vĩ độ 40.75796, Kinh độ -73.98554) thành mã thông báo hex S2 Cấp 12 tương ứng:

CREATE TEMP FUNCTION TO_S2_HEX(s2_int INT64) RETURNS STRING AS (
  RTRIM(FORMAT('%x%015x', (s2_int >> 60) & 0xF, s2_int & 0x0FFFFFFFFFFFFFFF), '0')
);

SELECT
  'Times Square, NYC' AS location_name,
  TO_S2_HEX(S2_CELLIDFROMPOINT(ST_GEOGPOINT(-73.98554, 40.75796), level => 12)) AS geo_id;

Để chuyển đổi một bảng điểm hiện có có các cột latitudelongitude thành các mã thông báo S2 có thể kết hợp:

CREATE TEMP FUNCTION TO_S2_HEX(s2_int INT64) RETURNS STRING AS (
  RTRIM(FORMAT('%x%015x', (s2_int >> 60) & 0xF, s2_int & 0x0FFFFFFFFFFFFFFF), '0')
);

SELECT
  store_id,
  TO_S2_HEX(S2_CELLIDFROMPOINT(ST_GEOGPOINT(longitude, latitude), level => 12)) AS geo_id
FROM
  `your-project.internal_data.store_locations`;

Tạo mã thông báo ô S2 cấp 12 bao phủ cho một đa giác

Nếu dữ liệu của bạn sử dụng ranh giới khu vực tuỳ chỉnh (chẳng hạn như khu vực thương mại, khu vực giao hàng hoặc mã bưu chính ở định dạng WKT hoặc GeoJSON), hãy chuyển đổi biểu diễn văn bản thành GEOGRAPHY bằng cách sử dụng ST_GEOGFROM và sử dụng S2_COVERINGCELLIDS để trích xuất tất cả các ô S2 cấp 12 giao nhau.

Truy vấn sau đây trích xuất tất cả mã thông báo hex S2 cấp 12 bao phủ một đa giác tuỳ chỉnh ở Midtown Manhattan:

CREATE TEMP FUNCTION TO_S2_HEX(s2_int INT64) RETURNS STRING AS (
  RTRIM(FORMAT('%x%015x', (s2_int >> 60) & 0xF, s2_int & 0x0FFFFFFFFFFFFFFF), '0')
);

WITH CustomBoundary AS (
  SELECT ST_GEOGFROM('POLYGON((-73.99 40.75, -73.97 40.75, -73.97 40.76, -73.99 40.76, -73.99 40.75))') AS geom
)
SELECT
  TO_S2_HEX(s2_id) AS geo_id
FROM
  CustomBoundary,
  UNNEST(S2_COVERINGCELLIDS(geom, min_level => 12, max_level => 12)) AS s2_id;

Nhận hình học ô S2 từ mã thông báo hex S2 cấp 12

Các hàm GIS của BigQuery là trình chuyển đổi một chiều (Hình học → Mã nhận dạng ô S2) và không có hàm nào để chuyển đổi mã thông báo ô S2 thành đa giác GEOGRAPHY. Để lấy hình học đa giác của mã thông báo ô S2 cho mục đích trực quan hoá hoặc phân tích không gian, hãy sử dụng một thư viện phía máy khách bằng Python, chẳng hạn như s2sphere để giải mã mã thông báo ô S2 gồm 7 ký tự thành toạ độ ranh giới của mã thông báo đó và shapely để tạo một đa giác cho các công cụ lập bản đồ như Folium:

import s2sphere
from shapely.geometry import Polygon

def s2_token_to_polygon(s2_token: str) -> Polygon:
    """Converts a 7-character S2 cell token into a Shapely Polygon."""
    cell_id = s2sphere.CellId.from_token(s2_token)
    cell = s2sphere.Cell(cell_id)

    # Extract the 4 corner vertices of the S2 cell
    vertices = []
    for i in range(4):
        vertex = cell.get_vertex(i)
        lat_lng = s2sphere.LatLng.from_point(vertex)
        vertices.append((lat_lng.lng().degrees, lat_lng.lat().degrees))

    # Close the polygon loop
    vertices.append(vertices[0])
    return Polygon(vertices)

# Example: Get boundary for S2 token '549056f'
cell_polygon = s2_token_to_polygon('549056f')
print(cell_polygon.wkt)

Ví dụ về truy vấn

Thay thế your-project.your_dataset.embeddings_table bằng dự án, tập dữ liệu và tên bảng đích thực tế của bạn.

SQL: Tìm nạp các mục nhúng

Truy vấn này truy xuất vectơ nhúng và siêu dữ liệu hành chính cho các ô S2 trong tập dữ liệu được cung cấp của bạn.

SELECT
  geo_id,
  administrative_area_level_1_name AS state,
  administrative_area_level_2_name AS county,
  features -- The 330-dim vector
FROM
  `your-project.your_dataset.embeddings_table`
LIMIT 10;

SQL: Tìm các vị trí tương tự

Truy vấn này xác định những vị trí có hành vi tương tự mà không cần dữ liệu bên ngoài.

Hàm này dùng hàm ML.DISTANCE để tính độ tương đồng về cosin, trả về các kết quả trùng khớp hàng đầu cho một ô S2 mục tiêu. Phương pháp này hỗ trợ các trường hợp lập kế hoạch mở rộng, chẳng hạn như xác định nơi mở cửa hàng mới dựa trên hồ sơ của một vị trí hiện tại đang hoạt động hiệu quả.

Để trực quan hoá các ô S2 trên bản đồ, bạn phải chuyển đổi hoặc kết hợp mã nhận dạng ô S2 với hình học đa giác tương ứng, vì tập dữ liệu này sử dụng mã thông báo ô S2 thay vì các điểm kinh độ và vĩ độ.

WITH TargetLocation AS (
  SELECT features AS target_vector
  FROM `your-project.your_dataset.embeddings_table`
  -- Replace with your target S2 hex token (e.g., '80ead45')
  WHERE geo_id = 'YOUR_TARGET_S2_TOKEN'
)

SELECT
  t.geo_id,
  t.administrative_area_level_1_name AS state,
  t.administrative_area_level_2_name AS county,
  -- Calculate Similarity (1.0 is identical, 0.0 is dissimilar)
  (1 - ML.DISTANCE(t.features, p.target_vector, 'COSINE')) AS similarity_score
FROM
  `your-project.your_dataset.embeddings_table` t,
  TargetLocation p
WHERE
  t.geo_id != 'YOUR_TARGET_S2_TOKEN' -- Exclude the target itself
ORDER BY
  similarity_score DESC
LIMIT 20;

SQL: Kết hợp dữ liệu khách hàng

Ví dụ này minh hoạ cách làm phong phú dữ liệu nội bộ của riêng bạn (ví dụ: bảng hiệu suất của cửa hàng) bằng các mục nhúng hành vi. Đảm bảo dữ liệu nội bộ của bạn bao gồm các mã thông báo ô S2 (chuỗi thập lục phân) phù hợp.

SELECT
  store.store_id,
  store.s2_token,
  store.total_revenue,
  embeddings.features AS pdfm_vector
FROM
  `your-project.internal_data.store_performance` AS store
JOIN
  `your-project.your_dataset.embeddings_table` AS embeddings
ON
  -- Join based on the S2 hex token string
  store.s2_token = embeddings.geo_id

Python: Tải dữ liệu để học máy

Các vectơ nhúng được lưu trữ dưới dạng Mảng BigQuery. Để sử dụng các cột này trong thư viện ML, bạn phải chuyển đổi cột thành ma trận NumPy.

from google.cloud import bigquery
import numpy as np
import pandas as pd

client = bigquery.Client()

query = """
    SELECT
        geo_id,
        features -- Returns as a list of floats
    FROM
        `your-project.your_dataset.embeddings_table`
    LIMIT 1000
"""

# 1. Load data into DataFrame
df = client.query(query).to_dataframe()

# 2. Convert the 'features' column (Series of Lists) into a Matrix (2D Array)
X_matrix = np.stack(df['features'].values)

print(f"Data Loaded. Matrix Shape: {X_matrix.shape}")
# Output: Data Loaded. Matrix Shape: (1000, 330)