> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-parallel-read-in-order-multi-part.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> توثيق دوال تعلّم الآلة

# دوال تعلّم الآلة

<h2 id="evalmlmethod">
  evalMLMethod
</h2>

لإجراء التنبؤ باستخدام نماذج الانحدار المُقدَّرة، تُستخدَم الدالة `evalMLMethod`. راجع الرابط ضمن `linearRegression`.

<h2 id="stochasticlinearregression">
  stochasticLinearRegression
</h2>

تُنفِّذ دالة التجميع [stochasticLinearRegression](/ar/reference/functions/aggregate-functions/stochasticLinearRegression) أسلوب الانحدار المتدرّج العشوائي باستخدام نموذج خطي ودالة خسارة MSE. وتستخدم `evalMLMethod` للتنبؤ بالبيانات الجديدة.

<h2 id="stochasticlogisticregression">
  stochasticLogisticRegression
</h2>

تُنفِّذ دالة التجميع [stochasticLogisticRegression](/ar/reference/functions/aggregate-functions/stochasticLogisticRegression) أسلوب الهبوط التدريجي العشوائي لمشكلة التصنيف الثنائي. وتستخدم `evalMLMethod` للتنبؤ بالبيانات الجديدة.

<h2 id="naivebayesclassifier">
  naiveBayesClassifier
</h2>

يُصنّف النص المُدخل باستخدام نموذج Naive Bayes مع n-grams وتنعيم لابلاس. يجب تهيئة النموذج في ClickHouse قبل استخدامه.

**البنية**

```sql theme={null}
naiveBayesClassifier(model_name, input_text);
```

**الوسائط**

* `model_name` — اسم النموذج المُعَدّ مسبقًا. [String](/ar/reference/data-types/string)
  يجب أن يكون النموذج معرّفًا في ملفات تكوين ClickHouse (انظر أدناه).
* `input_text` — النص المراد تصنيفه. [String](/ar/reference/data-types/string)
  تُعالَج المدخلات تمامًا كما أُدخِلت (مع الحفاظ على حالة الأحرف وعلامات الترقيم).

**القيمة المعادة**

* معرّف الفئة المتوقعة على هيئة عدد صحيح غير موقّع. [UInt32](/ar/reference/data-types/int-uint)
  تتوافق معرّفات الفئات مع التصنيفات المحددة أثناء إنشاء النموذج.

**مثال**

صنّف نصًا باستخدام نموذج لاكتشاف اللغة:

```sql theme={null}
SELECT naiveBayesClassifier('language', 'How are you?');
```

```response theme={null}
┌─naiveBayesClassifier('language', 'How are you?')─┐
│ 0                                                │
└──────────────────────────────────────────────────┘
```

*قد تمثل النتيجة `0` اللغة الإنجليزية، بينما قد تشير `1` إلى الفرنسية — إذ تعتمد دلالات الفئات على بيانات التدريب لديك.*

***

<h3 id="implementation-details">
  تفاصيل التنفيذ
</h3>

**الخوارزمية**
تستخدم خوارزمية التصنيف Naive Bayes مع [تنعيم لابلاس](https://en.wikipedia.org/wiki/Additive_smoothing) للتعامل مع تسلسلات n-gram غير المرصودة، وذلك بالاستناد إلى احتمالات n-gram كما هو موضح [هنا](https://web.stanford.edu/~jurafsky/slp3/4.pdf).

**الميزات الرئيسية**

* تدعم تسلسلات n-gram بأي طول
* ثلاثة أوضاع للتقسيم إلى رموز:
  * `byte`: يعمل على البايتات الخام. كل بايت يُعد رمزًا واحدًا.
  * `codepoint`: يعمل على القيم القياسية في Unicode المفككة من UTF‑8. كل نقطة ترميز تُعد رمزًا واحدًا.
  * `token`: يُقسِّم عند تتابعات المسافات البيضاء في Unicode (regex \s+). تكون الرموز سلاسل فرعية غير بيضاء؛ وتُعد علامات الترقيم جزءًا من الرمز إذا كانت ملاصقة له (على سبيل المثال، "you?" يُعد رمزًا واحدًا).

***

<h3 id="model-configuration">
  إعداد النموذج
</h3>

يمكنك العثور على شيفرة مصدرية نموذجية لإنشاء نموذج Naive Bayes لاكتشاف اللغة [هنا](https://github.com/nihalzp/ClickHouse-NaiveBayesClassifier-Models).

بالإضافة إلى ذلك، تتوفر نماذج نموذجية وملفات التكوين المرتبطة بها [هنا](https://github.com/nihalzp/ClickHouse-NaiveBayesClassifier-Models/tree/main/models).

فيما يلي مثال على إعداد نموذج Naive Bayes في ClickHouse:

```xml theme={null}
<clickhouse>
    <nb_models>
        <model>
            <name>sentiment</name>
            <path>/etc/clickhouse-server/config.d/sentiment.bin</path>
            <n>2</n>
            <mode>token</mode>
            <alpha>1.0</alpha>
            <priors>
                <prior>
                    <class>0</class>
                    <value>0.6</value>
                </prior>
                <prior>
                    <class>1</class>
                    <value>0.4</value>
                </prior>
            </priors>
        </model>
    </nb_models>
</clickhouse>
```

**معلمات الإعداد**

| المعلمة | الوصف | مثال | الافتراضي |
| - | - | - | - |
| **name** | معرّف فريد للنموذج | `language_detection` | *مطلوب* |
| **path** | المسار الكامل للملف التنفيذي الخاص بالنموذج | `/etc/clickhouse-server/config.d/language_detection.bin` | *مطلوب* |
| **mode** | طريقة تجزئة النص:<br />- `byte`: تسلسلات بايت<br />- `codepoint`: نقاط ترميز Unicode<br />- `token`: رموز الكلمات | `token` | *مطلوب* |
| **n** | حجم `n-gram` (في وضع `token`):<br />- `1`=كلمة واحدة<br />- `2`=أزواج كلمات<br />- `3`=ثلاثيات كلمات | `2` | *مطلوب* |
| **alpha** | معامل تنعيم لابلاس المستخدم أثناء التصنيف لمعالجة سلاسل `n-grams` التي لا تظهر في النموذج | `0.5` | `1.0` |
| **priors** | احتمالات الفئات (% من المستندات التي تنتمي إلى فئة) | 60% للفئة 0، 40% للفئة 1 | توزيع متساوٍ |

**دليل تدريب النموذج**

**تنسيق الملف**
بتنسيق مقروء بشريًا، بالنسبة إلى `n=1` ووضع `token`، قد يبدو النموذج كما يلي:

```text theme={null}
<class_id> <n-gram> <count>
0 excellent 15
1 refund 28
```

بالنسبة إلى `n=3` ونمط `codepoint`، فقد يبدو الأمر كما يلي:

```text theme={null}
<class_id> <n-gram> <count>
0 exc 15
1 ref 28
```

لا يستخدم ClickHouse التنسيق المقروء للبشر مباشرةً؛ إذ يجب تحويله إلى التنسيق الثنائي الموضّح أدناه.

**تفاصيل التنسيق الثنائي**
يُخزَّن كل `n-gram` كما يلي:

1. `class_id` بحجم 4 بايت (UInt، little-endian)
2. طول بايتات `n-gram` بحجم 4 بايت (UInt، little-endian)
3. بايتات `n-gram` الخام
4. `count` بحجم 4 بايت (UInt، little-endian)

**متطلبات المعالجة المسبقة**
قبل إنشاء النموذج من مجموعة المستندات، يجب إجراء معالجة مسبقة للمستندات لاستخراج `n-grams` وفقًا للقيمتين المحددتين `mode` و`n`. توضّح الخطوات التالية هذه المعالجة المسبقة:

1. **أضف علامات الحدود في بداية كل مستند ونهايته استنادًا إلى وضع تقطيع الرموز:**

   * **Byte**: `0x01` (البداية)، `0xFF` (النهاية)
   * **نقطة ترميز**: `U+10FFFE` (البداية)، `U+10FFFF` (النهاية)
   * **Token**: `<s>` (البداية)، `</s>` (النهاية)

   *ملاحظة:* تُضاف `(n - 1)` من الرموز في كلٍّ من بداية المستند ونهايته.

2. **Example على `n=3` في وضع `token`:**

   * **المستند:** `"ClickHouse is fast"`
   * **تتم معالجته على النحو التالي:** `<s> <s> ClickHouse is fast </s> </s>`
   * **مقاطع `trigram` المُولَّدة:**
     * `<s> <s> ClickHouse`
     * `<s> ClickHouse is`
     * `ClickHouse is fast`
     * `is fast </s>`
     * `fast </s> </s>`

لتبسيط إنشاء النموذج لوضعي `byte` و`نقطة ترميز`، قد يكون من المناسب أولًا تقسيم المستند إلى رموز (قائمة من قيم `byte` في وضع `byte`، وقائمة من قيم `نقطة ترميز` في وضع `نقطة ترميز`). بعد ذلك، أضِف `n - 1` من رموز البداية في أول المستند و`n - 1` من رموز النهاية في آخره. وأخيرًا، أنشئ n-grams واكتبها في الملف المُسلسَل.

***

## assignCentroid

أُضيف في: v26.8.0

تُعيد معرّف أقرب مركز (centroid) إلى متجه ما وفق مسافة L2. تُحدَّد المراكز إمّا كمصفوفة ثابتة من مصفوفات الأعداد العشرية، ويكون المعرّف فيها هو الموضع داخل تلك المصفوفة بدءًا من 0، أو باسم `Dictionary` يحتوي على السمتين `cid` و`vec`، ويكون المعرّف فيها هو `cid`.

<Note>
  هذه الدالة غير حتمية: فقد تُعيد نتائج مختلفة لنفس الوسائط.
</Note>

**بنية**

```sql theme={null}
assignCentroid(vec, centroids | dict_name)
```

**وسيطات الدالة**

* `vec` — المتجه المراد إسناده. يجب أن يتطابق بُعده مع بُعد المراكز (centroids). أما الأنواع ذات عرض (width) مختلف عن `Float32` فتُحوَّل إلى `Float32`، وهو النوع الذي يستخدمه kernel التقييم. [`Array(Float32)`](/ar/reference/data-types/array) أو [`Array(Float64)`](/ar/reference/data-types/array) أو [`Array(BFloat16)`](/ar/reference/data-types/array)
* `centroids` — المراكز التي تُجرى المقارنة معها، ويجب أن تكون ثابتة. تُمرَّر كمصفوفة من مصفوفات أعداد عشرية غير فارغة ومتساوية الحجم، ويكون المعرّف عندئذٍ هو الموضع ضمن تلك المصفوفة بدءًا من 0؛ أو كاسم لـ `Dictionary` يحتوي على سمة باسم `cid` من نوع عدد صحيح غير مُوقَّع يتسع له `UInt32`، وسمة باسم `vec` من النوع `Array(Float32)`، ويكون المعرّف عندئذٍ هو `cid`. يُقرأ القاموس مرة واحدة ويُخزَّن مؤقتًا إلى أن يُعاد تحميله. [`Array(Array(Float32))`](/ar/reference/data-types/array) أو [`Array(Array(Float64))`](/ar/reference/data-types/array) أو [`Array(Array(BFloat16))`](/ar/reference/data-types/array) أو [`String`](/ar/reference/data-types/string)

**القيمة المُعادة**

معرّف أقرب مركز. [`UInt32`](/ar/reference/data-types/int-uint)

**أمثلة**

**مراكز مضمّنة (Inline)**

```sql title=Query theme={null}
SELECT assignCentroid([1.0, 2.0]::Array(Float32), [[0.0, 0.0], [1.0, 2.0]]::Array(Array(Float32)))
```

```response title=Response theme={null}
1
```

## evalMLMethod

أُضيفت في: v20.1.0

تُطبِّق نموذج تعلّم آلي مُدرَّبًا على سمات الإدخال لتوليد تنبؤات.

**بنية**

```sql theme={null}
evalMLMethod(model, x1[, x2, ...])
```

**وسيطات الدالة**

* `model` — نموذج تعلّم آلي مُدرَّب. [`AggregateFunctionState`](/ar/reference/data-types/aggregatefunction)
* `x1, x2, ...` — قيم السمات المستخدمة للتنبؤ. [`Float*`](/ar/reference/data-types/float) أو [`(U)Int*`](/ar/reference/data-types/int-uint)

**القيمة المُعادة**

تُرجِع القيمة المتوقعة استنادًا إلى النموذج المُدرَّب. [`Float64`](/ar/reference/data-types/float)

**أمثلة**

**مثال على الاستخدام**

```sql title=Query theme={null}
CREATE TABLE trips (pickup_datetime DateTime('UTC'), trip_distance Float64, total_amount Float64) ENGINE = Memory;

-- A fare of 3, plus 2.5 for every unit of distance.
INSERT INTO trips
SELECT toDateTime('2020-01-01 00:00:00', 'UTC') + number * 60, number % 10 + 1, 2.5 * (number % 10 + 1) + 3
FROM numbers(1000);

-- One model per year of the data.
CREATE TABLE models ENGINE = Memory AS
SELECT
    toYear(pickup_datetime) AS year,
    stochasticLinearRegressionState(0.01, 0.0, 10, 'SGD')(total_amount, trip_distance) AS model
FROM trips
GROUP BY year;

SELECT
    trip_distance,
    round(evalMLMethod(model, trip_distance), 2) AS predicted,
    total_amount
FROM trips
LEFT JOIN models ON year = toYear(pickup_datetime)
ORDER BY pickup_datetime
LIMIT 5
```

```response title=Response theme={null}
┌─trip_distance─┬─predicted─┬─total_amount─┐
│             1 │      4.05 │          5.5 │
│             2 │      6.79 │            8 │
│             3 │      9.53 │         10.5 │
│             4 │     12.28 │           13 │
│             5 │     15.02 │         15.5 │
└───────────────┴───────────┴──────────────┘
```

## naiveBayesClassifier

أُضيف في: v25.11.0

يُصنّف النص المُدخل باستخدام قاموس [`NAIVE_BAYES`](/ar/reference/statements/create/dictionary/layouts/naive-bayes). ويُرجع قيمة الفئة المتوقعة نفسها التي تُرجعها `dictGet(dictionary_name, class_attribute, input_text)`، حيث إن class\_attribute هو اسم سمة تصنيف الفئة المُهيأة في [التخطيط](/ar/reference/statements/create/dictionary/layouts/naive-bayes#layout-parameters) الخاصة بالقاموس. وعلى عكس `dictGet`، يكون نوع النتيجة دائمًا `UInt32` بدلًا من النوع المُعلن لسمة الفئة، ويجب أن يكون `input_text` من النوع `String` (ولا يُطبَّق أي تحويل لنوع المفتاح).

<Note>
  هذه الدالة غير حتمية: قد تُرجع نتائج مختلفة للوسائط نفسها.
</Note>

**الصياغة**

```sql theme={null}
naiveBayesClassifier(dictionary_name, input_text)
```

**وسيطات الدالة**

* `dictionary_name` — اسم قاموس يستخدم التخطيط NAIVE\_BAYES. [`String`](/ar/reference/data-types/string)
* `input_text` — النص المراد تصنيفه. [`String`](/ar/reference/data-types/string)

**القيمة المعادة**

معرّف الفئة المتوقعة. [`UInt32`](/ar/reference/data-types/int-uint)

**أمثلة**

**تصنيف النص**

```sql title=Query theme={null}
-- A dictionary built from the token counts of two classes: 0 for a positive review, 1 for a negative one.
CREATE TABLE review_tokens (ngram String, class_id UInt32, count UInt64) ENGINE = Memory;
INSERT INTO review_tokens VALUES ('good', 0, 5), ('great', 0, 4), ('excellent', 0, 3), ('bad', 1, 5), ('awful', 1, 4), ('terrible', 1, 3);

CREATE DICTIONARY sentiment (ngram String, class_id UInt32 DEFAULT 0, count UInt64 DEFAULT 0)
PRIMARY KEY ngram
SOURCE(CLICKHOUSE(TABLE 'review_tokens'))
LAYOUT(NAIVE_BAYES(class_attribute 'class_id' n 1 mode 'token'))
LIFETIME(0);

SELECT naiveBayesClassifier('sentiment', 'a good and great film') AS class_id;
```

```response title=Response theme={null}
┌─class_id─┐
│        0 │
└──────────┘
```

## naiveBayesClassifierWithAllProbs

أُضيفت في: v26.7.0

تُصنِّف نص مُدخل باستخدام قاموس [`NAIVE_BAYES`](/ar/reference/statements/create/dictionary/layouts/naive-bayes) وتُرجِع جميع الفئات مع احتمالاتها، مرتبة من الأكثر احتمالًا إلى الأقل.

<Note>
  هذه الدالة غير حتمية: قد تُرجِع نتائج مختلفة للوسيطات نفسها.
</Note>

**بنية**

```sql theme={null}
naiveBayesClassifierWithAllProbs(dictionary_name, input_text)
```

**وسيطات الدالة**

* `dictionary_name` — اسم قاموس ذي تخطيط NAIVE\_BAYES. [`String`](/ar/reference/data-types/string)
* `input_text` — النص المراد تصنيفه. [`String`](/ar/reference/data-types/string)

**القيمة المُعادة**

مصفوفة من عناصر Tuple بالتنسيق (معرّف\_الفئة، الاحتمال)، مرتبة من الأعلى احتمالًا إلى الأقل. [`Array(Tuple(UInt32, Float64))`](/ar/reference/data-types/array)

**أمثلة**

**كل احتمالات الفئات**

```sql title=Query theme={null}
-- A dictionary built from the token counts of two classes: 0 for a positive review, 1 for a negative one.
CREATE TABLE review_tokens (ngram String, class_id UInt32, count UInt64) ENGINE = Memory;
INSERT INTO review_tokens VALUES ('good', 0, 5), ('great', 0, 4), ('excellent', 0, 3), ('bad', 1, 5), ('awful', 1, 4), ('terrible', 1, 3);

CREATE DICTIONARY sentiment (ngram String, class_id UInt32 DEFAULT 0, count UInt64 DEFAULT 0)
PRIMARY KEY ngram
SOURCE(CLICKHOUSE(TABLE 'review_tokens'))
LAYOUT(NAIVE_BAYES(class_attribute 'class_id' n 1 mode 'token'))
LIFETIME(0);

SELECT arrayMap(p -> (p.1, round(p.2, 4)), naiveBayesClassifierWithAllProbs('sentiment', 'a good and great film')) AS predictions;
```

```response title=Response theme={null}
┌─predictions─────────────┐
│ [(0,0.9677),(1,0.0323)] │
└─────────────────────────┘
```

## naiveBayesClassifierWithProb

أُضيف في: v26.7.0

يُصنّف النص المُدخل باستخدام قاموس [`NAIVE_BAYES`](/ar/reference/statements/create/dictionary/layouts/naive-bayes) ويُرجع الفئة المتوقعة مع احتمالها.

<Note>
  هذه الدالة غير حتمية: قد تُرجع نتائج مختلفة للوسيطات نفسها.
</Note>

**البنية**

```sql theme={null}
naiveBayesClassifierWithProb(dictionary_name, input_text)
```

**وسيطات الدالة**

* `dictionary_name` — اسم قاموس بتخطيط NAIVE\_BAYES. [`String`](/ar/reference/data-types/string)
* `input_text` — النص المراد تصنيفه. [`String`](/ar/reference/data-types/string)

**القيمة المُعادة**

Tuple يتكوّن من (class\_id, probability). [`Tuple(UInt32, Float64)`](/ar/reference/data-types/tuple)

**أمثلة**

**التصنيف مع الاحتمال**

```sql title=Query theme={null}
-- A dictionary built from the token counts of two classes: 0 for a positive review, 1 for a negative one.
CREATE TABLE review_tokens (ngram String, class_id UInt32, count UInt64) ENGINE = Memory;
INSERT INTO review_tokens VALUES ('good', 0, 5), ('great', 0, 4), ('excellent', 0, 3), ('bad', 1, 5), ('awful', 1, 4), ('terrible', 1, 3);

CREATE DICTIONARY sentiment (ngram String, class_id UInt32 DEFAULT 0, count UInt64 DEFAULT 0)
PRIMARY KEY ngram
SOURCE(CLICKHOUSE(TABLE 'review_tokens'))
LAYOUT(NAIVE_BAYES(class_attribute 'class_id' n 1 mode 'token'))
LIFETIME(0);

WITH naiveBayesClassifierWithProb('sentiment', 'a good and great film') AS p
SELECT (p.1, round(p.2, 4)) AS prediction;
```

```response title=Response theme={null}
┌─prediction─┐
│ (0,0.9677) │
└────────────┘
```
