Posts filter


🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧


הספרייה הנוכחית של alpha-vantage פשוט לא מספיק טובה...


כתבתי ספרייה עבור הAPI של alpha-vantage בתור הכנה לפרויקט שאני מתכנן שיאפשר לי לתת תחזית עתידית (הדולר ירד וגם הכלכלה ההודית תצמח) + רמת סיכון, ולבנות מזה תיק השקעות.


🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧


הוספתי גם תמיכה בload balancer עם אפשרות לבחור balance policy


דוגמא לקובץ קונפיגורציה


יש פרויקטים שאני מפתח כתחביב שבשלב כל שהוא כבר אין יותר מידי מה להוסיף (תמיד יש אבל לא משהו מעניין)

לכן התחלתי פרויקט חדש של reverse proxy סטייל nginx והסיבה היא שיש מלא פיצרים שאפשר להוסיף ואולי בעתיד אפילו ליצור parser לשפת קונפיגורציה שתהיה מותאמת לפרוייקט.

בימים האחרונים ישבתי והוספתי כמה פיצרים חדשים והחלטתי לפתוח את הפרויקט (public repo)

https://github.com/hvuhsg/gatego

הפרוייקט כבר תומך במלא פיצרים שימושיים 🤩


🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧


import numpy as np


def partition_vector(vector, N):
"""
Partition a vector into a hypercube of side length N.

Args:
vector (np.array): The input vector.
N (float): The side length of each hypercube.

Returns:
tuple: A tuple of integers representing the coordinates of the hypercube.
"""
return tuple(np.floor(vector / N).astype(int))


def hypercube_info(vector, N):
"""
Get information about the hypercube a vector falls into.

Args:
vector (np.array): The input vector.
N (float): The side length of each hypercube.

Returns:
dict: A dictionary containing information about the hypercube.
"""
cube_coords = partition_vector(vector, N)
return {
"coordinates": cube_coords,
"lower_bound": np.array(cube_coords) * N,
"upper_bound": (np.array(cube_coords) + 1) * N,
"center": (np.array(cube_coords) + 0.5) * N
}



# Example usage
if __name__ == "__main__":
vector = np.array([3.7, -4.5, 5.6, -4.7])
N = 3.0
result = hypercube_info(vector, N)
print(f"Vector: {vector}")
print(f"Hypercube side length: {N}")
print(f"Hypercube coordinates: {result['coordinates']}")
print(f"Lower bound: {result['lower_bound']}")
print(f"Upper bound: {result['upper_bound']}")
print(f"Center: {result['center']}")


לפני כמה ימים עלה לי הרעיון לכתוב ספרייה של fingerprinting שתזהה את אותו מכשיר ללא cookies גם במצב privacy
הדרך שזה לרוב נעשה היא ע"י איסוף מלא מידע ייחודי למחשב כמו מערכת הפעלה, דפדפן, כמה זה pi בספריית math וכו...

הבעיה היא ששינוי קטן יגרום fingerprint שונה, אז התחלתי לחשוב האם יש אלגוריתם שנותן ID זהה לדברים דומים עם אפשרות לקנפג כמה שינוי נצרך בשביל ID אחר.

עשיתי מחקר אבל לא מצאתי אלגוריתם שהתאים לבעיה, ישנם אלגוריתמים שנותנים hash קרוב לinput קרוב אבל זה אומר שאני צריך לעשות חיפוש קירבה בDB ולא ממש מתחשק לי.

היום בעודי קודח מחום (אני חושב שיש לי קטע עם חילופי עונות) עלה לי פתרון לבעיה, אנחנו נייצג את הפרטים של המכשיר כvector ואז נחלק את הhyperspace לhypercubes עם גודל צלע שאפשר להגדיר, אנחנו נחשב באיזה hypercube הvector נמצא ונחזיר את הפרטים של הhypercube כID של הvector.

מה שאומר שאם נשנה רק קצת את הvector הוא עדיין יפול באותה קוביה וייתן את אותו ID

כמובן שאפשר לעשות hash על הפרטים של הקוביה בשביל לעבוד עם מידע קומפקטי.

אשמח לשמוע מה דעתכם והאם פיספסתי אלגוריתם שעושה את זה כבר.


🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧


Forward from: Programmer Jokes


🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧


https://github.com/hvuhsg/mfactor
כתבתי package בGO שעושה matrix factorization ע"י שימוש באלגוריתם גנטי, מוזמנים לעבור על הקוד (הוא יחסית ממש קצר).


🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧


אין כמו לכתוב קוד של אלגוריתם גנטי 😁


🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧


מערכת המלצות (recommendation system)
אתמול ישבתי עם חבר ודיברנו על מערכת המלצות ועל אלגוריתם מעניין שנקרא matrix factorization
אז היום אני הייתי רוצה להסביר על שני סוגי אלגוריתמים שיש במערכות של המלצות, ועל רעיון מעניין שעלה לי ואשמח לשמוע את דעתכם.

סינון מבוסס תוכן:
סינון מבוסס תוכן הוא הפשוט יותר מבין שני הסוגים שאני אדבר עליהם, סינון מבוסס תוכן בוחן את מה שאהבת בעבר וממליץ דברים דומים, אם ניקח לדוגמא היסטורית קניות של נעלי נייק עם פסים, נוכל להמליץ על עוד נעליים דומות.
הדרך שבה האלגוריתמים האלו עובדים היא לרוב ע"י לקיחת כל הפריטים והפיכה שלהם לווקטורים במרחב רב מימדי ככה שפריטים דומים יהיו קרובים, ואז המערכת פשוט מוצאת ווקטור ממוצע של הפריטים שהמשתמש אהב וממליצה על פריטים אחרים שקרובים (מכיוון שמשתמש יכול לקנות גם אופניים וגם נעליים אז לרוב עושים ממוצע על תת-קבוצה של פריטים שהוא אהב)

אז בעצם יש שני שלבים לאלגוריתם:
1. לקחת את כל הפריטים ולעשות להם embedding (להפוך אותם לווקטורים)
2. חיפוש על המרחב הווקטורי בשביל למצוא פריטים דומים.

בשלב של הembedding יש אפשרות לקבוע את הפיצרים ידנית או לתת למודל למצוא אותם לבד, במידה ועושים את זה ידנית זה לרוב ע"י מחיר, קטגוריה, מיקום בעולם, צבעים, תיאור המוצר, שם המוצר, גודל, וכו...
אם נותנים למודל להחליט על הפיצרים לרוב נמצאים קשרים שאנחנו כבני אדם לא היינו מוצאים כמו נעליים לאוזניות כי אנשים שקונים נעליים יוצאים לרוץ עם אוזניות ובעצם הקשר הוא פעילות.

סינון שיתופי:
סינון שיתופי הוא לדעתי קצת יותר מורכב כי הקטע שלו הוא להמליץ לי על דברים שאנשים שדומים לי אהבו.
אם לדוגמא אני קונה הרבה ציוד אלקטרוני ויש עוד אדם שקונה ציוד דומה והוא קנה רכיב שאני לא קניתי, המערכת תמליץ לי על הרכיב כי אולי אנחנו בונים את אותו פרויקט...
השאלה שיכולה לעלות היא האם אפשר פשוט לעשות embedding על המשתמשים במקום על הפריטים ואז למצוא משתמשים קרובים ולהמליץ להם על הקניות של הקרובים אליהם.
בגדול התשובה היא כן אבל העניין שמפריד את זה מסינון מבוסס תוכן הוא שאין אפשרות לעשות embedding כמו שעשינו על הפריטים פשוט כי אנשים דומים (אותו מין מיקום גיל וכו...) לא תמיד דומים בהרגלי צריכה.

אז בעצם אנחנו צריכים דרך לדעת איזה אנשים דומים אחד לשני ואז הembedding פתור ואיתו כל האלגוריתם.

אני מכיר שני דרכים לעשות את הembedding לדמיון בין שני צרכנים:
1. פקטוריזציה של מטריצה
2. הליכה ראנדומאלית על גרף ואז node to vec

פקטוריזציה של מטריצה:
אם ניקח מטריצה ובציר אחד נשים את כל הצרכנים ובציר השני את כל המוצרים נוכל לשים בכל תא 1 או 0 (או כל משקל אחר) לפי כמה אותו צרכן אוהב את המוצר.

עכשיו אנחנו ניקח את המטריצה ונמצא שני ווקטורים שהמכפלה שלהם היא כמה שיותר קרובה למטרציה המקורית.
ובשביל להמליץ לצרכן על מוצר חדש פשוט נחשב את המכפלה של הווקטורים עבור הצרכן ונמצא איזה פריטים הוא כנראה יאהב.

הליכה ראנדומאלית על גרף:
נבנה גרף שמכיל את צרכנים והפריטים וקשרים בניהם עם משקל של כמה הצרכן אוהב את המוצר.
בשביל להפוך את הגרף למרחב ווקטורי נוכל להשתמש בnode to vec שיעשה הליכה ראנדומאלית על הגרף ככה שבכל צומת הוא יקפוץ לnode ראנדומאלי אבל ישתמש בראנדום עם משקולות ככה שחיבור שחזק פי שניים יהיה לו סיכוי כפול לקפוץ דרכו.
האלגוריתם יתחיל מנקודה מסויימת ולפי מספר הפעמים שהוא נופל על נקודות אחרות במהלך ההליכה הוא ידע כמה הן צריכות להיות קרובות במרחב הווקטורי.

אחרי שיש לנו מרחב ווקטורי זה פשוט עניין של חיפוש פריטים קרובים למשתמש.

מקווה שהחכמתם. יויו. 🤩

עכשיו לרעיון:
מה אתם חושבים על בוט שמאזין על ערוצים בטלגרם עושה embedding לפוסטים שלהם ואז אתם יכולים לדפדף בבוט כמו טינדר לפוסטים (אהבתי \ לא אהבתי) וככה הבוט ילמד מה אתם אוהבים וימליץ עם פוסטים שכנראה תאהבו, זה בעצם פיד כמו בפייסבוק או טוויטר אבל בטלגרם ככה תוכלו למצוא ערוצים שאתם לא מכירים ויכולים לעניין אתכם.


🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧


גוגל אישרו את האפליקציה

20 last posts shown.