הכנת נתוני אמת בסיסיים
כדי להשתמש בהטמעות של נתונים דינמיים של אוכלוסייה, נתוני האמת הבסיסית צריכים להיות מצטברים לגבול גיאוגרפי נתמך. מכיוון שסוגי הגבולות האדמיניסטרטיביים משתנים ברחבי העולם, אתם יכולים ליישר את הנתונים באמצעות מערכות רשת מתמטיות אוניברסליות (כמו תאי S2) או אזורים אדמיניסטרטיביים מקומיים (כמו מחוזות או נפות, בהתאם למערך הנתונים הספציפי של המדינה).
אפשרות 1: שילוב הטמעות במודל קיים
- הכנת נתוני אמת קרקע (ground truth) קיימים שמבוססים על מודל: משתמשים בהטמעות כמשתני עזר גיאוספציאליים כדי לשפר מודל קיים.
- אימון מודל לתיקון שגיאות: שיפור מודל קיים על ידי שילוב ההטבעות במודל שמקבל את פלט המודל המקורי, את הערך הצפוי או את האמת הקרקעית (ground truth) ואת ההטבעות כדי ללמוד מודל חדש לתיקון שגיאות.
אפשרות 2: התאמה לתרחישי שימוש ספציפיים
- בוחרים מודל חיזוי: אפשר להשתמש בכל מודל, כמו GBDT, MLP או ליניארי, כדי ליצור תחזיות.
- שימוש בהטמעות לצורך חיזוי: אפשר להשתמש בהטמעות של דינמיקת אוכלוסייה כמאפייני קלט, לצד נתונים הקשריים אחרים, כדי לשפר את דיוק החיזוי.
צבירה של גבולות בהתאמה אישית
אם נתוני האמת שלכם מבוססים על מצולעים מותאמים אישית, כמו מיקודים, קווי זמן נסיעה או אזורי מסחר, תוכלו לבצע צבירה של גבולות. במהלך התהליך הזה, כמה וקטורים של תאי S2 משולבים לייצוג יחיד של מצולע היעד. בחירה נכונה של מתודולוגיית השקלול מבטיחה שה-embedding המצטבר ישקף בצורה מדויקת את יעדי המידול שלכם.
1. ממוצע משוקלל לפי אוכלוסייה (מומלץ כברירת מחדל ל-PDI)
להשתמש בצבירה משוקללת לפי גודל האוכלוסייה לתרחישי שימוש שמתמקדים באנשים, כמו ביצועים של חנויות קמעונאיות או מודלים של התנהגות צרכנים.
שימוש בצבירה מרחבית משוקללת לפי אזור לנתונים דמוגרפיים עלול לעוות את התכונות של למידת המכונה. המצב הזה קורה כשבאזורים לא מאוכלסים, כמו פארקים, אזורי תעשייה או מקווי מים, יש עיוות בפרופיל של התושבים בפועל.
כדי לפתור את הבעיה, אפשר לבצע ממוצע משוקלל לפי גודל האוכלוסייה ב-BigQuery. בגישה הזו נעשה שימוש במערכי נתונים דמוגרפיים ברזולוציה גבוהה, כמו WorldPop בקטלוג הנתונים של Earth Engine, כדי לחשב את הצפיפות המדויקת של כל מקטע של תא S2 שחוצה את הגבול.
כדי לראות דוגמה מלאה להטמעה של תהליך עבודה עם משוקלל אוכלוסייה, מריצים את ה-notebook האינטראקטיבי.
2. ממוצע משוקלל לפי שטח
לתרחישי שימוש סביבתיים או פיזיים, מומלץ להשתמש במקום זאת בצבירה משוקללת לפי אזור. הנתונים האלה שימושיים לניתוח שימוש בקרקע, למחקרים על סביבה בנויה או לתכנון תשתית שבו צריך להעריך אזורים בלי קשר לפיזור האוכלוסייה.
בתרחישים האלה, שטח קרקע פיזי רלוונטי יותר מצפיפות אוכלוסייה. כך מוודאים שכל קילומטר רבוע בתוך גבול הפוליגון תורם באופן שווה לווקטור המצטבר.
בשיטה הזו, וקטור ההטמעה של כל תא S2 מורכב משקלול של שטח פני השטח הגיאוגרפי שהוא מכסה בתוך הפוליגון של היעד.
פעולות גיאוספציאליות והמרת תאים ב-S2
התובנות בקשר לדינמיקה של האוכלוסייה מתבססות על טוקנים של תאים ברמה 12 של S2 (מאוחסנים בעמודה geo_id כמחרוזות הקסדצימליות באורך 7 תווים) כיחידה המרחבית העיקרית. אתם יכולים להשתמש בפונקציות הגאוגרפיה המובנות ב-BigQuery כדי להמיר קואורדינטות של נקודות או גבולות מרחביים מותאמים אישית לטוקנים תואמים של תאי S2. כדי להמיר אסימוני תאים של S2 לצורות גיאומטריות של מצולעים לצורך ויזואליזציה, אפשר להשתמש בספריות בצד הלקוח. מידע נוסף זמין במאמר קבלת גיאומטריית תא S2 מאסימון הקסדצימלי של S2 ברמה 12.
המרת קואורדינטות של נקודות לאסימוני הקסדצימליים ברמה 12 של S2
כדי להתאים בין קואורדינטות של נקודות בקווי רוחב ואורך לבין העמודה geo_id ב'תובנות לגבי דינמיקה של אוכלוסייה', משתמשים בפונקציה S2_CELLIDFROMPOINT של BigQuery בשילוב עם ST_GEOGPOINT.
מזהי תאי S2 מאוחסנים ב-BigQuery כערכים חתומים של INT64, ולכן מזהי תאים באזורים מסוימים מוערכים כמספרים שלמים שליליים. בדוגמאות שלמטה, אנחנו מגדירים פונקציית עזר בשם TO_S2_HEX שממירה את המספר השלם לטוקן הקסדצימלי רגיל ומסירה אפסים מיותרים בהתאם למפרט של S2 Geometry.
השאילתה הבאה ממירה קואורדינטות של נקודה בטיימס סקוור בניו יורק (קו רוחב 40.75796, קו אורך -73.98554) לאסימון הקסדצימלי התואם ברמה 12 של S2:
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;
כדי להמיר טבלת נקודות קיימת עם עמודות latitude ו-longitude לטוקנים של S2 שאפשר לבצע עליהם הצטרפות:
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`;
יצירת טוקנים של תאי S2 ברמה 12 שמכסים פוליגון
אם הנתונים שלכם כוללים גבולות מותאמים אישית של אזורים (כמו אזורי מסחר, אזורי משלוח או מיקודים בפורמט WKT או GeoJSON), צריך להמיר את הייצוג הטקסטואלי ל-GEOGRAPHY באמצעות ST_GEOGFROM ולהשתמש ב-S2_COVERINGCELLIDS כדי לחלץ את כל התאים ברמה 12 של S2 שחופפים לאזורים האלה.
השאילתה הבאה מחלצת את כל אסימוני ה-hex ברמה 12 של S2 שמכסים פוליגון מותאם אישית במידטאון מנהטן:
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;
קבלת גיאומטריה של תא S2 מטוקן הקסדצימלי ברמה 12 של S2
פונקציות BigQuery GIS הן ממירים חד-כיווניים (Geometry → S2 Cell ID) ולא כוללות פונקציה להמרת טוקן של תא S2 למצולע GEOGRAPHY.
כדי לקבל את גיאומטריית הפוליגון של טוקן תא S2 לצורך ויזואליזציה או ניתוח מרחבי, אפשר להשתמש בספרייה בצד הלקוח ב-Python, כמו s2sphere, כדי לפענח טוקן תא S2 בן 7 תווים לקואורדינטות הגבול שלו, ו-shapely, כדי ליצור פוליגון עבור כלי מיפוי כמו 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)
דוגמאות לשאילתות
מחליפים את your-project.your_dataset.embeddings_table בשם הפרויקט, מערך הנתונים וטבלת היעד בפועל.
SQL: אחזור הטמעות
השאילתה הזו מאחזרת את וקטור ההטמעה ואת המטא-נתונים האדמיניסטרטיביים של תאי S2 במערך הנתונים שהוקצה לכם.
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: חיפוש מיקומים דומים
השאילתה הזו מזהה מיקומים עם התנהגות דומה בלי להסתמך על נתונים חיצוניים.
היא משתמשת בפונקציה ML.DISTANCE כדי לחשב את הדמיון לקוסינוס, ומחזירה את ההתאמות הכי טובות לתא S2 של יעד. הגישה הזו תומכת בתרחישי תכנון הרחבה, כמו קביעה של מיקום לפתיחת חנות חדשה על סמך הפרופיל של מיקום קיים מוצלח.
כדי להציג תאים של S2 במפה, צריך להמיר את מזהה התא של S2 או לאחד אותו עם גיאומטריית המצולע המתאימה, כי מערך הנתונים הזה משתמש בטוקנים של תאי S2 במקום בנקודות של קווי רוחב ואורך.
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: איחוד נתוני לקוחות
בדוגמה הזו מוסבר איך להעשיר נתונים פנימיים (למשל, טבלת ביצועים של חנות) באמצעות הטמעות התנהגותיות. צריך לוודא שהנתונים הפנימיים כוללים טוקנים תואמים של תאי S2 (מחרוזות הקסדצימליות).
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: טעינת נתונים ללמידת מכונה
ההטמעות מאוחסנות כמערכים ב-BigQuery. כדי להשתמש בהם בספריות של ML, צריך להמיר את העמודה למטריצה של 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)
הפעלה ב-Google Colab
הצגת המקור ב-GitHub