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ị thông tin thực tế

Để sử dụng các thành phần nhúng Động lực học dân số, thông tin 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 chung (như ô S2) hoặc khu vực hành chính địa phương (chẳng hạn như hạt hoặc quậ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 thành phần 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ô 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 thông tin thực tế 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 tuyến tính, để đưa ra dự đoán.
  • Sử dụng các mục nhúng để dự đoán: Sử dụng các mục nhúng của Động lực học dân số làm tính năng đầu vào, cùng với dữ liệu bối cảnh khác, để cải thiện độ chính xác của thông tin dự đoán.

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

Nếu thông tin thực tế của bạn sử dụng đ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. Quá trình này kết hợp nhiều vectơ ô S2 thành một bản trình bày duy nhất cho đa giác mục tiêu. Việc chọn phương pháp trọng số phù hợp sẽ đảm bảo rằng thành phần nhúng tổng hợp phản ánh chính xác mục tiêu lập mô hình hạ nguồn của bạn.

Sử dụng phương pháp tổng hợp theo trọng số 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 hoá 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 theo trọng số diện tích cho dữ liệu nhân khẩu học có thể làm sai lệch các tính năng học máy. Đ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 của Earth Engine, để tính toán mật độ chính xác của từng phân đoạn ô S2 giao nhau.

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

2. 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 nhân tạo hoặc lập kế hoạch cơ sở hạ tầng, trong đó 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ế phù hợp hơn so với mật độ dân số. Điều này đảm bảo rằng mỗi kilô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 pháp 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.

Thao tác 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 hệ 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 thập lục phân S2 cấp 12.

Chuyển đổi toạ độ điểm thành mã thông báo thập lục phân 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ề biến động 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 đã ký, 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 để chuyển đổi số nguyên thành mã thông báo thập lục phân chuẩn và loại bỏ các số 0 ở cuối theo thông số kỹ thuật của 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;

Cách chuyển đổi bảng điểm hiện có có các cột latitude và longitude thành 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 cách trình bày văn bản thành GEOGRAPHY bằng cách sử dụng ST_GEOGFROM và dùng S2_COVERINGCELLIDS để trích xuất tất 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;

Lấy hình học ô S2 từ mã thông báo thập lục phân 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 thư viện phía máy khách trong Python như s2sphere để giải mã mã thông báo ô S2 gồm 7 ký tự thành toạ độ ranh giới và shapely để tạo đ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 tên dự án, tập dữ liệu và bảng mục tiêu thực tế của bạn.

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

Truy vấn này truy xuất vectơ nhúng và siêu dữ liệu quản trị cho các ô S2 trong tập dữ liệu đã cấp phé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ự

Cụm từ tìm kiếm này xác định các 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 sử dụng hàm ML.DISTANCE để tính toán độ tương đồng 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 có chứa các mã thông báo ô S2 (chuỗi thập lục phân) trùng khớ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 học máy, 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)