מבוא למתמטיקה של אפאצ'י קומונס

1. סקירה כללית

לעתים קרובות אנו זקוקים לשימוש בכלים מתמטיים, ולעיתים java.lang.Math פשוט לא מספיק. למרבה המזל, אפאצ'י קומונס מטרתה למלא את הדלפות הספרייה הסטנדרטית, באמצעות מתמטיקה של אפאצ'י קומונס.

Apache Commons Math היא ספריית הקוד הפתוח הגדולה ביותר של פונקציות ושירותים מתמטיים עבור Java. בהתחשב בכך שמאמר זה הוא רק הקדמה, אנו רק נותנים סקירה כללית של הספרייה ונציג את מקרי השימוש המרתקים ביותר.

2. החל ממתמטיקה של אפאצ'י קומונס

2.1. השימושים במתמטיקה של Apache Commons

Apache Commons Math מורכב מפונקציות מתמטיות (גדר למשל), מבנים המייצגים מושגים מתמטיים (כמו מספרים מורכבים, פולינומים, וקטורים וכו ') ואלגוריתמים שנוכל ליישם על מבנים אלה (מציאת שורשים, אופטימיזציה, התאמת עקומות, חישוב צמתים של דמויות גיאומטריות וכו').

2.2. תצורת Maven

אם אתה משתמש ב- Maven, פשוט הוסף תלות זו:

 org.apache.commons commons-math3 3.6.1 

2.3. סקירת חבילה

Apache Commons Math מחולק למספר חבילות:

  • org.apache.commons.math3.stat - סטטיסטיקה ומבחנים סטטיסטיים
  • org.apache.commons.math3.distribution - התפלגויות הסתברות
  • org.apache.commons.math3.random - מספרים אקראיים, מחרוזות וייצור נתונים
  • org.apache.commons.math3.analysis - מציאת שורשים, אינטגרציה, אינטרפולציה, פולינומים וכו '.
  • org.apache.commons.math3.linear - מטריצות, פתרון מערכות ליניאריות
  • org.apache.commons.math3.geometry - גיאומטריה (חללים אוקלידיים וחלוקת חלל בינארי)
  • org.apache.commons.math3.transform - שיטות טרנספורמציה (פורייה מהירה)
  • org.apache.commons.math3.ode - שילוב משוואות דיפרנציאליות רגילות
  • org.apache.commons.math3.fitting - התאמת עקומות
  • org.apache.commons.math3.optim - מקסום פונקציה או מזעור
  • org.apache.commons.math3.genetics - אלגוריתמים גנטיים
  • org.apache.commons.math3.ml - למידת מכונה (אשכולות ורשתות עצביות)
  • org.apache.commons.math3.util - פונקציות מתמטיקה / סטטי נפוצות המרחיבות את java.lang.Math
  • org.apache.commons.math3.special - פונקציות מיוחדות (גמא, בטא)
  • org.apache.commons.math3.complex - מספרים מסובכים
  • org.apache.commons.math3.fraction - מספר רציונלי

3. סטטיסטיקה, הסתברויות ואקראיות

3.1. סטָטִיסטִיקָה

החבילה org.apache.commons.math3.stat מספק מספר כלים לחישובים סטטיסטיים. לדוגמא, כדי לחשב סטיית תקן, סטיית תקן ועוד רבים אחרים נוכל להשתמש תיאורי סטטיסטיקה:

כפול [] ערכים = כפול חדש [] {65, 51, 16, 11, 6519, 191, 0, 98, 19854, 1, 32}; DescriptiveStatistics descriptiveStatistics = חדש DescriptiveStatistics (); עבור (כפול v: ערכים) {descriptiveStatistics.addValue (v); } ממוצע כפול = descriptiveStatistics.getMean (); חציון כפול = descriptiveStatistics.getPercentile (50); StandardDeviation כפול = descriptiveStatistics.getStandardDeviation (); 

בחבילה זו נוכל למצוא כלים לחישוב המשתנות, המתאם או לביצוע בדיקות סטטיסטיות (באמצעות TestUtils).

3.2. הסתברויות והפצות

ב- Java הליבה, Math.random () יכול לשמש ליצירת ערכים אקראיים, אך ערכים אלה מופצים באופן אחיד בין 0 ל -1.

לפעמים, אנו רוצים לייצר ערך אקראי באמצעות התפלגות מורכבת יותר. לשם כך אנו יכולים להשתמש במסגרת המסופקת על ידי org.apache.commons.math3.distribution.

כך ניתן ליצור ערכים אקראיים על פי ההתפלגות הנורמלית בממוצע 10 וסטיית התקן 3:

NormalDistribution normalDistribution = חדש NormalDistribution (10, 3); כפול randomValue = normalDistribution.sample (); 

או שנוכל להשיג את ההסתברות P (X = x) של קבלת ערך להפצות דיסקרטיות, או ההסתברות המצטברת P (X <= x) להפצות רציפות.

4. ניתוח

ניתן למצוא פונקציות ואלגוריתמים הקשורים לניתוח org.apache.commons.math3.analysis.

4.1. מציאת שורשים

שורש הוא ערך שבו לפונקציה יש ערך 0. Commons-Math כולל הטמעה של כמה אלגוריתמי איתור שורשים.

כאן, אנו מנסים למצוא את השורש של v -> (v * v) - 2 :

פונקציית UnivariateFunction = v -> Math.pow (v, 2) - 2; UnivariateSolver solver = BracketingNthOrderBrentSolver חדש (1.0e-12, 1.0e-8, 5); כפול c = solver.solve (100, פונקציה, -10.0, 10.0, 0); 

ראשית, אנו מתחילים בהגדרת הפונקציה, ואז אנו מגדירים את הפותר, וקובעים את הדיוק הרצוי. לבסוף, אנו קוראים לִפְתוֹר() ממשק API.

פעולת מציאת השורשים תבוצע תוך שימוש במספר איטרציות, ולכן מדובר במציאת פשרה בין זמן הביצוע לדיוק.

4.2. חישוב אינטגרלים

השילוב עובד כמעט כמו מציאת שורשים:

פונקציית UnivariateFunction = v -> v; UnivariateIntegrator integrator = SimpsonIntegrator חדש (1.0e-12, 1.0e-8, 1, 32); כפול i = integrator.integrate (100, function, 0, 10); 

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

5. אלגברה לינארית

אם יש לנו מערכת משוואות ליניאריות מתחת לצורה AX = B כאשר A היא מטריצה ​​של מספרים ממשיים, ו- B וקטור של מספרים ממשיים - Commons Math מספק מבנים לייצג את המטריצה ​​וגם את הווקטור, וגם מספק פותרים כדי למצוא הערך של X:

RealMatrix a = Array2DRowRealMatrix חדש (כפול חדש [] [] {{2, 3, -2}, {-1, 7, 6}, {4, -3, -5}}, שקר); RealVector b = ArrayRealVector חדש (לא כפול [] {1, -2, 1}, שקר); DecompositionSolver solver = LUDecomposition חדש (a) .getSolver (); פתרון RealVector = solver.solve (b); 

המקרה די פשוט: אנו מגדירים מטריצה א ממערך של מערך כפילים, וקטור ב ממערך של וקטור.

לאחר מכן, אנו יוצרים הלחנה המספק פותר למשוואות בטופס AX = B. כשמו כן הוא, LUD הרכב מסתמך על הפירוק של LU, וכך עובד רק עם מטריצות מרובעות.

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

6. גיאומטריה

החבילה org.apache.commons.math3.geometry מספק כמה שיעורים לייצוג אובייקטים גיאומטריים וכמה כלים לתמרן אותם. חשוב לציין כי חבילה זו מחולקת לחבילות משנה שונות, לגבי סוג הגיאומטריה בה אנו רוצים להשתמש:

חשוב לציין כי חבילה זו מחולקת לחבילות משנה שונות, לגבי סוג הגיאומטריה בה אנו רוצים להשתמש:

  • org.apache.commons.math3.geometry.euclidean.oned - גיאומטריה אוקלידית 1D
  • org.apache.commons.math3.geometry.euclidean.twod - גיאומטריה אוקלידית דו ממדית
  • org.apache.commons.math3.geometry.euclidean.threed - גאומטריה אוקלידית תלת ממדית
  • org.apache.commons.math3.geometry.spherical.oned - גיאומטריה כדורית 1D
  • org.apache.commons.math3.geometry.spherical.twod - גיאומטריה כדורית דו ממדית

השיעורים השימושיים ביותר הם כנראה Vector2D, Vector3D, קַו, ו מִגזָר. הם משמשים לייצוג וקטורים דו-ממדיים (או נקודות), וקטורים תלת-ממדיים, קווים וקטעים בהתאמה.

כאשר משתמשים בשיעורים שהוזכרו לעיל, ניתן לבצע חישוב כלשהו. לדוגמה, הקוד הבא מבצע את חישוב הצומת של שתי שורות דו-ממדיות:

קו l1 = קו חדש (Vector2D חדש (0, 0), Vector2D חדש (1, 1), 0); קו l2 = קו חדש (Vector2D חדש (0, 1), Vector2D חדש (1, 1.5), 0); צומת Vector2D = l1. צומת (l2); 

ניתן גם להשתמש במבנים אלה כדי להגיע למרחק של נקודה לקו, או לנקודה הקרובה ביותר של קו לקו אחר (בתלת ממד).

7. אופטימיזציה, אלגוריתמים גנטיים ולמידת מכונה

Commons-Math מספק גם כמה כלים ואלגוריתמים למשימות מורכבות יותר הקשורות לאופטימיזציה ולמידת מכונה.

7.1. אופטימיזציה

אופטימיזציה כוללת בדרך כלל מזעור או מקסום של פונקציות עלות. אלגוריתמים לאופטימיזציה ניתן למצוא ב org.apache.commons.math3.optim ו org.apache.commons.math3.optimization. הוא כולל אלגוריתמי אופטימיזציה ליניאריים ולא ליניאריים.

אנו יכולים לציין כי ישנם שיעורים כפולים ב- אופטימי ו אופטימיזציה חבילות: אופטימיזציה החבילה לרוב הוצאה משימוש ותוסרה במתמטיקה 4 של Commons.

7.2. אלגוריתמים גנטיים

אלגוריתמים גנטיים הם סוג של מטה-היוריסטיקה: הם פיתרון למציאת פיתרון מקובל לבעיה כאשר אלגוריתמים דטרמיניסטיים איטיים מדי. סקירה של אלגוריתמים גנטיים ניתן למצוא כאן.

החבילה org.apache.commons.math3.genetics מספק מסגרת לביצוע חישובים באמצעות אלגוריתמים גנטיים. הוא מכיל מבנה שניתן להשתמש בו כדי לייצג אוכלוסייה וכרומוזום, ואלגוריתמים סטנדרטיים לביצוע פעולות מוטציה, הצלבה ובחירה.

השיעורים הבאים נותנים נקודת התחלה טובה:

  • אלגוריתם גנטי - מסגרת האלגוריתם הגנטי
  • אוכלוסייה - הממשק המייצג אוכלוסייה
  • כרומוזום - הממשק המייצג כרומוזום

7.3. למידת מכונה

למידה ממוחשבת ב- Commons-Math מתחלקת לשני חלקים: אשכולות ורשתות עצביות.

החלק האשכול מורכב מהנחת תווית על וקטורים בהתאם לדמיונם ביחס למדד מרחק. אלגוריתמי האשכול המסופקים מבוססים על אלגוריתם K-means.

החלק ברשת העצבית נותן שיעורים לייצוג רשתות (רֶשֶׁת) ונוירונים (עֲצָבוֹן). ניתן לציין כי הפונקציות הניתנות מוגבלות בהשוואה למסגרות הרשת העצבית הנפוצות ביותר, אך הן עדיין יכולות להיות שימושיות ליישומים קטנים עם דרישות נמוכות.

8. כלי עזר

8.1. FastMath

FastMath הוא מעמד סטטי הממוקם ב org.apache.commons.math3.util ועובד בדיוק כמו java.lang.Math.

מטרתה לספק לפחות את אותן פונקציות בהן אנו יכולים למצוא java.lang.Math, אך עם יישומים מהירים יותר. לכן, כאשר תוכנית נשענת במידה רבה על חישובים מתמטיים, מומלץ להחליף שיחות Math.sin () (למשל) להתקשרות אליו FastMath.sin () כדי לשפר את ביצועי היישום. מצד שני אנא שימו לב לכך FastMath פחות מדויק מ java.lang.Math.

8.2. פונקציות נפוצות ומיוחדות

Commons-Math מספק פונקציות מתמטיות סטנדרטיות שאינן מיושמות ב- java.lang.Math (כמו פקטוריאל). ניתן למצוא את רוב הפונקציות הללו בחבילות org.apache.commons.math3.special ו org.apache.commons.math3.util.

למשל, אם אנחנו רוצים לחשב את הפקטוריון של 10 אנחנו יכולים פשוט לעשות:

פקטוריאל ארוך = CombinatorialUtils.factorial (10); 

פונקציות הקשורות לחשבון (gcd, lcmוכו ') ניתן למצוא ב אריתמטיקה, ופונקציות הקשורות לשילוב ניתן למצוא ב CombinatorialUtils. כמה פונקציות מיוחדות אחרות, כמו גדר, ניתן לגשת אליו ב org.apache.commons.math3.special.

8.3. שבר ומספרים מורכבים

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

לאחר מכן נוכל לחשב את סכום שני השברים ולהציג את התוצאה כייצוג מחרוזת של שבר (כלומר, בצורה "a / b"):

שבר lhs = שבר חדש (1, 3); שבר rhs = שבר חדש (2, 5); סכום שבר = lhs.add (rhs); מחרוזת str = פורמט FractionFormat () חדש () (סכום); 

לחלופין, אנו יכולים לחשב במהירות את הכוח של מספרים מורכבים:

מורכב ראשון = מתחם חדש (1.0, 3.0); שני מורכב = מתחם חדש (2.0, 5.0); כוח מורכב = first.pow (השני); 

9. מסקנה

במדריך זה הצגנו כמה דברים מעניינים שתוכלו לעשות באמצעות Apache Commons Math.

למרבה הצער, מאמר זה אינו יכול לכסות את כל תחום הניתוח או האלגברה הליניארית, ולכן הוא מספק רק דוגמאות למצבים הנפוצים ביותר.

עם זאת, לקבלת מידע נוסף, אנו יכולים לקרוא את התיעוד הכתוב היטב, המספק פרטים רבים לכל היבטי הספרייה.

וכמו תמיד, ניתן למצוא את דגימות הקוד כאן ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found