بایگانی برچسب برای: Hcl

الگوریتم Canny

لبه یاب کنی توسط جان اف کنی در سال 1986 ایجاد شد و هنوز یک لبه یاب استاندارد و با دقت و کیفیت بالا میباشد.الگوریتم لبه یابی کنی یکی از بهترین لبه یابها تا به امروز است. در ادامه روش کار این الگوریتم و هم چنین کد الگوریتم Canny در #C را بررسی خواهیم کرد. این الگوریتم لبه یابی از سه بخش اصلی زیر تشکیل شده:

  • تضعیف نویز
  • پیدا کردن نقاطی که بتوان آنها را به عنوان لبه در نظر گرفت
  • حذب نقاطی که احتمال لبه بودن آنها کم است

 

معیارهایی که در لبه یاب کنی مطرح است:
1 -پایین آوردن نرخ خطا- یعنی تا حد امکان هیچ لبه ای در تصویر نباید گم شود و هم چنین هیچ چیزی که لبه نیست نباید به جای لبه فرض شود. لبه هان پیدا شده تا حد ممکن به لبه ها اصلی
نزدیک باشند.

2 -لبه در مکان واقعی خود باشد- یعنی تا حد ممکن لبه ها کمترین فاصله را با مکان واقعی خود داشته باشند.
3 -بران هر لبه فقط یک پاسخ داشته باشیم.

4 -لبه ها کمترین ضخامت را داشته باشند- (در صورت امکان یک پیکسل).
لبه یاب کنی بخاطر توانایی در تولید لبه های نازک تا حد یک ییکسل برای لبه های پیوسته معروف شده است. این لبه یاب شامل چهار مرحله و چهار ورودی زیر است:
یک تصویر ورودی
یک پارامتر به نام سیگما جهت مقدار نرم کنندگی تصویر
یک حد آستانه بالا (Th)
یک حد آستانه پایین (Tl)

 

مراحل الگوریتم Canny:

1- در ابتدا باید تصویر رنگی را به جهت لبه یابی بهتر به یک تصویر سطح خاکسترن تبدیب کرد.

2- نویز را از تصویر دریافتی حذف کرد. بدلیل اینکه فیلتر گاوسین از یک ماسک ساده برای حذف نویز استفاده می کند لبه یاب کنی در مرحله اول برای حذف نویز آن را بکار میگیرد.

3- در یک تصویر سطح خاکستر جایی را که بیشترین تغییرات را داشته باشند به عنوان لبه در نظر گرفته می شوند و این مکانها با گرفتن گرادیان تصویر با استفاده عملگر سوبل بدست می آیند. سپس لبه های مات یافت شده به لبه های تیزتر تبدیل می شوند.

4- برخی از لبه های کشف شده واقعا لبه نیستند و در واقع نویز هستند که باید آنها توسط حد آستانه هیسترزیس فیلتر شوند.هیسترزیس از دو حد آستانه بالاتر (Th) و حد آستانه پایین تر (Tl) استفاده کرده و کنی پیشنهاد می کند که نسبت استانه بالا به پایین سه به یک باشد.

 این روش بیشتر به کشف لبه های ضعیف به درستی می پردازد و کمتر فریب نویز را می خورد و از بقیه روش ها بهتر است.

 

الگوریتم Canny    عملکرد الگوریتم Canny

 


 

کد الگوریتم Canny در #C:

الگوریتم در 5 مرحله جداگانه اجرا می شود:

1. صاف کردن: تار شدن تصویر برای حذف نویز. پیکربندی توسط فیلتر گاوسی با اندازه مشخص هسته (N) و پارامتر پوشش گاوسی سیگما. پوشاننده فیلتر گاوسی توسط تابع زیر تولید می شود:

private void GenerateGaussianKernel(int N, float S ,out int Weight)
{

float Sigma = S ;
float pi;
pi = (float)Math.PI;
int i, j;
int SizeofKernel=N;

float [,] Kernel = new float [N,N];
GaussianKernel = new int [N,N];
float[,] OP = new float[N, N];
float D1,D2;

D1= 1/(2*pi*Sigma*Sigma);
D2= 2*Sigma*Sigma;

float min=1000;

for (i = -SizeofKernel / 2; i <= SizeofKernel / 2; i++)
{
for (j = -SizeofKernel / 2; j <= SizeofKernel / 2; j++)
{
Kernel[SizeofKernel / 2 + i, SizeofKernel / 2 + j] = ((1 / D1) * (float)Math.Exp(-(i * i + j * j) / D2));
if (Kernel[SizeofKernel / 2 + i, SizeofKernel / 2 + j] < min)
min = Kernel[SizeofKernel / 2 + i, SizeofKernel / 2 + j];

}
}
int mult = (int)(1 / min);
int sum = 0;
if ((min > 0) && (min < 1))
{

for (i = -SizeofKernel / 2; i <= SizeofKernel / 2; i++)
{
for (j = -SizeofKernel / 2; j <= SizeofKernel / 2; j++)
{
Kernel[SizeofKernel / 2 + i, SizeofKernel / 2 + j] = (float)Math.Round(Kernel[SizeofKernel / 2 + i, SizeofKernel / 2 + j] * mult, 0);
GaussianKernel[SizeofKernel / 2 + i, SizeofKernel / 2 + j] = (int)Kernel[SizeofKernel / 2 + i, SizeofKernel / 2 + j];
sum = sum + GaussianKernel[SizeofKernel / 2 + i, SizeofKernel / 2 + j];
}

}

}
else
{
sum = 0;
for (i = -SizeofKernel / 2; i <= SizeofKernel / 2; i++)
{
for (j = -SizeofKernel / 2; j <= SizeofKernel / 2; j++)
{
Kernel[SizeofKernel / 2 + i, SizeofKernel / 2 + j] = (float)Math.Round(Kernel[SizeofKernel / 2 + i, SizeofKernel / 2 + j] , 0);
GaussianKernel[SizeofKernel / 2 + i, SizeofKernel / 2 + j] = (int)Kernel[SizeofKernel / 2 + i, SizeofKernel / 2 + j];
sum = sum + GaussianKernel[SizeofKernel / 2 + i, SizeofKernel / 2 + j];
}

}

}
//Normalizing kernel Weight
Weight= sum;

return;
}

 

زیر روال ذیل نویز را توسط فیلتر گوسی حذف می کند.

 

private int[,] GaussianFilter(int[,] Data)
        {
            GenerateGaussianKernel(KernelSize, Sigma,out KernelWeight);

            int[,] Output = new int[Width, Height];
            int i, j,k,l;
            int Limit = KernelSize /2;

            float Sum=0;

 Output = Data; // Removes Unwanted Data Omission due to kernel bias while convolution

            for (i = Limit; i <= ((Width - 1) - Limit); i++)
            {
                for (j = Limit; j <= ((Height - 1) - Limit); j++)
                {
                    Sum = 0;
                    for (k = -Limit; k <= Limit; k++)
                    {

                       for (l = -Limit; l <= Limit; l++)
                        {
                            Sum = Sum + ((float)Data[i + k, j + l] * GaussianKernel [Limit + k, Limit + l]);                        

                        }
                    }
                    Output[i, j] = (int)(Math.Round(Sum/ (float)KernelWeight));
                }

            }

            return Output;
        }

 

2. پیدا کردن شیب ها: لبه ها باید مشخص شوند، جایی که شیب های تصویر بزرگ می شوند.

ماسک های سوبل  X و Y برای تولید گرادیان های تصویر X و Y استفاده می شود؛ تابع بعدی تمایز را با استفاده از فیلتر ماسک sobel اعمال می کند.

 

private float[,] Differentiate(int[,] Data, int[,] Filter)
        {
            int i, j,k,l, Fh, Fw;

            Fw = Filter.GetLength(0);
            Fh = Filter.GetLength(1);
            float sum = 0;
            float[,] Output = new float[Width, Height];

            for (i = Fw / 2; i <= (Width - Fw / 2) - 1; i++)
            {
                for (j = Fh / 2; j <= (Height  - Fh / 2) - 1; j++)
                {
                  sum=0;
                   for(k=-Fw/2; k<=Fw/2; k++)
                   {
                       for(l=-Fh/2; l<=Fh/2; l++)
                       {
                          sum=sum + Data[i+k,j+l]*Filter[Fw/2+k,Fh/2+l];


                       }
                   }
                    Output[i,j]=sum;

                }

            }
            return Output;

        }

 

3. توقیف غیر حداکثر: فقط حداکثرهای محلی باید به عنوان لبه ها مشخص شود.

ما جهت گرادیان را پیدا می کنیم و با استفاده از این جهت، ما توقیف غیر حداکثر را انجام می دهیم (“پردازش تصویر دیجیتال- آموزش توسط گنزالس-پیرسون ” را بخوانید)

 

// Perform Non maximum suppression:
           // NonMax = Gradient;

            for (i = 0; i <= (Width - 1); i++)
            {
                for (j = 0; j <= (Height - 1); j++)
                {
                    NonMax[i, j] = Gradient[i, j];
                }
            }
     
            int Limit = KernelSize / 2;
            int r, c;
            float Tangent;

                for (i = Limit; i <= (Width - Limit) - 1; i++)
            {
                for (j = Limit; j <= (Height - Limit) - 1; j++)
                {

                    if (DerivativeX[i, j] == 0)
                        Tangent = 90F;
                    else
                        Tangent = (float)(Math.Atan(DerivativeY[i, j] / DerivativeX[i, j]) * 180 / Math.PI); //rad to degree



                    //Horizontal Edge
                    if (((-22.5 < Tangent) && (Tangent <= 22.5)) || ((157.5 < Tangent) && (Tangent <= -157.5)))
                    {
                        if ((Gradient[i, j] < Gradient[i, j + 1]) || (Gradient[i, j] < Gradient[i, j - 1]))
                            NonMax[i, j] = 0;
                    }

                    //Vertical Edge
                    if (((-112.5 < Tangent) && (Tangent <= -67.5)) || ((67.5 < Tangent) && (Tangent <= 112.5)))
                    {
                        if ((Gradient[i, j] < Gradient[i + 1, j]) || (Gradient[i, j] < Gradient[i - 1, j]))
                            NonMax[i, j] = 0;
                    }

                    //+45 Degree Edge
                    if (((-67.5 < Tangent) && (Tangent <= -22.5)) || ((112.5 < Tangent) && (Tangent <= 157.5)))
                    {
                        if ((Gradient[i, j] < Gradient[i + 1, j - 1]) || (Gradient[i, j] < Gradient[i - 1, j + 1]))
                            NonMax[i, j] = 0;
                    }

                    //-45 Degree Edge
                    if (((-157.5 < Tangent) && (Tangent <= -112.5)) || ((67.5 < Tangent) && (Tangent <= 22.5)))
                    {
                        if ((Gradient[i, j] < Gradient[i + 1, j + 1]) || (Gradient[i, j] < Gradient[i - 1, j - 1]))
                            NonMax[i, j] = 0;
                    }

                }

            }

 

4. آستانه دوگانه: لبه های بالقوه توسط آستانه تعیین می شود.

5. ردیابی لبه توسط هیسترسیس: لبه های نهایی توسط توقیف تمام لبه هایی که به یک لبه بسیار قطعی (قوی) متصل نیستند، مشخص می شوند.

 

private void HysterisisThresholding(int[,] Edges)
        {

            int i, j;
            int Limit= KernelSize/2;


            for (i = Limit; i <= (Width - 1) - Limit; i++)
                for (j = Limit; j <= (Height - 1) - Limit; j++)
                {
                    if (Edges[i, j] == 1)
                    {
                        EdgeMap[i, j] = 1;

                    }

                }

            for (i = Limit; i <= (Width - 1) - Limit; i++)
            {
                for (j = Limit; j <= (Height  - 1) - Limit; j++)
                {
                    if (Edges[i, j] == 1)
                    {
                        EdgeMap[i, j] = 1;
                        Travers(i, j);
                        VisitedMap[i, j] = 1;
                    }
                }
            }




            return;
        }

//Recursive Procedure 
private void Travers(int X, int Y)
        {

            
            if (VisitedMap[X, Y] == 1)
            {
                return;
            }

            //1
            if (EdgePoints[X + 1, Y] == 2)
            {
                EdgeMap[X + 1, Y] = 1;
                VisitedMap[X + 1, Y] = 1;
                Travers(X + 1, Y);
                return;
            }
            //2
            if (EdgePoints[X + 1, Y - 1] == 2)
            {
                EdgeMap[X + 1, Y - 1] = 1;
                VisitedMap[X + 1, Y - 1] = 1;
                Travers(X + 1, Y - 1);
                return;
            }

           //3

            if (EdgePoints[X, Y - 1] == 2)
            {
                EdgeMap[X , Y - 1] = 1;
                VisitedMap[X , Y - 1] = 1;
                Travers(X , Y - 1);
                return;
            }

           //4

            if (EdgePoints[X - 1, Y - 1] == 2)
            {
                EdgeMap[X - 1, Y - 1] = 1;
                VisitedMap[X - 1, Y - 1] = 1;
                Travers(X - 1, Y - 1);
                return;
            }
            //5
            if (EdgePoints[X - 1, Y] == 2)
            {
                EdgeMap[X - 1, Y ] = 1;
                VisitedMap[X - 1, Y ] = 1;
                Travers(X - 1, Y );
                return;
            }
            //6
            if (EdgePoints[X - 1, Y + 1] == 2)
            {
                EdgeMap[X - 1, Y + 1] = 1;
                VisitedMap[X - 1, Y + 1] = 1;
                Travers(X - 1, Y + 1);
                return;
            }
            //7
            if (EdgePoints[X, Y + 1] == 2)
            {
                EdgeMap[X , Y + 1] = 1;
                VisitedMap[X, Y + 1] = 1;
                Travers(X , Y + 1);
                return;
            }
            //8

            if (EdgePoints[X + 1, Y + 1] == 2)
            {
                EdgeMap[X + 1, Y + 1] = 1;
                VisitedMap[X + 1, Y + 1] = 1;
                Travers(X + 1, Y + 1);
                return;
            }


            //VisitedMap[X, Y] = 1;
            return;

        } 
          
        //Canny Class Ends

    }

 

این کار با یک تابع بازگشتی انجام می شود که آستانه دوگانه را با دو آستانه بالا (Threshold (TH و (Low Threshold (TL و تجزیه و تحلیل 8-اتصال انجام می دهد.

 

دانلود کد فوق از طریق لینک زیر:

Canny Edge Detection C#

رمز فایل : behsanandish.com


الگوریتم Canny

لبه یاب کنی توسط جان اف کنی در سال 1986 ایجاد شد و هنوز یک لبه یاب استاندارد و با دقت و کیفیت بالا میباشد.الگوریتم لبه یابی کنی یکی از بهترین لبه یابها تا به امروز است. در ادامه روش کار این الگوریتم و هم چنین کد الگوریتم Canny در Visual Basic را بررسی خواهیم کرد. این الگوریتم لبه یابی از سه بخش اصلی زیر تشکیل شده:

  • تضعیف نویز
  • پیدا کردن نقاطی که بتوان آنها را به عنوان لبه در نظر گرفت
  • حذب نقاطی که احتمال لبه بودن آنها کم است

 

معیارهایی که در لبه یا کنی مطرح است:
1 -پایین آوردن نرخ خطا- یعنی تا حد امکان هیچ لبه ای در تصویر نباید گم شود و هم چنین هیچ چیزی که لبه نیست نباید به جای لبه فرض شود. لبه هان پیدا شده تا حد ممکن به لبه ها اصلی
نزدیک باشند.

2 -لبه در مکان واقعی خود باشد- یعنی تا حد ممکن لبه ها کمترین فاصله را با مکان واقعی خود داشته باشند.
3 -بران هر لبه فقط یک پاسخ داشته باشیم.

4 -لبه ها کمترین ضخامت را داشته باشند- (در صورت امکان یک پیکسل).
لبه یاب کنی بخاطر توانایی در تولید لبه های نازک تا حد یک ییکسل برای لبه های پیوسته معروف شده است. این لبه یاب شامل چهار مرحله و چهار ورودی زیر است:
یک تصویر ورودی
یک پارامتر به نام سیگما جهت مقدار نرم کنندگی تصویر
یک حد آستانه بالا (Th)
یک حد آستانه پایین (Tl)

 

مراحل الگوریتم Canny:

1- در ابتدا باید تصویر رنگی را به جهت لبه یابی بهتر به یک تصویر سطح خاکسترن تبدیب کرد.

2- نویز را از تصویر دریافتی حذف کرد. بدلیل اینکه فیلتر گاوسین از یک ماسک ساده برای حذف نویز استفاده می کند لبه یاب کنی در مرحله اول برای حذف نویز آن را بکار میگیرد.

3- در یک تصویر سطح خاکستر جایی را که بیشترین تغییرات را داشته باشند به عنوان لبه در نظر گرفته می شوند و این مکانها با گرفتن گرادیان تصویر با استفاده عملگر سوبل بدست می آیند. سپس لبه های مات یافت شده به لبه های تیزتر تبدیل می شوند.

4- برخی از لبه های کشف شده واقعا لبه نیستند و در واقع نویز هستند که باید آنها توسط حد آستانه هیسترزیس فیلتر شوند.هیسترزیس از دو حد آستانه بالاتر (Th) و حد آستانه پایین تر (Tl) استفاده کرده و کنی پیشنهاد می کند که نسبت استانه بالا به پایین سه به یک باشد.

 این روش بیشتر به کشف لبه های ضعیف به درستی می پردازد و کمتر فریب نویز را می خورد و از بقیه روش ها بهتر است.

 

الگوریتم Canny    عملکرد الگوریتم Canny

 

الگوریتم Canny در Visual Basic:

کد زیر یک کد تکمیل نشده است.تکمیل آن به عنوان تمرین به خواننده واگذار می شود.

 

Imports System.Drawing
Imports System.Drawing.Imaging

Public Class clsEdges

    Public Sub EdgeDetectDifference(ByVal b As Bitmap, ByVal threshold As Byte)
        ' first we create a clone o the image we want to find the edges on
        Dim b2 As Bitmap = b.Clone
        ' we create bitmapdata of the images at the same time locking them
        Dim bmData1 As BitmapData = b.LockBits(New Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb)
        Dim bmData2 As BitmapData = b2.LockBits(New Rectangle(0, 0, b2.Width, b2.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb)
        ' the stride describes the distance between image bytes
        Dim stride As Integer = bmData2.Stride
        ' scan0 is some sort of OS handle or something to identify the actual data in the memory
        Dim scan01 As IntPtr = bmData1.Scan0
        Dim scan02 As IntPtr = bmData2.Scan0
        ' we need to know how big the data is so that we can create the correct size for the file
        Dim bytes As Integer = b.Height * b.Width * 3
        ' we create the byte arrays so that we can edit them
        Dim p01(bytes - 1) As Byte
        Dim p02(bytes - 1) As Byte
        ' put the images into the byte arrays
        System.Runtime.InteropServices.Marshal.Copy(scan01, p01, 0, bytes)
        System.Runtime.InteropServices.Marshal.Copy(scan02, p02, 0, bytes)

        ' the nWidth describes the width of the actual image multiplied by three for each byte in the pixel (3 bytes per pixel 24 bits ;))
        Dim nWidth As Integer = b2.Width * 3
        ' for some reason although the original code show a formula to come up with the offset this doesn't work very well.
        ' I found that it is just easier to make the offset 0 and so all bits are handled. Basically the problem comes when 
        ' using this on files that don't have
        Dim nOffset As Integer = 0
        Dim nPixel As Integer = 0, npixelmax As Integer = 0
        Dim pos1 As Integer = stride + 3
        Dim pos2 As Integer = stride + 3
        Dim p2minusplus As Integer, p2plusminus As Integer, p2plusplus As Integer, p2minusminus As Integer
        Dim p2minusstride As Integer, p2plusstride As Integer
        Dim p2plus As Integer, p2minus As Integer

        For y As Integer = 1 To b.Height - 1
            For x As Integer = 1 To nWidth - 3

                p2minusplus = pos2 - stride + 3
                p2plusminus = pos2 + stride - 3
                p2plusplus = pos2 + stride + 3
                p2minusminus = pos2 - stride - 3
                p2minusstride = pos2 - stride
                p2plusstride = pos2 + stride
                p2minus = pos2 - 3
                p2plus = pos2 + 3
                If p2minusplus <= p02.Length - 1 And p2minusplus >= 0 And p2plusminus <= p02.Length - 1 And p2plusminus >= 0 And _
                p2plusplus <= p02.Length - 1 And p2plusplus >= 0 And p2minusminus <= p02.Length - 1 And p2minusminus >= 0 And _
                p2minusstride <= p02.Length - 1 And p2minusstride >= 0 And p2plusstride <= p02.Length - 1 And p2plusstride >= 0 And _
                p2plus <= p02.Length - 1 And p2plus >= 0 And p2minus <= p02.Length - 1 And p2minus >= 0 And pos1 < p01.Length Then
                    npixelmax = Math.Abs(CInt(p02(p2minusplus)) - CInt(p02(p2plusminus)))
                    nPixel = Math.Abs(CInt(p02(p2plusplus)) - CInt(p02(p2minusminus)))
                    If nPixel > npixelmax Then npixelmax = nPixel
                    nPixel = Math.Abs(CInt(p02(p2minusstride)) - CInt(p02(p2plusstride)))
                    If nPixel > npixelmax Then npixelmax = nPixel
                    nPixel = Math.Abs(CInt(p02(p2plus)) - CInt(p02(p2minus)))
                    If nPixel > npixelmax Then npixelmax = nPixel
                    If npixelmax < CInt(threshold) Then npixelmax = 0
                    p01(pos1) = CByte(npixelmax)
                End If
                pos1 += 1
                pos2 += 1

            Next
            pos1 += nOffset
            pos2 += nOffset
        Next

        System.Runtime.InteropServices.Marshal.Copy(p01, 0, scan01, bytes)

        b.UnlockBits(bmData1)
        b2.UnlockBits(bmData2)

    End Sub
    Public Sub EdgeDetectHomogenity(ByVal b As Bitmap, ByVal threshold As Byte)
        Dim b2 As Bitmap = b.Clone
        Dim bmData1 As BitmapData = b.LockBits(New Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb)
        Dim bmData2 As BitmapData = b2.LockBits(New Rectangle(0, 0, b2.Width, b2.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb)
        Dim stride As Integer = bmData2.Stride
        Dim scan01 As IntPtr = bmData1.Scan0
        Dim scan02 As IntPtr = bmData2.Scan0
        Dim bytes As Integer = b.Height * b.Width * 3
        Dim p01(bytes - 1) As Byte
        Dim p02(bytes - 1) As Byte

        System.Runtime.InteropServices.Marshal.Copy(scan01, p01, 0, bytes)
        System.Runtime.InteropServices.Marshal.Copy(scan02, p02, 0, bytes)
        Dim nWidth As Integer = b2.Width * 3
        Dim nOffset As Integer = 0
        Dim nPixel As Integer = 0, npixelmax As Integer = 0
        Dim pos1 As Integer = stride + 3
        Dim pos2 As Integer = stride + 3

        Dim p2plusminus As Integer, p2plusstride As Integer, p2plusplus As Integer, p2minusstride As Integer, _
        p2minusminus As Integer, p2minusplus As Integer

        For y As Integer = 1 To b.Height - 1
            For x As Integer = 1 To nWidth - 3

                p2plusminus = pos2 + stride - 3
                p2plusstride = pos2 + stride
                p2plusplus = pos2 + stride + 3
                p2minusstride = pos2 - stride
                p2minusminus = pos2 - stride - 3
                p2minusplus = pos2 - stride + 3

                If p2plusminus < p02.Length And p2plusminus >= 0 And p2plusstride < p02.Length And p2plusstride >= 0 And _
                p2plusplus < p02.Length And p2plusplus >= 0 And p2minusstride < p02.Length And p2minusstride >= 0 And _
                p2minusstride < p02.Length And p2minusstride >= 0 And p2minusminus < p02.Length And p2minusminus >= 0 And _
                p2minusplus < p02.Length And p2minusplus >= 0 Then

                    npixelmax = Math.Abs(CInt(p02(pos2)) - CInt(p02(p2plusminus)))
                    nPixel = Math.Abs(CInt(p02(pos2)) - CInt(p02(p2plusstride)))
                    If nPixel > npixelmax Then npixelmax = nPixel

                    nPixel = Math.Abs(CInt(p02(pos2)) - CInt(p02(p2plusplus)))
                    If nPixel > npixelmax Then npixelmax = nPixel

                    nPixel = Math.Abs(CInt(p02(pos2)) - CInt(p02(p2minusstride)))
                    If nPixel > npixelmax Then npixelmax = nPixel

                    nPixel = Math.Abs(CInt(p02(pos2)) - CInt(p02(p2plusstride)))
                    If nPixel > npixelmax Then npixelmax = nPixel

                    nPixel = Math.Abs(CInt(p02(pos2)) - CInt(p02(p2minusminus)))
                    If nPixel > npixelmax Then npixelmax = nPixel

                    nPixel = Math.Abs(CInt(p02(pos2)) - CInt(p02(p2minusstride)))
                    If nPixel > npixelmax Then npixelmax = nPixel

                    nPixel = Math.Abs(CInt(p02(pos2)) - CInt(p02(p2minusplus)))
                    If nPixel > npixelmax Then npixelmax = nPixel


                    If npixelmax < threshold Then npixelmax = 0

                    p01(pos1) = CByte(npixelmax)

                End If

                pos1 += 1
                pos2 += 1
            Next
            pos1 += nOffset
            pos2 += nOffset
        Next

        System.Runtime.InteropServices.Marshal.Copy(p01, 0, scan01, bytes)

        b.UnlockBits(bmData1)
        b2.UnlockBits(bmData2)

    End Sub


    Public Function EdgeEnhance(ByVal b As Bitmap, ByVal threshold As Byte) As Boolean
        Dim b2 As Bitmap = b.Clone
        Dim bmData1 As BitmapData = b.LockBits(New Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb)
        Dim bmData2 As BitmapData = b2.LockBits(New Rectangle(0, 0, b2.Width, b2.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb)
        Dim stride As Integer = bmData2.Stride
        Dim scan01 As IntPtr = bmData1.Scan0
        Dim scan02 As IntPtr = bmData2.Scan0
        Dim bytes As Integer = b.Height * b.Width * 3
        Dim p01(bytes - 1) As Byte
        Dim p02(bytes - 1) As Byte

        System.Runtime.InteropServices.Marshal.Copy(scan01, p01, 0, bytes)
        System.Runtime.InteropServices.Marshal.Copy(scan02, p02, 0, bytes)
        Dim nWidth As Integer = b2.Width * 3
        Dim nOffset As Integer = 0
        Dim nPixel As Integer = 0, npixelmax As Integer = 0
        Dim pos1 As Integer = stride + 3
        Dim pos2 As Integer = stride + 3
        Dim p2minusplus As Integer, p2plusminus As Integer, p2plusplus As Integer, p2minusminus As Integer
        Dim p2minusstride As Integer, p2plusstride As Integer
        Dim p2plus As Integer, p2minus As Integer

        For y As Integer = 1 To b.Height - 1
            For x As Integer = 1 To nWidth - 3

                p2minusplus = pos2 - stride + 3
                p2plusminus = pos2 + stride - 3
                p2plusplus = pos2 + stride + 3
                p2minusminus = pos2 - stride - 3
                p2minusstride = pos2 - stride
                p2plusstride = pos2 + stride
                p2minus = pos2 - 3
                p2plus = pos2 + 3
                If p2minusplus <= p02.Length - 1 And p2minusplus >= 0 And p2plusminus <= p02.Length - 1 And p2plusminus >= 0 And _
                p2plusplus <= p02.Length - 1 And p2plusplus >= 0 And p2minusminus <= p02.Length - 1 And p2minusminus >= 0 And _
                p2minusstride <= p02.Length - 1 And p2minusstride >= 0 And p2plusstride <= p02.Length - 1 And p2plusstride >= 0 And _
                p2plus <= p02.Length - 1 And p2plus >= 0 And p2minus <= p02.Length - 1 And p2minus >= 0 And pos1 < p01.Length Then
                    npixelmax = Math.Abs(CInt(p02(pos2 - stride + 3)) - CInt(p02(pos2 + stride - 3)))
                    nPixel = Math.Abs(CInt(p02(pos2 + stride + 3)) - CInt(p02(pos2 - stride - 3)))
                    If nPixel > npixelmax Then npixelmax = nPixel

                    nPixel = Math.Abs(CInt(p02(pos2 - stride)) - CInt(p02(pos2 + stride)))
                    If nPixel > npixelmax Then npixelmax = nPixel

                    nPixel = Math.Abs(CInt(p02(pos2 + 3)) - CInt(p02(pos2 - 3)))
                    If nPixel > npixelmax Then npixelmax = nPixel

                    If npixelmax > threshold And npixelmax > p01(pos1) Then
                        p01(pos1) = CByte(Math.Max(CInt(p01(pos1)), npixelmax))
                    End If

                End If

                pos1 += 1
                pos2 += 1
            Next
            pos1 += nOffset
            pos2 += nOffset
        Next

        System.Runtime.InteropServices.Marshal.Copy(p01, 0, scan01, bytes)

        b.UnlockBits(bmData1)
        b2.UnlockBits(bmData2)

        Return True
    End Function

End Class

 

 

این کد کامل نیست!

دانلود کد فوق از طریق لینک زیر:

CannyInVisualBasic

رمز فایل : behsanandish.com

 

منبع


منابع:

fa.wikipedia.org

http://mediasoft.ir

 

سامانه توصیه گر

سیستم توصیه گر (به انگلیسی: Recommender System) یا سامانه پیشنهادگر (واژه سیستم یا سامانه گاهی با پلتفرم یا موتور جایگزین می‌شود)، با تحلیل رفتار کاربر خود، اقدام به پیشنهاد مناسب‌ترین اقلام (داده، اطلاعات، کالا و…)می‌نماید. این سیستم رویکردی است که برای مواجهه با مشکلات ناشی از حجم فراوان و رو به رشد اطلاعات ارائه شده‌است و به کاربر خود کمک می‌کند تا در میان حجم عظیم اطلاعات سریع‌تر به هدف خود نزدیک شوند. برخی سامانه پیشنهادگر را معادل پالایش گروهی (به انگلیسی: Collaborative filtering) می‌دانند.

مقدمه

پیش بینی می‌شد که تا اوایل سال ۲۰۰۷ میلادی در سایت دانشنامه اینترنتی ویکی‌پدیا چیزی حدود ۵٫۱ میلیون مقاله به ثبت رسیده باشد یا سایت مدیریت و به اشتراک‌گذاری تصاویر فلیکر بالغ بر ۲۵۰ میلیون تصویر را در خود جای دهد. از این رو، می‌توان گفت که ما در میان حجم عظیمی از داده و اطلاعات قرار گرفته‌ایم که بدون راهنمایی و ناوبری درست ممکن است انتخاب‌هایی غلط یا غیر بهینه از میان آن‌ها داشته باشیم. سیستم‌های توصیه‌گر سیستم‌های تأثیرگذار در راهنمایی و هدایت کاربر، در میان حجم عظیمی از انتخاب‌های ممکن، برای رسیدن به گزینه مفید و مورد علاقه وی هستند، به گونه‌ای که این فرایند برای همان کاربر شخصی‌سازی شده باشد.

تعاریف متفاوتی برای سیستم‌های توصیه‌گر ارائه شده‌است. از آن جمله، تعریف کلی‌نگر و خلاصه آقای Ting-peng liang در سال ۲۰۰۷ است که RS را زیرمجموعه‌ای از DSSها می‌داند و آن‌ها راسیستم‌های اطلاعاتی تعریف می‌کند که، توانایی تحلیل رفتارهای گذشته و ارائه توصیه‌هایی برای مسائل جاری را دارا هستند. به زبان ساده‌تر در سیستم‌های توصیه‌گر تلاش بر این است تا با حدس زدن شیوه تفکر کاربر (به کمک اطلاعاتی که از نحوه رفتار وی یا کاربران مشابه وی و نظرات آن‌ها داریم) به وی مناسب‌ترین و نزدیک‌ترین کالا به سلیقه او را شناسایی و پیشنهاد کنیم. این سیستم‌ها در حقیقت همان فرایندی که ما در زندگی روزمره خود به کار می‌بریم و طی آن تلاش می‌کنیم تا افرادی با سلایق نزدیک به خود را پیدا کرده و از آنها در مورد انتخاب‌هایمان نظر بخواهیم. توصیه‌هایی که از سوی سیستم‌های توصیه‌گر ارائه می‌شوند به طور کلی می‌توانند دو نتیجه دربرداشته باشند:

  • کاربر را در اخذ تصمیمی یاری می‌کنند (که مثلاً از میان چندین گزینه پیش رو کدام بهتر است و آن را انتخاب کند و …).
  • موجب افزایش آگاهی کاربر، در زمینه مورد علاقه وی می‌شود (مثلاً در حین ارائه توصیه به کاربر موجب می‌شود تا وی با اقلام و اشیاء جدیدی را که قبلاً آنها را نمی‌شناخته، آشنا شود).

سیستم‌های توصیه‌گر برای هر دو طرف یک تعامل (تجاری یا غیرتجاری)، مفید هستند و مزایایی را فراهم می‌آورد. برای نمونه در یک تعامل تجاری، مشتری‌ها از این جهت که عمل جستجو در میان حجم زیاد اطلاعات برای آن‌ها تسهیل و تسریع می‌شود، استفاده از سیستم‌های توصیه‌گر را مفید می‌دانند؛ فروشندگان به کمک این سیستم‌ها می‌توانند رضایت مشتریان را بالا برده و نیز فروش خود را افزایش دهد.

مزایا و پیشرفت‌ها

حجم فراوان و روبه رشد اطلاعات بر روی وب و اینترنت، فرایند تصمیم‌گیری و انتخاب اطلاعات، داده یا کالاهای مورد نیاز را، برای بسیاری از کاربران وب دشوار کرده‌است. این موضوع، خود انگیزه‌ای شد تا محققین را وادار به پیداکردن راه‌حلی برای رویارویی با این مشکل اساسی عصر جدید که با عنوان سرریز داده‌ها شناخته می‌شود کند. برای رویارویی با این مسئله تاکنون دو رویکرد مطرح شده‌اند، اولین رویکردی که به کار گرفته شد استفاده از دو مفهوم بازیابی اطلاعات و تصفیه‌سازی اطلاعات بود. عمده محدودیتی که این دو مفهوم در ارائه پیشنهادات دارند، این است که برخلاف توصیه‌گرهای انسانی (مثل دوستان، اعضای خانواده و …)، این دو روش قادر به تشخیص و تفکیک اقلام با کیفیت و بی کیفیت، در ارائه پیشنهاد برای یک موضوع یا کالا، نیستند. مشکل مذکور، موجب شد تا رویکرد دومی تحت عنوان سیستم توصیه‌گر پدید آید. این سیستم‌های جدید، مشکل سیستم‌های موجود در رویکرد اولیه را حل کرده‌اند.

تاریخچه

تقریباً در اواسط دهه ۹۰ بود که مطالعه بر روی سیستم‌های توصیه‌گر به عنوان یک شاخه مستقل در تحقیقات مطرح شد و علت این توجه خاص، ابراز تمایل محققین، برای حل مشکل روش‌های توصیه‌گری بود که در رویکرد اولیه به مسئله جستجو در حجم فراوان اطلاعات، از آنها استفاده می‌شد.

ظرفیت رایانه‌ها در فراهم آوردن توصیه‌ها تقریباً از همان اوایل تاریخ‌چه رایانه‌ها شناخته شد. گراندی، یک کتابدار کامپیوتری گامی اولیه به سمت سامانه‌های توصیه‌گر خودکار بود. این کتابدار یک توصیه‌گر نسبتاً ساده و اولیه بود که کاربران را به قالب‌هایی بر اساس مصاحبه کوتاه با استفاده از اطلاعات مستقیم‌کدشده(hard-coded) دربارهٔ سلایق کتاب قالب‌های مختلف گروه‌بندی می‌کرد تا توصیه‌ها را تولید کند، ولی این کار ورود اولیه مهم به فضای سامانه‌های توصیه‌گر قلمداد می‌شود.

در اوایل دهه نود میلادی، تکنیک پالایش مشارکتی به عنوان راه‌حلی برای مدیریت فضای اطلاعات بسیار زیاد آنلاین بوجود آمدند. تپستری Tapestry یک سامانه پالایش مشارکتی دستی بود. این سامانه به کاربر اجازه انجام پرس‌وجو برای آیتم‌های موجود در یک حوزه اطلاعاتی مانند ایمیل بر اساس عقاید و اقدامات دیگر کاربران می‌داد (همه ایمیل‌هایی که از طرف John فوروارد شده‌اند را به من نشان بده). این‌کار مستلزم تلاش از طرف کاربرانش بود ولی به آنها اجازه کنترل واکنش‌های خوانندگان قبلی یک قسمت از مکاتبات را می‌داد تا میزان ارتباطش با آنها را تعیین کند.

خیلی زود بعد از سامانه‌های خودکار پالایش مشارکتی، مکان‌یابی خودکار عقاید مرتبط و تجمع آنها برای دادن توصیه مطرح شد. GroupLens از این تکنیک برای تعیین کردن مقاله‌های Usenet که احتمال دارد مورد علاقه کاربر خاصی باشد استفاده کرد. کاربران تنها نیاز داشتند تا نمره‌دهی یا دیگر اقدامات قابل مشاهده انجام دهند. سامانه اینها را با نمره‌ها یا اقدامات کاربران دیگر ترکیب می‌کرد تا نتایج شخصی‌شده تولید کند. با این سامانه‌ها، برای دریافت پیشنهادات، کابران نه قادرند هیچ اطلاعات مستقیمی از عقاید دیگر کاربران بدست بیاورند و نه نیازی دارند تا بدانند کاربران یا آیتم‌های دیگر سامانه چه‌چیزهایی هستند.

طی این دوره، سامانه‌های توصیه‌گر و پالایش مشارکتی تبدیل به موضوعی مورد علاقه در بین محققین حوزه‌های تعاملات انسان-رایانه، یادگیری ماشین و بازیابی اطلاعات شدند. این علاقه منجر به ایجاد تعدادی سامانه توصیه‌گر برای زمینه‌های مختلفی شد از جمله Ringo برای موسیقی، توصیه‌گر ویدیو BellCore برای فیلم‌ها و Jester برای لطیفه‌ها شد. خارج از دنیای رایانه، حوزه بازاریابی توصیه‌ها را برای توانایی‌شان در افزایش فروش و بهبود تجربه مشتریان آنالیز کرده است.

در اواخر دهه نود میلادی، پیاده‌سازی‌های تجاری فناوری توصیه‌گرها شروع به ظهور کردند. شاید معروف‌ترین کاربرد فناوری‌های سامانه‌های توصیه گر وب‌سایت Amazon.com باشد. بر اساس تاریخ‌چه خرید، تاریخ‌چه بازدید و آیتمی که کاربر درحال مشاهده آن است آنها به کاربر آیتم‌هایی را توصیه می‌کنند تا برای خرید درنظر بگیرد.

از زمان بکارگیری توسط آمازون، فناوری توصیه، اغلب بر اساس پالایش مشارکتی، در بسیاری از سامانه‌های تجارت الکترونیک و آنلاین تعبیه شده است. یک انگیزه قابل ملاحظه برای انجام اینکار افزایش حجم فروش است، مشتریان ممکن است کالایی را بخرند اگر آن کالا به آنها پیشنهاد شود ولی درغیراینصورت ممکن است آن کالا را نخرند. شرکت‌های بسیاری مانند NetPerceptions و Strands بخاطر فراهم کردن فناوری و خدمات توصیه به خرده‌فروشان آنلاین بوجود آمده‌اند.

جعبه ابزار تکنیک‌های توصیه گر به چیزی بیش از پالایش مشارکتی گسترش یافته‌اند و شامل رویکردهای محتوامحور(Content-Based) بر اساس متدهای بازیابی اطلاعات، استنتاج بیزی (Bayesian Inference) و استدلال مورد محور (Case-Based Reasonong) می‌باشد. این متدها بجای یا درعوض الگوهای نمره دهی کاربران، محتوا یا ویژگی‌های اصلی آیتم‌هایی که قرار است توصیه شود را درنظر می‌گیرند. با به بلوغ رسیدن استراتژی‌های توصیه مختلف، سامانه‌های توصیه‌گر ترکیبی (Hybrid Recommender Systems) نیز ظهور یافته‌اند و الگوریتم‌های مختلفی را در سیستم‌های مرکبی ترکیب کرده‌اند که بر اساس قدرت الگوریتم‌های تشکیل‌دهنده‌شان ایجاد شده‌اند. البته در کنار رویکردهای محتوا محور، پالایش مشارکتی، هم روش تکی و هم ترکیب‌شده‌اش به عنوان روشی مؤثر همچنان مطرح هستند.

زمانی که Netflix جایزه Netflix Prize را در سال ۲۰۰۶ به منظور بهبود بخشیدن وضعیت توصیه‌های فیلمش برقرار کرد، تحقیق بر روی الگوریتم‌های سامانه‌های توصیه‌گر توجه بسیاری را به خودش جلب کرد. هدف این رقابت ساختن یک الگوریتم توصیه‌گری بود که بتواند الگوریتم CineMatch که متعلق به خود Netflix بود را با ۱۰٪ بهبود در آزمایشات آفلاین شکست دهد. این امر موجب ایجاد خروشی از اقدامات شد، هم در بین محیط آکادمیک و هم در بین سایر علاقمندان. جایزه یک میلیون دلاری ارزشی را که فروشندگان برای دقت توصیه‌ها قائل هستند نشان می‌دهد[۱].

کاربردها

سیستم‌های توصیه‌گر کاربردهای فراوانی دارند که برخی از زمینه‌های کاربردی آن به شرح زیر است:

  • تجارت الکترونیک: برای توصیه محصولات و خدمات مختلف.
  • اینترانت‌های بنگاهی: برای پیدا کردن افراد خبره در یک زمینه خاص یا افرادی که در رویارویی با شرایط مشابه، تجاربی کسب کرده و راه حل‌هایی یافته‌اند (بیشتر داخل یک سازمان کاربرد دارد).
  • کتابخانه دیجیتال: پیدا کردن کتاب، مقاله و …
  • کاربردهای پزشکی: انتخاب پزشک متناسب با شرایط (مکان، نوع بیماری، زمان و …) بیمار، انتخاب دارو و …
  • مدیریت ارتباط با مشتری CRM: برای ارائه راهکارهایی برای حل مشکلات تولیدکننده و مصرف‌کننده در زنجیره تأمین.

مقایسه سامانه‌های توصیه گر و سامانه‌های تصمیم‌یار کلاسیک

اگر چه شباهت‌های بسیاری بین این دو سیستم وجود دارد اما بین آن‌ها تفاوت‌هایی هم هست، که مهم‌ترین این تفاوت‌ها، این است که در DSSها کاربر نهایی مدیران ارشد یا میانی یک سازمان هستند، در حالی که در سیستم‌های توصیه‌گر کاربری سیستم به سطح خاصی محدود نمی‌شود و سیستم مورد استفاده عام است. اما عمده شباهت این دو سیستم نیز بر این اساس که سیستم‌های توصیه‌گر، جدای از دیدگاه سطوح کاربری و به لحاظ فنی، به نوعی زیر مجموعه DSS به شمار می‌روند. هر دوی آنها کاربر خود را در اخذ تصمیم، یاری می‌کنند و هر دو سیستم‌های اطلاعاتی‌ای هستند که دارای پایگاه دانش، پایگاه داده، رابط کاربری و … می‌باشند.

تعاریف و اصطلاحات عمده

لازم است برای درک مفهوم سیستم توصیه‌گر، مفاهیم چهارگانه و ابتدایی زیر را بررسی کنیم.

  • در سیستم‌های توصیه گر به کاربری که توصیه جاری در سیستم، برای وی در حال پردازش و آماده شدن است، کاربر فعال یا کاربر هدف می‌گویند.
  • الگوریتم‌های به کار رفته در این سیستم‌ها، از ماتریسی به نام ماتریس رتبه‌ها استفاده می‌کنند؛ اصطلاحات رایج برای این ماتریس Rating Database و Preference Database نیز هستند.
  • از فعل مصرف کردن در سیستم‌های توصیه‌گر، زمانی استفاده می‌کنند که کاربر توصیه ارائه شده را می‌پذیرد. به عبارتی وقتی کاربری پیشنهادی را که توسط سیستم به وی شده می‌پذیرد، می‌گوییم کاربر آن پیشنهاد را مصرف کرده، این پذیرش می‌تواند به شکل‌های مختلفی باشد، مثلاً کاربر، کتاب پیشنهادی را می‌خرد، سایت پیشنهادی را مرور می‌کند یا به شرکت خدماتی ای که به او پیشنهاد شده مراجعه می‌کند. ساختار ماتریس رتبه‌ها بدین گونه‌است که در آن، هر سطر ماتریس نمایانگر یک کاربر و هر ستون آن معرف کالایی (شئای) خاص است.

حال با مفهوم تابع سودمندی آشنا خواهیم شد که قصد داریم به کمک آن یک مدل کلی ریاضی از سیستم‌های توصیه‌گر را نیز ارائه دهیم. در واقع یک سیستم توصیه‌گر را می‌توان با این نگاشت همسان دانست و مدل کرد: {\displaystyle u:C*S->R}{\displaystyle u:C*S->R}

فرض کنید C مجموعه تمامی کاربران و S مجموعه اقلام در دسترس باشند. تابعی را که میزان مفید و متناسب بودن کالای S برای کاربر C را محاسبه می‌کند با u نشان می‌دهیم، که در آن R مجموعه‌ای است کاملاً مرتب (براساس میزان اهمیت). هرکدام از عناصر S را می‌توان با مجموعه‌ای از خصوصیات، مشخص کرد. برای مثال، محصولی مثل فیلم را می‌توان با مشخصه‌هایی چون عنوان فیلم، کارگردان، طول زمانی فیلم، تاریخ تولید و … ثبت کرد. همچنین عناصر مجموعه C را نیز می‌توان بر اساس ویژگی‌های مثل سن، جنسیت و … ثبت کرد. (باید توجه داشت که u روی تمام فضای مجموعه آغازین S×C تعریف شده نیست؛ از این رو باید برون‌یابی شود)

سیستم توصیه گر (Recommender System) قسمت 1
سیستم توصیه گر (Recommender System) قسمت 2
سیستم توصیه گر (Recommender System) قسمت 3

مقدمه

کنترل کیفیت (QC) هوشمند – امروزه کمتر کارخانه پیشرفته‌ای وجود دارد که بخشی از خط تولید آن توسط برنامه‌های هوشمند بینایی ماشین کنترل نشود. شرکت بهسان اندیش پیشرو در ارائه راهکارهای هوشمند مبتنی بر پردازش تصویر و بینایی ماشین، مفتخر به حضور در عرصه کنترل کیفیت هوشمند در صنایع می باشد. جهت آشنایی بیشتر با قابلیت ها و مزایای استفاده از پردازش تصویر و بینایی ماشین در حوزه صنعت توجه شما را به خواندن این نوشتار و یا دانلود کاتالوگ از طریق لینک زیر جلب می نماییم:

دانلود کامل کاتالوگ (شامل تصاویر بیشتر جهت آشنایی با موضوع)

 

بینایی ماشین چیست؟

بینایی ماشین (به انگلیسی: Machine vision) شاخه‌ای از علم مهندسی است که به رشته‌های علوم کامپیوتری (Computer science) و علم نورشناسی و مهندسی مکانیک و اتوماسیون صنعتی ارتباط دارد. یکی از مهمترین و پر استفاده‌ترین کاربردهای آن در بازبینی و بررسی کالاهای صنعتی از جمله نیمه هادیها، اتومبیل‌ها، مواد خوراکی و دارو می‌باشد. همانند نیروی انسانی که با چشم غیر مسلح در خط تولید کالاها را برای تعیین کیفیت و نوع ساخت آنها بازبینی می‌کنند، Machine vision از دوربین‌های دیجیتال و دوربین‌های هوشمند و نرم‌افزارهای image processing (پردازش تصویر) برای این کار استفاده می‌کند. دستگاههای مربوطه (Machine vision) برای انجام دادن وظایفی خاص از جمله شمردن اشیاء در بالابرها، خواندن شماره سریالها(Serial numbers)، جستجوی سطح‌های معیوب به کار می‌روند.

بینایی ماشین و کنترل کیفیت

 

مزایای بهره گیری از بینایی ماشین در صنعت

امروزه کمتر کارخانه پیشرفته‌ای وجود دارد که بخشی از خط تولید آن توسط برنامه‌های هوشمند بینایی ماشین کنترل نشود. قابلیت ها و مزایای زیر باعث شده که صنایع و کارخانه‌ها به‌سرعت به سمت پردازش تصویر و بینایی ماشین روی بیاورند:
* ثبت کلیه تصاویر و امکان بررسی سوابق کنترل کیفیت محصول در آینده
* کاهش نیروی انسانی
* ایجاد فضایی کاملا بهداشتی با کاهش دخالت انسان
* اطلاع از کیفیت دستگاههای تولیدی با بررسی میانگین محصولات معیوب
* هزینه نگهداری بسیار پایین
* عدم نیاز به حضور 24 ساعته اپراتور
* امکان شناسایی تخلفات پرسنل
* افزایش سرعت در مرحله کنترل کیفیت

 

کنترل کیفیت در صنعت

 

کاربردهای بینایی ماشین در صنعت

* بررسی مواد اولیه تولید (مثلاً کنترل کیفیت مواد اولیه).
* کنترل موجودی انبار و سیستمهای مدیریتی (شمارش، بارکد خواندن و ذخیره اطلاعات در سیستمهای دیجیتال)
* بررسی کیفیت محصول نهایی تولید شده
* کنترل کیفیت و بهبود محصولات غذایی.
* ماشینی کردن اجزای کوچک صنعتی.
* سیستمهای ایمنی موجود در محیط‌های صنعتی.
* کنترل رباتهای تعقیب خطی که برای حمل بار در کارخانه‌های صنعتی استفاده می‌شوند.

بینایی ماشین و کنترل کیفیت

 

اجزای سیستم بینایی ماشین جهت پیاده سازی کنترل کیفیت هوشمند

اگرچه “بینایی ماشینی” بیشتر به عنوان یک فرآیند در کاربردهای صنعتی شناخته شده است، برای فهرست کردن اجزای سخت‌افزاری و نرم‌افزاری به کار برده شده نیز مفید می‌باشد. معمولاً یک بینایی ماشینی از اجزای زیر ساخته شده است:
1. یک یا چند دوربین دیجیتال یا آنالوگ (سیاه-سفید یا رنگی) با اپتیک مناسب برای گرفتن عکس.
2. واسطه‌ای که عکس‌ها را برای پردازش آماده می‌سازد. برای دوربین‌های آنالوگ این واسطه شامل یک دیجیتال کننده عکس است.

3. یک پردازشگر (گاهی یک PC یا پردازنده تعبیه شده (Embedded Processor) مانند DSP
4. نرم‌افزار Machine vision: این نرم‌افزار امکاناتی برای توسعه یک برنامه نرم‌افزاری که برای کاربردی مشخص شده است را فراهم می‌کند.
5. سخت‌افزار ورودی / خروجی (مثلاً I/O دیجیتال) یا حلقه‌های ارتباطی (مثلاً ارتباط شبکه ای یا RS-232) برای گزارش نتایج.
6. یک دوربین هوشمند: یک وسیله ساده که همه موارد فوق را داراست.
7. لنزهایی که بتواند به مقدار مطلوبی روی سنسور تصویر زوم کند.
8. منابع نوری مناسب و گاهی خیلی مخصوص (مثلاً چراغهای LED، فلورسنت، لامپهای هالوژن و . . .)
9. یک برنامهٔ مشخص که بتواند تصاویر را پردازش کرده و مشخصه‌های مربوط و مناسب را شناسایی کند.
10. یک سنسور همزمان ساز برای شناسایی اجزا (گاهی یک سنسور نوری یا یک سنسور مغناطیسی): این سنسور برای راه‌اندازی سیستمٍ استخراج و پردازش تصویر می‌باشد.

واتسون، کابوس آزمون تورینگ!

واتسون را که به‌طور حتم به خاطر می‌آورید؟ ماشین ساخت آی‌بی‌ام که در سال 2011 با شکست دادن رقبای انسانی خبره در بازی Jeopardy سر‌و‌صدای زیادی به پا کرد. این ماشین به عنوان یکی از مدرن‌ترین نمونه‌های ماشین‌های هوشمند امروزی می‌تواند مورد بسیار خوبی برای بررسی وضعیت آزمون تورینگ در جهان امروز به شمار می‌رود.

خبر بد این است که واتسون آزمون تورینگ را با موفقیت پشت سر نگذاشته است و با تعاریف کلاسیک، به هیچ عنوان ماشین هوشمندی به شمار نمی‌آید. اما این باعث نمی‌شود تا این ماشین، انقلابی در حوزه هوش مصنوعی محسوب نشود. ماهنامه ساینتیفیک امریکن در شماره ماه مارس 2011 و کمی پس از موفقیت واتسون در Jeopardy مصاحبه‌ای را با استفن بیکر، روزنامه‌نگاری که در فرآیند ساخت واتسون با تیم آی‌بی‌ام همراه بود انجام داد که در آن بیکر به نکات جالبی در رابطه با وضعیت کنونی هوش مصنوعی اشاره می‌کند. بیکر ابتدا در پاسخ به این پرسش که چگونه واتسون دنیای هوش مصنوعی را تغییر داده، می‌گوید: «رؤیای اولیه در مورد هوش مصنوعی هیچ‌گاه به ثمر نرسید. در واقع دانشمندان پس از چندین دهه تحقیق، به این نتیجه رسیدند که ساخت سیستمی شبیه به مغز انسان، خیلی سخت‌تر از آن چیزی است که تصور می‌شد.

حتی واتسون نیز که انسان را در Jeopardy شکست داد، به این رؤیا چندان نزدیک نشده است. با این حال، در عرض 15 سال گذشته پیشرفت‌های خیره‌کننده‌ای در جنبه‌های کاربردی هوش مصنوعی صورت گرفته است. راهبردهای آماری برای شبیه‌سازی بعضی جنبه‌های آنالیز انسانی توانسته سیستم‌هايی کاربردی را در اختیار مردم قرار دهد که در هر زمینه‌ای، از دیپ بلو گرفته تا نت فلیکس، آمازون و گوگل زندگی ما را قبضه کرده‌اند.» بیکر سپس در مورد واتسون می‌گوید: «موضوع جدید درباره واتسون، راهبرد تماماً عمل‌گرای آن است. این ماشین روش‌های مختلفی را برای پاسخ به یک پرسش امتحان می‌کند. در اینجا راهبرد درست یا نادرست وجود ندارد بلکه واتسون در طول زمان یاد می‌گیرد تا چه زمانی به کدام روش تکیه کند. به نوعی می‌توان گفت در جنگ بین راهبردهای مختلف در هوش مصنوعی واتسون به مانند یک ندانم‌گرا (آگنوستیسیست) عمل می‌کند. جنبه جدید دیگر، توانایی بالای این ماشین در فهم زبان انگلیسی است. توانایی‌ای که به عقیده من از تمرین داده شدن این سیستم با دیتاست‌های عظیم ناشی شده است و با وجود خیره‌کننده بودن، یک روش جدید و بکر به شمار نمی‌‌‌آید.» بیکر سپس به توضیح مقایسه واتسون با مغز انسان پرداخته و می‌گوید: «تیم آی‌بی‌ام در هنگام برنامه‌ریزی واتسون توجه چنداني به ساختار مغز انسان نداشته است.

به عقیده من واتسون محصول واقعی مهندسی است‌: استفاده از فناوری‌های موجود برای ساخت ماشینی با ویژگی‌های مشخص در زمانی خاص.» بیکر سپس اضافه می‌کند: «با این حال من شباهت‌هایی را در شیوه تفکر واتسون و انسان‌ها مشاهده می‌کنم که البته به این دليل نیست که ما از یک طراحی یکسان سود می‌بریم، بلکه ما در واقع به دنبال حل مسائلی یکسان هستیم. به عنوان مثال، برخلاف بسیاری از کامپیوترها واتسون برای عدم قطعیت برنامه‌ریزی شده است. این سیستم هیچ‌گاه از جوابی که می‌دهد صد درصد مطمئن نیست بلکه در مورد آن شک و تردید دارد. این برای ماشینی که قرار است با زبان انسان‌ها ارتباط برقرار کند، راهبردی هوشمندانه به شمار می‌رود.»

بیکر در ادامه به نقاط قوت واتسون در درک زبان انگلیسی و جست‌وجوی سریع میان حجم عظیمی از داده‌ها اشاره کرده و اذعان می‌کند که چنین سیستمی می‌تواند به راحتی در زمینه‌های دیگری که حالت پرسش و پاسخ دارند، مانند حوزه بهداشت و درمان، به کار گرفته شود. نکته‌ای که بیکر بارها و بارها در این مصاحبه به آن اشاره می‌کند، این است که واتسون در واقع توانایی استدلال چندانی ندارد و این یکی از تفاوت‌های اصلی آن با بسیاری از سیستم‌های موجود هوش مصنوعی است. می‌توان این موضوع را به این صورت خلاصه کرد که طبق تعاریف سنتی هوشمندی، واتسون به هیچ عنوان هوشمند به شمار نمی‌آید چراکه ماشینی است با توانایی‌های بسیار محدود که به هیچ عنوان نمی‌تواند استدلال‌های پیچیده را مدیریت کند. با این حال، تلفیق قدرت جست‌وجوی بهینه اطلاعات و توانایی بالا در درک زبان انسانی، واتسون را به انقلابی در هوش مصنوعی تبدیل کرده که می‌تواند در زمانی کوتاه پاسخ‌هایی را تولید کند که ارائه آن‌‌ها از قدرت انسان خارج است.

بیکر در پایان مصاحبه می‌گوید: «می‌توان بحث را به این صورت خلاصه کرد که واتسون در واقع چیزی غیر از آمار تولید نمی‌کند.» وی ادامه می‌دهد: «با این حال، چنین پیشرفت‌هایی درس بزرگی به ما می‌دهد و آن این است که برای موفقیت در اقتصاد دانش، افراد باید از دانسته‌هایشان استفاده کرده و به ایده‌های نوین دست یابند. در غیر این صورت آن‌ها می‌توانند خیلی راحت با ماشین‌ها جایگزین شوند.» نکته‌ای که بیکر به آن اشاره می‌کند، بیشتر از آن که برای دانشمندان علوم کامپیوتر جذاب باشد، موضوع مطالعات مربوط به نیروی کار انسانی است. هوش مصنوعی کاربردی می‌تواند ماشین‌هایی مانند واتسون را طراحی کند که شاید در تعریف تورینگ هوشمند شمرده نشوند، اما توانایی کند و کاو حجم بسیار عظیمی از داده‌ها و ارائه اطلاعاتی مفید از آن‌ها در زبان انسان را در چنته دارند. بدون هیچ تعارفی حداقل در زمینه‌های خدماتی، بسیاری از شغل‌ها می‌توانند خیلی راحت با کامپیوترهایی ارزان قیمت جایگزین شوند.

این همان چیزی است که مدیران Diapers.com را به سمت اداره کل سیستم انبار به دست روبات‌ها سوق می‌دهد. یا فدکس را قانع می‌کند که می‌توان تعداد اپراتورهای شرکت را به حداقل رسانده و از ماشین‌هایی برای خدمات‌رساني به تماس‌های مشتریان استفاده کرد. چندین دهه قبل، انسان‌ها می‌ترسیدند روزی ماشین‌ها آن قدر هوشمند شوند که کنترل انسان‌ها را در دست گیرند. با این حال نزدیک به سی سال قبل و با شروع زمستان هوش مصنوعی، این ترس معنای سنتی خود را از دست داد و هم‌اکنون توانسته به شیوه‌ای جدید خود را وارد زندگی انسان‌ها کند. حقیقت تلخی در پس‌زمینه ماشین‌هایی مانند واتسون وجود دارد‌: بسیاری از کارهایی که تصور می‌کنیم هوشمندی انسان‌محورمان، ما را قادر به انجامشان می‌سازد در واقع آن‌قدر‌ها هم از نظر ماشین‌ها کار پیچیده‌ای به شمار نمی‌آید. اگر باور ندارید، می‌توانید از مبادله‌گران سنتی بورس در حوالی وال‌استریت سراغی بگیرید.

آينده

رابرت فرنچ، دانشمند علوم شناختی در مرکز ملی تحقیقات علمی فرانسه در رابطه با آینده آزمون تورینگ می‌گوید: «دو پیشرفت مهم در حوزه فناوری اطلاعات می‌تواند آزمون تورینگ را از بازنشستگی خارج کند. اول دسترسی بسیار گسترده به داده‌های خام؛ از فیدهای ویدیویی گرفته تا محیط‌های کاملاً صوتی و از مکالمه‌های عادی تا اسناد فنی. چنین اطلاعاتی در هر زمینه‌ای که به مغز انسان خطور می‌کند به صورت گسترده در دسترس هستند. پیشرفت دوم ایجاد روش‌های پیشرفته جمع‌آوری، مدیریت و پردازش این مجموعه غنی از داده‌ها است.»

البته توسعه یک سیستم به وسیله بارور‌کردن آن با مجموعه‌ای وسیع از داده‌ها و روش‌های کسب اطلاعات مفید از چنین داده‌هایی، شاید خیلی شبیه به سیستم یادگیری انسان نباشد، اما ممکن است در نهایت به سیستمی منجر شود که در همه زمینه‌ها، رفتاری انسانی از خود بروز دهد.  همان‌طور که در بخش دوم مقاله مشاهده کردید، دنیای امروز هوش مصنوعی چندان به ساخت ماشینی که انسان را شبیه‌سازی کند، علاقه‌مند نیست بلکه انقلاب جدید هوش مصنوعی نگاه به راهبردهای کاربردی‌تری دارد. در این راهبردهای جدید لزومی دیده نمی‌شود تا ماشین، رفتاری انسانی از خود نشان بدهد. در مقابل ماشین با منطق‌کاری خود که در مواردی کاملاً با مدل انسانی آن متفاوت است، کار کرده و با استفاده از داده‌های فراوان، الگوریتم‌های احتمالاتی و قدرت پردازشی بالا، سعی در انجام کارهایی دارد که انسان‌ها از انجام آن ناتوانند.

با این حال، هنوز هم رؤیای ساخت ماشینی انسان نما برای انسان به صورت معمایی جذاب و البته بسیار سخت باقی مانده است. همه ما سال‌ها تصویر این رؤیا را در فیلم‌های هالیوودی تماشا کرده‌ایم و هر‌چند در واقعیت، رسیدن به آن نقطه خیلی سخت‌تر از آن چیزی بود که تورینگ و دیگر پیشگامان هوش مصنوعی تصور می‌کردند، اما پیشرفت‌هایی مانند ساخت واتسون، ماشینی که می‌تواند زبان انسانی را به خوبی تحليل کند، همچنان محققان را به آینده امیدوار می‌کند. پیشرفت چنین پروژه‌هایی به‌شدت وابسته به تعهد دولت‌ها و سرمایه‌ای است که آنان در اختیار مؤسسات تحقیقاتی قرار می‌دهند زیرا به دلیل فاصله چنین تحقیقاتی از حوزه کاربرد، از نظر اقتصادی نمی‌توان آن‌ها را یک سرمایه‌گذاری منطقی قلمداد کرد. آینده پر از شگفتی‌هایی است که ما انتظارش را نداریم اما مسیر تا به همین جا نیز به حد کافی لذت‌بخش بوده است که دغدغه آینده، ما را از ادامه راه دلسرد نکند.


نظریه و آزمون تورینگ (هوش مصنوعی)

 

نظریه و آزمون تورینگ

بیش از نیم قرن پیش، هنگامی که هنوز هیچ تراشه‌ سیلیکونی‌ای ساخته نشده بود، آلن تورینگ یکی از بحث ‌بر‌انگیزترین پرسش‌های فلسفی تاریخ را پرسید. او گفت آیا ماشین می‌تواند فکر کند و اندکی بعد کوشید به پیروی از این قاعده که هر ادعای علمی باید از بوته آزمایش سربلند بیرون بیاید، پرسش فلسفی خود را با یک آزمایش ساده و در عین حال پیچیده جایگزین کند. او پرسید آیا یک ماشین یک کامپیوتر می‌تواند بازی تقلید را با موفقیت پشت سر بگذارد.
آیا ماشین می‌تواند از انسان چنان تقلید کند که در یک آزمون محاوره‌ای نتوانیم تفاوت انسان و ماشین را تشخیص دهیم. او در سال ۱۹۵۰ براساس محاسباتی تخمین زد که ۵۰ سال بعد کامپیوتری با یک میلیارد بیت حافظه خواهد توانست به موفقیت‌هایی در این زمینه دست پیدا کند. اکنون که در نیمه سال ۲۰۰۸ میلادی هستیم، حتی هشت سال بیشتر از زمانی که او لازم دانسته بود، هنوز هیچ ماشینی نتوانسته است از بوته آزمون تورینگ با موفقیت خارج شود. در سال ۲۰۰۰ مفهوم هوش مصنوعی برای هیچ‌کس غیر قابل باور نبوددر این مقاله نگاهی داریم به سیر تحولاتی که پس از این پرسش تاریخی در دنیای علم و مهندسی به‌وقوع پیوستند. یکی از جالب‌ترین و هیجان‌انگیزترین پرسش‌هایی که تاکنون تاریخ فلسفه به خود دیده این پرسش است که آلن تورینگ فیلسوف و ریاضیدان انگلیسی در سال ۱۹۵۰ طی مقاله‌ای به نام: Computing Machinery and Intelligence یا {ماشین محاسباتی و هوشمند} مطرح کرد او پرسید آیا ماشین می‌تواند فکر کند. خود تورینگ نتوانست پاسخ قطعی این پرسش را پیدا کند. اما برای یافتن پاسخ مناسب در آینده یک راهبرد خلاقانه پیشنهاد کرد.

او آزمونی طراحی کرد که خود، آن را بازی تقلید نامید. او آزمون بازی تقلید را چنین شرح داد: یک پرسشگر- یک انسان- همزمان در حال گفت‌وگو با دو نفر است. هر یک از این دو نفر در اتاق‌های جداگانه قرار گرفته‌اند و پرسشگر نمی‌تواند هیچیک از آنها را ببیند یکی از این دو نفر انسان است و دیگری یک ماشین یعنی یک کامپیوتر. پرسشگر باید با این دو نفر شروع به گفت‌وگو کند و بکوشد بفهمد کدا‌میک از این دو، انسان است و کدامیک ماشین. اگر کامپیوتر بتواند طوری جواب دهد که پرسشگر نتواند انسان را از ماشین تمیز دهد آنگاه می‌توان ادعا کرد که این ماشین هوشمند است. تورینگ برای آسان‌کردن شرایط این آزمون و پرهیز از پیچیدگی‌های اضافی آن را به محاوره‌ای متنی و روی کاغذ محدود کرد تا مجبور به درگیر شدن با مسائل انحرافی مانند تبدیل متن به گفتار شفاهی و تنظیم تن صدا و لهجه نباشیم.او همچنین بر اساس یک سری محاسبات پیش‌بینی کرد که ۵۰ سال بعد یعنی در سال ۲۰۰۰ انسان قادر خواهد بود کامپیوترهایی بسازد که در یک گفت‌وگوی پنج‌ دقیقه‌ای، فقط ۷۰درصد پرسشگرها بتوانند کشف کنند که در حال گفت‌وگو با یک انسان هستند یا یک ماشین. او برخورداری از یک میلیارد بیت حافظه (۱۲۵ میلیون بایت- حدود ۱۲۰ مگابایت) را یکی از مشخصه‌های اصلی این کامپیوتر دانست.تورینگ همچنین در این مقاله یک سری استدلال‌های مخالف با نظریه و آزمون خود را مطرح کرد و کوشید به آنها پاسخ دهد، تصور اینکه ماشین‌های هوشمندی ساخته شوند که بتوانند فکر کنند وحشتناک است. تورینگ در پاسخ می‌گوید این نکته‌ای انحرافی است، زیرا بحث اصلی او بایدها و نبایدها نیست بلکه بحث درباره ممکن‌هاست.

دیگر اینکه، ادعا می‌شود محدودیت‌هایی درباره نوع پرسش‌هایی که می‌توان از کامپیوتر پرسید وجود دارد، زیرا کامپیوتر از منطق خاصی پیروی می‌کند. اما تورینگ در پاسخ می‌گوید:‌ خود انسان هنگام گفت‌وگو پرغلط ظاهر می‌شود و نمی‌توان گفتار هر انسانی را لزوما منطقی کرد. او پیش‌بینی کرد که منشأ اصلی هوشمندی ماشین فرضی او، حافظه بسیار زیاد و سریعی است که یک کامپیوتر می‌تواند داشته باشد. بنابراین از نگاه تورینگ، ماشین همچون کامپیوتر Deep Blue که کاسپاروف، قهرمان شطرنج را شکست داد، می‌تواند یک ماشین هوشمند تلقی شود. در عین حال تورینگ این نظر را که {آزمون مورد بحث معتبر نیست، زیرا انسان دارای احساسات است و مثلا موسیقی دراماتیک می‌سازد} رد کرد و گفت: هنوز هیچ سند قابل قبولی وجود ندارد که ثابت کند فقط ما انسان‌ها دارای احساسات هستیم، زیرا مشخص نیست مفهوم دقیق این واژه به لحاظ علمی چیست.

در سال ۱۹۵۶ جان مک‌ کارتی، یکی از نظریه‌پردازان پیشگام این نظریه در آن زمان، اصطلاح (هوشمند مصنوعی) را برای اولین‌بار در نخستین کنفرانسی که به این موضوع اختصاص یافته بود، به کار برد. او همچنین زبان‌ برنامه‌نویس Lisp را ابداع کرد که در همین زمینه کاربرد دارد. دانشمندان بعدا این تاریخ را به عنوان تاریخ تولد علم هوش مصنوعی انتخاب کردند. تقریبا در همان زمان جان فون نیومان نظریه بازی‌ها را معرفی کرد. این نظریه نقش موثری در پیشبرد جنبه‌های نظری و علمی هوش مصنوعی داشت. چند سال بعد، در سال ۱۹۶۸ آرتور سرکلارک، در رمان معروف خود، یعنی اودیسه فضایی ۲۰۰۱ اصطلاح (آزمون تورینگ) را به جای (بازی‌ تقلید)‌ سر زبان‌ها انداخت. از زمانی که تورینگ این فرضیه را مطرح کرده است، هزاران دانشمند با هدف ساختن ماشینی که بتواند آزمون تورینگ را با موفقیت تمام کند، دست به کار شده‌اند. اما هنوز کسی موفق نشده است چنین ماشینی بسازد و پیش‌بینی تورینگ هم درست از آب در نیامده است.

● چالش‌های بنیادین هوش مصنوعی 

البته امروزه هوش مصنوعی به واقعیت نزدیک شده است و تقریبا می‌توان گفت وجود دارد اما دلایل اصلی متعددی وجود دارد که نشان می‌دهند چرا هنوز شکل تکامل یافته هوش که تورینگ تصور می‌کرد، به وقوع نپیوسته است. یکی از مهم‌ترین مباحث مطرح در این زمینه، موضوع شبیه‌سازی است. غالبا پرسیده می‌شود آیا صرف اینکه ماشین بتواند نحوه صحبت کردن انسان را شبیه‌سازی کند، به معنی آن است که هوشمند است؟ به عنوان مثال، شاید شما هم درباره روبات‌های نرم‌افزاری که می‌توانند چت کنند چیزهایی شنیده باشید. این روبات‌ها از روش‌های تقلیدی استفاده می‌کنند و به تعبیری نمونه مدرن و اینترنتی آزمون تورینگ هستند. مثلا روبات Eliza یکی از اینهاست. این روبات را ژزف وایزن‌بام، یکی دیگر از پژوهشگران نامدار این حوزه اختراع کرد. الیزا در برخی مکالمات ساده می‌تواند طرف مقابل خود را به اشتباه بیندازد طوری که مخاطب ممکن است فکر کند در حال گپ‌زدن با یک انسان است. البته الیزا هنوز نتوانسته است آزمون تورینگ را با موفقیت پشت سر بگذارد.

 

● شاخه‌های علم هوش مصنوعی 

امروزه دانش مدرن هوش مصنوعی به دو دسته تقسیم می‌شود:‌چ
ا) هوش مصنوعی سمبلیک یا نمادین Symbolic Ai
۲) هوش غیر سمبلیک یا پیوندگرا Connection Ai
هوش مصنوعی سمبلیک از رهیافتی مبتنی بر محاسبات آماری پیروی می‌کند و اغلب تحت عنوان «یادگیری ماشین» یا Machune Learning طبقه‌بندی می‌شود. هوش سمبلیک می‌کوشد سیستم و قواعد آن را در قالب سمبل‌ها بیان کند و با نگاشت اطلاعات به سمبل‌ها و قوانین به حل مسئله بپردازد. در میان معروف‌ترین شاخه‌های هوش مصنوعی سمبلیک می‌توان به سیستم‌های خبره (Expert Systems) و شبکه‌های Bayesian اشاره کرد. اما هوش پیوندگرا متکی بر یک منطق استقرایی است و از رهیافت «آموزش/ بهبود سیستم از طریق تکرار» بهره می‌گیرد. این آموزش‌ها نه بر اساس نتایج و تحلیل‌های دقیق آماری، بلکه مبتنی بر شیوه آزمون و خطا و «یادگیری از راه تجربه»‌ است. در هوش مصنوعی پیوندگرا، قواعد از ابتدا در اختیار سیستم قرار نمی‌گیرد، بلکه سیستم از طریق تجربه، خودش قوانین را استخراج می‌کند.
متدهای ایجاد شبکه‌های عصبی (Network Neural) و نیز به کارگیری منطق فازی (Fuzzy Logic) در این دسته قرار می‌گیرد.برای درک بهتر تفاوت میان دو شیوه به یک مثال توجه کنید. فرض کنید می‌خواهیم یک سیستم OCR بسازیم. سیستم OCR نرم‌افزاری است که پس از اسکن کردن یک تکه نوشته روی کاغذ می‌تواند متن روی آن را استخراج کند و به کاراکترهای متنی تبدیل نماید. بدیهی است که چنین نرم‌افزاری به نوعی هوشمندی نیاز دارد. این هوشمندی را با دو رهیافت متفاوت می‌توان فراهم کرد. اگر از روش سمبلیک استفاده کنیم، قاعدتا باید الگوی هندسی تمام حروف و اعداد را در حالت‌های مختلف در بانک اطلاعاتی سیستم تعریف کنیم و سپس متن اسکن‌شده را با این الگوها مقایسه کنیم تا بتوانیم متن را استخراج نماییم.روش دوم یا متد «پیوندگرا» این است که سیستم هوشمند سمبلیک درست کنیم و متن‌های متعددی را یک به یک به آن بدهیم تا آرام‌آرام آموزش ببیند و سیستم را بهینه کند.
در اینجا سیستم هوشمند می‌تواند مثلا یک شبکه عصبی یا مدل مخفی مارکوف باشد. در این شیوه سمبل‌ها پایه هوشمندی نیستند، بلکه فعالیت‌های سلسله اعصاب یک شبکه و چگونگی پیوند میان آنها مبنای هوشمندی را تشکیل می‌دهند. در طول دهه ۱۹۶۰ و ۱۹۷۰ به دنبال ابداع اولین برنامه نرم‌افزاری موفق در گروه سیستم‌های مبتنی بر دانش (Knowledge- based) توسط جوئل موزس، سیستم‌های هوش سمبلیک به یک جریان مهم تبدیل شد. ایده و مدل‌های شبکه‌های عصبی ابتدا در دهه ۱۹۴۰ توسط «Walter pittsWarren McCulloch» معرفی شد.

سپس در دهه ۱۹۵۰ کارهای روزنبالت (Rosenblatt) در مورد شبکه‌های دو لایه مورد توجه قرار گرفت. در دهه ۱۹۴۷ الگوریتم backpropagation توسط Werbos معرفی شد ولی متدولوژی شبکه‌های عصبی عمدتا از دهه ۱۹۸۰ به این سو رشد زیادی کرد و مورد استقبال دانشمندان قرار گرفت. منطق‌ فازی ابتدا توسط پروفسور لطفی‌زاده،‌ در سال ۱۹۶۵ معرفی شد و از آن زمان به بعد توسط خود او و دیگر دانشمندان دنبال شد.در دهه ۱۹۸۰ تلاش‌های دانشمندان ژاپنی برای کاربردی کردن منطق فازی به ترویج و معرفی منطق فازی کمک زیادی کرد. مثلا طراحی و شبیه‌سازی سیستم کنترل فازی برای راه‌آهن Sendiaتوسط دو دانشمند به نام‌های Yasunobo و Miyamoto در سال ۱۹۸۵، نمایش کاربرد سیستم‌های کنترل فازی از طریق چند تراشه‌ مبتنی بر منطق فازی در آزمون «پاندول معکوس» توسطTakeshi Yamakawa در همایش بین‌المللی پژوهشگران منطق فازی در توکیو در سال ۱۹۸۷ و نیز استفاده از سیستم‌های فازی در شبکه مونوریل توکیو و نیز معرفی سیستم ترمز ABS مبتنی بر کنترل‌های فازی توسط اتومبیل‌‌سازی هوندا در همین دهه تاثیر زیادی در توجه مجدد دانشمندان جهان به این حوزه از علم داشت.

 

● فراتر از هوشمندی ماشین

چنان که گفتیم، هوش مصنوعی دانش و مهندسی ساختن ماشین‌های هوشمند، به ویژه کامپیوترهای هوشمند است. اما به‌راستی هوشمند چیست؟ در واقع هنوز دانشمندان نتوانسته‌اند تعریف واحدی از هوشمندی ارائه دهند که مستقل از «هوش انسان» باشد. ما می‌دانیم که برخی از ماشین‌ها یا جانداران می‌توانند هوشمند باشند، اما بشر هنوز نمی‌داند که مایل است کدام دسته از فرآیندهای محاسباتی یا پردازش را هوشمندی بنامد. بنابراین برای پاسخ دادن به این پرسش که «آیا فلان ماشین هوشمند است؟» هنوز فرمول مشخصی وجود ندارد، در واقع هوشمندی، خود یک مفهوم‌ فازی و نادقیق است. هوشمندی را می‌توان فرآیندی تلقی کرد که دانشمندان هنوز در حال شبیه‌سازی، تحلیل و حتی تعریف مشخصه‌های آن هستند.

موضوع مهم دیگر که در ارتباط با هوش مصنوعی مطرح است، هدف دانشمندان از به کارگیری آن است. روشن است که هدف اولیه بشر از ورود به این موضوع، شبیه‌سازی هوش انسان در کالبد ماشین بوده است. ولی امروزه دیگر چنین نیست و این تصور که هدف علم هوش مصنوعی تنها شبیه‌سازی هوش انسانی است، تصوری نادرست است. در حقیقت موضوع شبیه‌سازی هوش انسانی عاملی پیش‌برنده در این حوزه از علم است که به دانشمندان انگیزه می‌دهد تا آن را توسعه دهند، اما در خلال روند توسعه، بشر می‌تواند به دستاوردهایی برسد که در تمام زمینه‌ها کاربرد دارد. سیستم‌های خبره و مبتنی بر دانش نمونه‌ای از این دستاوردهاست. بسیاری از نرم‌افزارهای موسوم به سیستم‌های تصمیم‌سازی (Decision Making Systems) در شاخه اقتصاد یا سیستم‌هایی که در تجزیه و تحلیل داده‌های پزشکی به کار می‌روند از این دستاورد بهره می‌گیرند.


/fa.wikipedia.org

http://www.meta4u.com

http://www.meta4u.com

 

 

آزمون‌تورینگ

آزمون تورینگ روشی برای سنجش میزان هوشمندی ماشین است. آزمون به این صورت انجام می‌گیرد که یک شخص به عنوان قاضی، با یک ماشین و یک انسان به گفتگو می‌نشیند، و سعی در تشخیص ماشین از انسان دارد. در صورتی که ماشین بتواند قاضی را به گونه‌ای بفریبد که در قضاوت خود دچار اشتباه شود، توانسته است آزمون را با موفقیت پشت سر بگذارد.

برای اینکه تمرکز آزمون بر روی هوشمندی ماشین باشد، و نه توانایی آن در تقلید صدای انسان، مکالمه تنها از طریق متن و صفحه کلید و نمایشگر کامپیوتر صورت می‌گیرد.

 

آزمون استاندارد تورینگ

آزمون استاندارد تورینگ، که در آن بازیکن C به عنوان قاضی سعی دارد تشخصی دهد کدام یک از A یا B انسان است.

آزمون تورینگ

تست تورینگ یک تست از توانایی ماشین است برای نمایش دادن رفتاری هوشمندانه شبیه به انسان. آزمون تورینگ در سال ۱۹۵۰ توسط آلن تورینگ،ریاضیدان انگلیسی مطرح گردید. از نظر تورینگ، پرسش «آیا ماشین‌ها می‌توانند تفکر کنند» بی‌معنی‌تر از آن بود که بتوان پاسخ روشنی به آن داد. چرا که نمی‌توان تعریف مشخصی برای تفکر ارائه داد. بنابراین تورینگ پرسش را به این گونه مطرح نمود: آیا می‌توان ماشینی ساخت که آزمون تورینگ را پشت سر بگذارد؟

هم اکنون دو نسخهٔ مختلف از این آزمون وجود دارد: آزمون استاندارد تورینگ، و آزمون تقلید.

آزمون تقلید

در این آزمون، دو شخص با جنسیت‌های متفاوت، از طریق یادداشت با شخص سومی که قاضی است گفتگو می‌کنند. قاضی این دو بازیکن را نمی‌بیند، و با پرسش و پاسخ سعی دارد تشخیص دهد کدام یک مرد و کدام یک زن هستند. نقش بازیکن اول این است که قاضی را به نحوی بفریبد که در تشخیص جنست آن دو اشتباه کند.

تورینگ نقش بازیکن فریبکار را به ماشین سپرد، و در صورتی که این ماشین موفق شود که قاضی را بفریبد، از آزمون موفق بیرون آمده است و می‌توان آن را ماشین هوشمند نامید.

مشکلات آزمون تورینگ

آزمون تورینگ فرض می‌کند که انسان‌ها می‌توانند با مقایسهٔ میان رفتار ماشین و انسان، پی به میزان هوشمند بودن آن ببرند. به دلیل این فرض، و تعدادی پیش فرض‌های دیگر، دانشمندان حوزهٔهوش مصنوعی صحت آزمون تورینگ را مورد تردید قرار دادند.

اولین نکته‌ای که مطرح می‌گردد این است که تعدادی از رفتارهای انسان هوشمندانه نیستند. به عنوان مثال، توانایی توهین به دیگران، یا اشتباه‌های تایپی مکرر هنگام نوشتن با صفحه کلید.

نکتهٔ دومی که به آن اشاره می‌گردد این است که بعضی از رفتارهای هوشمندانه، انسانی نیستند. به عنوان مثال، کامپیوترها بسیار سریع‌تر از انسان محاسبه می‌کنند.

تورینگ پیشنهاد داده است که ماشین می‌تواند به صورت اتفاقی در خروجی خود اشتباهاتی را وارد کند، یا مدت زمان زیادی را صرف محاسبات کرده و در انتها پاسخی اشتباه دهد که قاضی را بفریبد، تا «بازیکن» بهتری باشد.

منبع


آزمون تورینگ؛ غایتی که در گنجه خاک می‌خورد

آزمون تورینگ چیست و چه کاربردی دارد؟

آزمون تورینگ چیست و چه کاربردی دارد؟
بیش از 60 سال پیش تورینگ در یکی از مشهورترین کارهایش آزمونی را به جامعه هوش مصنوعی پیشنهاد کرد تا به معیاری برای ساخت یک ماشین هوشمند تبدیل شود. تورینگ اعتقاد داشت که اگر ماشینی بتواند خود را از انسان غیرقابل تميز کند، بي‌شك می‌توان برچسب هوشمندبودن را بر آن زد و البته وی بسيار خوش‌بین بود که تا پیش از پایان قرن بیستم، شاهد تولد چنین ماشینی خواهیم بود. اگرچه مي‌توان گفت كه در طول سه دهه بعدی متخصصان از دست‌یابی به چنین هدفی تقریباً ناامید شدند، امروز دنیای هوش مصنوعی اعتقاد دارد که شاید دیگر گذراندن آزمون تورینگ هدف مناسبی برای دنبال کردن نباشد. امروزه بسیاری اعتقاد دارند که در اختیار داشتن یک راهبرد کاربردی و پذیرفتن تفاوت‌های رفتاری کامپیوترها نسبت به انسان‌ها، می‌تواند در موارد بسیاری، مفیدتر از تلاش برای ساخت ماشینی انسان‌نما باشد.

آزمون تورینگ چیست؟

در سال 1950 آلن‌تورینگ در مقاله‌ای با عنوان «ساز و کار رایانش و هوشمندی» برای نخستین‌بار آزمون تورینگ را به جهانیان معرفی کرد. به پیشنهاد تورینگ، این آزمون که می‌توان به آسانی آن را اجرا کرد، مشخص می‌کند که آیا یک ماشین به حد کافی هوشمند است یا خیر. در نسخه ابتدایی تعریف شده توسط تورینگ یک انسان در نقش داور از طریق ترمینالی متنی با یک مجموعه از شرکت‌کنندگان که ترکیبی از انسان‌ها و ماشین‌ها هستند، ارتباط برقرار می‌کند. در صورتی که داور انسانی نتواند شرکت‌کننده ماشین را از شرکت‌کنندگان انسانی تشخیص دهد، آن ماشین از نظر تورینگ شایسته صفت هوشمند است.

توجه داشته باشید که لزومی ندارد ماشین به سؤالات مطرح شده توسط داور پاسخ صحیح دهد، بلکه تنها تقلید رفتار انسانی است که هوشمند بودن یا نبودن ماشین را مشخص می‌کند.
تورینگ مقاله مورد نظر را این گونه آغاز می‌کند: «من پیشنهاد می‌کنم که این پرسش را مد نظر قرار دهید: آیا ماشین‌ها می‌توانند فکر کنند؟» سپس از آنجا که تعریف دقیق تفکر بسیار مشکل است، تورینگ پیشنهاد می‌کند که این پرسش به گونه دیگری مطرح شود‌: «آیا قابل تصور است که کامپیوترهای دیجیتال بتوانند در بازی تقلید، عملکرد مناسبی از خود ارائه دهند؟» پرسشی که به گمان تورینگ دلیلی برای منفی بودن پاسخ آن وجود نداشت. در مورد شرایط دقیق آزمون تورینگ بحث‌های زیادی مطرح است که باعث شده‌ نسخه‌های مختلفی از این آزمون به وجود آید.

نکته اول شیوه انجام این آزمایش است که تقریباً همه اعتقاد دارند که نمی‌توان تنها به یک آزمایش اتکا کرد و باید درصد موفقیت در تعداد زیادی آزمایش محاسبه شود. نکته بعدی در میزان اطلاعات پیش از آزمایش داور است. به عنوان مثال، برخی پیشنهاد کرده‌اند که لزومی ندارد داور بداند یکی از افراد درگیر در آزمایش کامپیوتر است و برخی دیگر اعتقاد دارند که مشکلی با دانستن این موضوع وجود ندارد چرا که در واقع آزمون تورینگ برای توانایی فریب دادن داور طراحی نشده بلکه صرفاً سنجش میزان توانایی ماشین در شبیه‌سازی رفتارهای انسانی مدنظر است.

در اینجا باید به نکته مهمی در رابطه با آزمون تورینگ اشاره کرد. تا قبل از ارائه آزمون تورینگ، دانشمندان فعال در زمینه علوم شناختی و هوش مصنوعی مشکلات فراوانی را برای تعریف دقیق هوشمندی و مشخص‌کردن این‌که چه زمانی می‌توان یک فرآیند را تفکر نامید، تجربه می‌کردند. تورینگ که یک ریاضیدان خبره بود با ارائه آزمون تورینگ در واقع سعی داشت تا از دنیای تعاریف نادقیقی که هضم آن برای حوزه‌های دقیقی مانند علوم کامپیوتر مشکل بود، فاصله گرفته و معیاری مشخص برای میزان هوشمندی ماشین‌ها ارائه کند. دانیل کلمنت دنت، دانشمند علوم شناختی و فیلسوف امریکایی در این رابطه می‌گوید: «هنگامي كه تورینگ، آزمون مورد نظر را برای هوشمندی ماشین‌ها ارائه کرد، هدف وی بنا کردن پلتفرمی برای انجام تحقیقات علمی نبود بلکه وی آزمون تورینگ را به عنوان یک ختم‌الکلام برای بحث‌های مورد نظر در آن زمان ارائه کرد.

در واقع، کلام اصلی تورینگ در مقابل کسانی که اصولاً تعریف هوشمندی برای ماشین را غیرقابل قبول می‌دانستند، این بود که: هر ماشینی که بتواند این آزمون را به صورت عادلانه‌ای پشت سر بگذارد، قطعاً یک موجود هوشمند است و دیگر بحثی در این زمینه باقی نمی‌ماند.» دنت سپس به بحث در مورد هوشمندی در قرن 17 توسط دکارت اشاره می‌کند و متذکر می‌شود که وی نیز روشی مشابه برای تعریف هوشمندی ارائه داده بود که بر‌اساس برقرار‌کردن یک مکالمه با موجود مورد نظر بنا شده بود. در نتیجه تورینگ ادعا نمی‌کند ماشینی که نتواند با ما به شکل درستی مکالمه برقرار کند هوشمند نیست، بلکه صرفاً ادعا دارد اگر ماشینی این توانایی را داشته باشد شکی در هوشمندی آن باقی نمی‌ماند.

تلاش‌های نیمه تمام

از اواسط دهه 1960 بسیاری از افراد فعال در زمینه هوش مصنوعی سعی کردند تا به ساخت ماشین‌هایی روی بیاورند که با در اختیار داشتن توانایی درک زبان انسان و استفاده از اطلاعات گنجانده شده در آن‌ها، بتوانند به گذراندن آزمون تورینگ نزدیک شوند. جوزف وایزنباوم در 1966 برنامه‌ای کامپیوتری با نام الیزا را معرفی کرد که یکی از نخستین نمونه‌های پردازش زبان طبیعی بود. این برنامه قادر بود تا یک مکالمه را با در اختیار داشتن کمترین اطلاعات ممکن نسبت به موضوع مورد بحث پیش ببرد. یکی از مشهورترین موارد پیاده‌سازی شده در الیزا، شبیه‌سازی با عنوان «دکتر» بود که سعی داشت تا نقش یک روانکاو را برای ماشین شبیه‌سازی کند.

پاسخ‌هاي الیزا عموماً بسیار کلی بودند و برای تولید آن‌ها از تکنیک‌های موجود تطابق الگو در آن زمان استفاده می‌شد. وایزنباوم در 1976 در مقاله‌ای با عنوان «قدرت کامپیوتر و استدلال انسان» اشاره کرد که بسیاری از افرادی که با اسکریپت «دکتر» کار کرده‌اند به زودی ارتباط عاطفی قوی‌ با آن برقرار کردند، حتی اصرار داشتند که در هنگام کارکردن با برنامه در اتاق تنها گذاشته شوند. خود وایزنباوم اشاره کرده است که در طول سال‌های استفاده از الیزا مواردی بوده که کاربران در تشخیص انسان نبودن الیزا با مشکل مواجه شده‌اند یا حتی در آن ناکام مانده‌اند. به طور کلی این دیدگاه که الیزا توانسته است آزمون تورینگ را پشت سر بگذارد در جامعه علمی هوش مصنوعی چندان طرفدار ندارد اما به طور حتم این قطعه کد نقش زیادی در پیشرفت شبیه ساختن برنامه‌های کامپیوتری به رفتارهای انسان ایفا کرد.

کنت کولبی در 1972 نمونه‌ای جدیدتر از الیزا را با عنوان «پری» (PARRY) معرفی کرد که در واقع پیاده‌سازی رفتار یک بیمار شیزوفرنیک پارانویا بود. کمی بعد از معرفی پری، این ماشین در یک آزمایش واقعی قرار داده شد تا قدرت آن در گذراندن آزمون تورینگ مشخص شود. در این آزمایش گروهی از روانکاوان باتجربه ترکیبی از بیماران واقعی و نسخه‌های برنامه پری را از طریق یک تله پرینتر مورد بررسی قرار دادند. سپس از یک گروه روانکاو دیگر خواسته شد تا با مشاهده ریز مکالمات مشخص کنند که کدام مورد، مکالمه با ماشین و کدام یک مکالمه با انسان بوده است. در نهایت، روانکاوان گروه دوم تنها در 48 درصد موارد توانستند درست حدس بزنند؛ نتيجه‌اي که تقریباً مشابه سکه انداختن برای تعیین ماشین یا انسان بودن طرف مکالمه است!  توسعه برنامه‌هایی مانند الیزا و پری که در دسته کلی چت بات‌ها قرار می‌گیرند هنوز هم در جای جای دنیا ادامه دارد. چنین برنامه‌هایی که صرفاً قصد شبیه‌سازی یک مکالمه هوشمند را دارند عموماً از دانش خاصی برخوردار نیستند بلکه سعی می‌کنند تا با تکنیک‌های زبانی و البته الگوریتم‌های پیچیده، مکالمه را به شیوه‌ای قابل قبول پیش ببرند؛ مکالمه‌ای که لزوماً خروجی مفیدی برای کاربر ندارد.

چنین برنامه‌هایی هر چند ممکن است در موارد خاصی حتی تا مرز گذراندن آزمون تورینگ نیز پیش روند، اما به دلیل نبود یک دانش ساختاری در درون سیستم، قلمرو بسیار محدودی دارند. تمرکز تحقیقات و نیروی انسانی متخصص حوزه هوش مصنوعی روی ساخت ماشینی که صرفاً بتواند به طریقی آزمون تورینگ را با موفقیت پشت سر گذارد، برای سال‌های متمادی منجر به تحقیقاتی این چنینی شد که هر چند کسی در ارزش بسیار زیاد آن شکی ندارد، اما نمی‌تواند به عنوان بخشی از راه‌حل یک مسئله دنیای واقعی به کار رود.

آیا این هوشمندی است؟

در بیش از شصت سالی که آزمون تورینگ در حوزه هوش مصنوعی حضور داشته است، انتقادات مختلفی به آن وارد شده که بخش بزرگی از آن‌ها بر این موضوع استوار بوده‌اند که آیا این آزمون معیار خوبی برای تشخیص هوشمندی یک سیستم است؟
به عنوان مثال، جان سیرل فیلسوف امریکایی در مقاله‌ای با عنوان «ذهن‌ها، مغزها و برنامه‌ها» در سال1980 آزمایشی ذهنی با عنوان «اتاق چینی» را طراحی کرد که به تعریف هوشمندی مورد نظر حوزه هوش مصنوعی حمله می‌کند.

فرض کنید که شما یک برنامه در اختیار دارید که می‌تواند طوری رفتار کند که زبان چینی را می‌فهمد. این برنامه یک ورودی از کاراکترهای چینی را گرفته و بر‌اساس آن‌ها خروجی متشکل از کاراکترهای چینی تولید می‌کند. همین طور فرض کنید که این برنامه آزمون تورینگ را با موفقیت پشت سر بگذارد. حال در اینجا یک پرسش بزرگ به وجود می‌آید : «آیا این ماشین به‌راستي چینی می‌فهمد یا تنها می‌تواند فهم زبان چینی را شبیه‌سازی کند؟» سیرل بیان می‌کند که اگر وی در اتاقی، مقابل این ماشین قرار بگیرد، می‌تواند با وارد‌کردن هر ورودی چینی در کامپیوتر و یادداشت‌کردن خروجی برنامه روی یک تکه کاغذ آزمون تورینگ را با موفقیت پشت سر بگذارد. وی سپس اشاره می‌کند که فرقی میان نقش ماشین در حالت اول و نقش وی در حالت دوم وجود ندارد و از آنجایی که وی یک کلمه چینی نمی‌فهمد، در نتیجه ماشین نیز درکی از زبان چینی ندارد. در نهایت وی نتیجه می‌گیرد که بدون درک شیوه عملکرد کامپیوتر و تنها از روی مشاهده رفتار آن نمی‌توان نتیجه گرفت که کاری که ماشین انجام می‌دهد فکر کردن است.

دیدگاه جان سیرل از طرف دانشمندان علوم شناختی مورد انتقادات فراوانی قرار گرفته است. از جمله این انتقادات می‌توان به این نکته اشاره کرد که ممکن است فرد به صورت خاص زبان چینی را نفهمد اما سیستم به صورت یک کل توانایی فهم زبان چینی را دارد و نمی‌توان توانایی فهم انسان به عنوان بخشی از این سیستم را از کل جدا کرد. هر چند آزمایش «اتاق چینی» مورد انتقادات فراوانی قرار گرفته و نمی‌تواند به عنوان یک خطر جدی برای آزمون تورینگ تلقی شود، اما با مشاهده چنین دیدگاه‌هایی کاملاً مشخص می‌شود که چرا پیاده‌سازی ایده آزمون تورینگ در دنیای واقعی تا این اندازه مشکل است.

دسته دیگری از انتقادات به این موضوع اشاره دارند که میزان تقلید از رفتارهای انسانی لزوماً معیار خوبی برای هوشمندی نیست. چرا‌که نه تمام رفتارهای انسانی هوشمندانه است و نه تمام رفتارهای هوشمندانه انسانی است. این که تا چه حد این جمله را قبول دارید، می‌تواند موضوع خوبی برای یک بحث فلسفی طولانی باشد و البته بعید است به نتیجه مشخصی برسد. به عنوان مثال، ابرکامپیوتر دیپ‌بلو ساخت آی‌بی‌ام را در نظر بگیرید که در دهه 1990 موفق شد گری کاسپاروف استاد مسلم شطرنج جهان را شکست دهد. دیپ بلو طبیعتاً نمی‌تواند در مکالمه با انسان همراهی کند اما به خوبی وی (حتی بهتر از او) شطرنج بازی می‌کند. آیا این ماشین کمتر از الیزا هوشمند است؟ جواب از نظر بسیاری خیر است. اما باز هم باید توجه داشت که تورینگ به هیچ عنوان ادعا نمی‌کند عدم تقلید از انسان به معنای عدم هوشمندی است.

این که آیا تقلید از رفتار انسان واقعاً نشان‌دهنده هوشمندی است یا خیر، هنوز مورد بحث و بررسی است. به‌عبارتي، هنوز هم تعریف دقیقی برای هوشمندی در اختیار نداریم و همین موضوع باعث می‌شود تا نتوان در این مورد استدلال چندان قابل قبولی ارائه داد. به هر روی، ما امروز می‌دانیم که رفتار هوشمندانه و رفتار انسانی ممکن است لزوماً به یک معنی نباشند. همچنین آگاه هستیم که برای گذراندن آزمون تورینگ، آشنایی ماشین به جزئیات و قوانین زبان انسانی به همان اندازه اهمیت دارد که دانش و استدلال گنجانده شده در آن ارزشمند است. خبر نه‌چندان امیدوار کننده، این است که با وجود پیشرفت‌های فراوان حوزه یادگیری زبان و زبان‌شناسی، فرآیند دقیقی که باعث می‌شود انسان‌ها در یادگیری یک زبان به چنین درجه‌ای از تبحر دست‌یابند، به طور دقیق برای دانشمندان مشخص نیست. حتی از تمام این موارد که بگذریم، مسئله‌‌ای بسیار مهم‌تر مطرح می‌شود و آن این است که آیا اصولاً گذراندن یا نگذراندن آزمون تورینگ تا این حد مسئله مهمی است؟ دنیای نوین هوش مصنوعی اعتقاد دارد که پاسخ این پرسش منفی است. در ادامه مقاله مي‌كوشيم تا تصویری از وضعیت آزمون تورینگ در دنیای امروز ترسیم کنيم.

وقتی انسان آن‌قدرها هم جذاب نیست

استیون لوی در سال 2010 در مقاله‌ای با عنوان «انقلاب هوش مصنوعی آغاز شده است» نگاه متفاوتی را نسبت به دنیای هوش مصنوعی در روزگار نوین ارائه می‌دهد. نگاهی که البته لوی با بسیاری از صاحب‌نظران دیگر به اشتراک می‌گذارد. وی در ابتدا به سیستم اداره انبار Diapers.com که به صورت کامل توسط روبات‌ها انجام می‌شود اشاره مختصری کرده و متذکر می‌شود که اداره این سیستم با سازماندهی فعلی برای انسان‌ها تقریباً غیرممکن است. سپس ادامه می‌دهد «روبات‌های به کار گرفته شده در این انبار خیلی باهوش نیستند. آن‌ها توانایی حتی نزدیک به هوش انسانی را نیز در اختیار نداشته و به‌طور قطعی نمی‌توانند آزمون تورینگ را با موفقیت پشت سر بگذارند. اما آن‌ها نمایانگر نگاه جدیدی در حوزه هوش مصنوعی هستند. هوش مصنوعی امروز تلاش نمی‌کند تا مغز را بازسازی کند. بلکه در مقابل این حوزه، از یادگیری ماشین، دیتاست‌های عظیم، حسگرهاي پیشرفته و الگوریتم‌های پیچیده استفاده کرده تا کارهای گسسته را به نحو احسن انجام دهد. مثال‌های این امر در همه حوزه‌ها مشهود است. ماشین‌های گوگل پرس‌وجو‌های پیچیده انسانی را تفسیر می‌کنند. شرکت‌های کارت اعتباری از هوش مصنوعی برای تشخیص کلاه‌برداری سود می‌برند. نت فلیکس با استفاده از آن،‌ سعی می‌کند ذائقه مشترکانش را حدس زده و فیلم‌های مورد علاقه‌شان را به آنان پیشنهاد کند و سرانجام، سیستم مالی از هوش مصنوعی برای مدیریت میلیاردها داد و ستد استفاده می‌کند (که تنها گه‌گاهی از هم می‌پاشد!).»

لوی سپس با اشاره به زمستان هوش مصنوعی که باعث متوقف شدن مقطعی پیشرفت‌ها در حوزه هوش مصنوعی و «مرگ هدف اولیه» شد، می‌گوید: «اما این باعث شد تا یک هدف جدید متولد شود؛ ماشین‌ها ساخته شده‌اند تا کارهایی را انجام دهند که انسان‌ها نمی‌توانند هیچ گاه از عهده آن‌ها برآیند.» همان‌طور که لوی به‌درستی اشاره می‌کند ساخت سیستم‌های منطقی که بتوانند شیوه تفکر انسان را به‌طور کامل شبیه‌سازی کرده و با استفاده از اصول منطقی ساده یک ماشین هوشمند را تشکیل‌دهند، کاری است که محققان در خلال دهه‌های 1960 و 1970 انجام آن را خیلی سخت‌تر از آن چیزی که تصور می‌شد، یافتند. در مقابل، تحقیقات جدیدتر حوزه هوش مصنوعی بخش دیگری از حقیقت را نمایان ساخت. منطق کارکرد کامپیوترها ممکن است با آنچه انسان‌ها از تفکر منطقی انتظار دارند کاملاً متفاوت باشد. یکی از حوزه‌هایی که مانور اصلی خود را بر این حقیقت استوار کرده، الگوریتم‌های احتمالاتی هستند.

با پیشرفت قدرت محاسباتی کامپیوترها، دانشمندان بیش از هر زمان دیگری، نسبت به الگوریتم‌هایی که المان‌های تصادفی را شامل می‌شوند، علاقه نشان می‌دهند. ترکیب این الگوریتم‌ها با قدرت محاسباتی امروز عموماً پاسخ‌هایی «به حد کافی مناسب» را برای مسئله‌های پیچیده‌ای که حل آن‌ها دور از دسترس بود، ارائه می‌دهد. به عنوان مثال، الگوریتم‌های ژنتیک را در نظر بگیرید. در چارچوب این الگوریتم‌ها ماشین با یک ساختار منطقی گام‌به‌گام و استدلال‌های پیچیده مواجه نمی‌شود بلکه صرفاً یک سیستم بازخورد از تعدادی جواب‌ها را در اختیار گرفته و سعی می‌کند تا رفتار درست را بر‌اساس ورودی انسانی پیدا کند. چنین روش‌های استدلالی از عهده انسان‌ها خارج است. ما برای خروج از یک وضعیت نامطلوب نمی‌توانیم میلیون‌ها راه را آزمون کنیم بلکه عموماً سعی می‌کنیم تا با استفاده رشته‌ای از تفکرات پیچیده، راه خروج را به صورت مکاشفه‌ای (Heuristic) پیدا کنیم. در مقابل ماشین‌ها می‌توانند منطق دیگری را دنبال کنند و آن انجام آزمون و خطا در مقیاس میلیونی است. شاید تصور بسیاری بر این باشد که راهبرد اول نسبت به راهبرد دوم از ارزش بیشتری برخوردار است. از جهاتي نمي‌توان به این دیدگاه اعتراضی داشت، اما به‌نظر مي‌رسد تا زمانی که یک راهبرد می‌تواند پاسخ مناسبی را در مدت زمانی کوتاه در اختیار ما قرار دهد، انتقاد از آن چندان محلی از اعراب ندارد.

راسل و نوریگ نویسندگان مشهورترین کتاب درسی در زمینه هوش مصنوعی نیز دیدگاهی به نسبت نزدیک به دیدگاه لوی را در این زمینه ارائه می‌کنند. آن‌ها اعتقاد دارند که شبیه‌سازی واقعي هوش  انسان مسئله‌ای بسیار مشکل است که نیازی نیست به عنوان هدف اولیه تحقیقات هوش مصنوعی در نظر گرفته شود. هر‌چند در بسیاری از فناوری‌های امروز تطبیق فناوری با رفتارها و عادت‌های انسانی به عنوان یکی از برگ‌های برنده فناوری مورد نظر به شمار می‌رود (نگاهی به آی‌فون و آی‌پد بیاندازید) اما لزوماً راه ساخت یک ماشین هوشمند، از شبیه‌سازی رفتار انسانی نمی‌گذرد (همان‌طور که بارها در طول مقاله ذکر شد، تورینگ خود نیز چنین عقیده‌ای نداشت). راسل و نوریگ برای این موضوع آنالوژی جالبی ارائه می‌دهند‌: «هواپیماها با توجه به میزان کیفیت پروازشان آزمایش می‌شوند و نه شبیه بودنشان به پرندگان. متون هوافضا هدف حوزه‌شان را “ساخت ماشین‌هایی که آن قدر شبیه کبوترها پرواز کنند که بتوانند کبوترهای دیگر را فریب دهند” بیان نمی‌کنند.»

آزمون تورینگ چیست؟ قسمت 1
آزمون تورینگ چیست؟ قسمت 2

مقدمه ای بر سیستمهای خبره

سیستم خبره چیست؟

مقدمه ی آموزش سیستم های خبره و هوش مصنوعی
اولین قدم در حل هر مسئله ای تعریف دامنه یا محدوده آن است.  این نکته همانطور که در مورد روشهای برنامه نویسی متعارف صحت دارد، در مورد هوش مصنوعی نیز درست است. اما به خاطر اسراری که از قبل در مورد هوش مصنوعی ( AI ) وجود داشته، هنوز هم برخی مایلند این عقیده قدیمی را باور کنند که ” هر مسئله ای که تا به حال حل نشده باشد یک مسئله هوش  مصنوعی  است”. تعریف متداول دیگری به این صورت وجود دارد ” هوش مصنوعی کامپیوترها را قادر می سازد که کارهایی شبیه به آنچه در فیلمها دیده می شود انجام دهند”.چنین تفکراتی در دهه ۱۹۷۰ میلادی رواج داشت، یعنی درست زمانی که هوش مصنوعی در مرحله تحقیق بود ولی امروزه مسائل واقعی بسیاری وجود دارند که توسط هوش مصنوعی و کاربردهای تجاری آن قابل حلند.

اگرچه برای مسائل کلاسیک هوش مصنوعی از جمله ترجمه زبانهای طبیعی، فهم کلام و بینایی هنوز راه حل عمومی یافت نشده است، ولی محدود کردن دامنه مسئله می تواند به راه حل  مفیدی منجر شود. به عنوان مثال، ایجاد یک « سیستم زبان طبیعی ساده » که ورودی آن جملاتی با ساختار اسم، فعل و مفعول باشد کار مشکلی نیست. در حال حاضر، چنین سیستمهایی به عنوان یک واسط در ایجاد ارتباط کاربر پسند با نرم افزارهای بانک اطلاعاتی و صفحه گسترده ها به خوبی عمل  می کنند. در حقیقت (پاره) جملاتی که امروزه در برنامه های کامپیوتری مخصوص بازی و سرگرمی به کار می روند توان بالای کامپیوتر در فهم زبان طبیعی را به نمایش می گذارند.

هوش مصنوعی شامل چندین زیر مجموعه است. زیر مجموعه سیستمهای خبره یکی از موفق ترین راه حلهای تقریبی برای مسائل کلاسیک هوش مصنوعی است. پروفسور فیگن بام از دانشگاه استانفورد یکی از پیشکسوتان تکنولوژی سیستم های خبره، تعریفی در مورد سیستمهای خبره دارد : « … یک برنامه کامپیوتری هوشمند که از دانش و روشهای استنتاج برای حل مسائلی استفاده می کند که به دلیل مشکل بودن، نیاز به تجربه و مهارت انسان » (Feigenbaum 82 ). بنابراین سیستم خبره یک سیستم کامپیوتری است که از قابلیت تصمیم گیری افراد خبره، تقلید می نماید. لغت تقلید به این معناست که سیستم خبره سعی دارد در تمام جنبه ها شبیه فرد خبره عمل  کند. عمل تقلید از شبیه سازی قوی تر است چون در شبیه سازی تنها در بعضی موارد شبیه چیزهای واقعی عمل می شود.

اگرچه هنوز یک برنامه چند منظوره برای حل مسائل ایجاد نشده است، ولی سیستمهای خبره در محدوده های خاص به خوبی عمل می کنند. برای اثبات موفقیت سیستمهای خبره فقط کافی است که کاربردهای متعدد سیستمهای خبره را در تجارت، پزشکی، علوم مهندسی ملاحظه نمود و یا کتابها، مجلات، سمینارها و محصولات نرم افزاری اختصاص یافته به سیستمهای  خبره را مشاهده کرد.

سیستمهای خبره یکی از شاخه های هوش مصنوعی است که همچون یک فرد خبره با استفاده وسیع از دانش تخصصی به حل مسائل می پردازد. فرد خبره کسی است که در یک زمینه خاص دارای تجربه و مهارت و در یک کلامخبرگی است. بنابراین فرد خبره دارای دانش یا مهارت خاصی است که برای بیشتر مردم ناشناخته و یا غیر قابل دسترسی است. فرد خبره مسایلی را حل می کند که یا توسط دیگران قابل حل نیست و یا او مؤثرترین ( و البته نه ارزانترین) راه حل را برای آن مسئله ارائه می دهد. وقتی سیستمهای خبره اولین بار در دهه ۱۹۷۰ توسعه یافتند، فقط دارای دانش خبرگی بودند. ولی لغت سیستم خبره امروزه اغلب به هر سیستمی اطلاق می شود که از تکنولوژی سیستم خبره استفاده می کند. این تکنولوژی می تواند شامل زبانهای خاص سیستمهای خبره، برنامه ها و سخت افزارهای طراحی شده برای کمک به توسعه و اجرای سیستمهای خبره باشد.

دانش موجود در سیستمهای خبره می تواند شامل تجربه و یا دانشی باشد که از طریق کتب، مجلات و افراد دانشمند قابل دسترسی است. اصطلاحات سیستم خبره، سیستم مبتنی بر دانش و یا سیستم خبره مبتنی بر دانش، به طور مترادف به کار می روند. بیشتر مردم از اصطلاح سیستم خبره به دلیل کوتاه بودنش استفاده می کنند. این در حالی است که ممکن است حتی در آن سیستم خبره هیچ تجربه و مهارتی وجود نداشته و فقط شامل دانش عمومی باشد.

شکل ۲-۱ مفهوم بنیانی یک سیستم خبره مبتنی بر دانش را نشان می دهد. کاربر حقایق (یا وقایع) و یا سایر اطلاعات را به سیستم خبره داده و در پاسخ، تجربه، تخصص و توصیه های عالمانه و در یک کلام خبرگی دریافت می کند. از نظر ساختار داخلی، سیستم خبره از دو بخش اصلی تشکیل می شود. بخش اول پایگاه دانش است. این پایگاه حاوی دانشی است که بخش دوم یعنی موتور استنتاج به کمک آن نتیجه گیری می کند. این نتایج، پاسخ سیستم خبره به سوالات کاربر می باشد.

سیستمهای مبتنی بر دانش کارا طوری طراحی شده اند که بتواند به عنوان یک دستیار هوشمند برای افراد خبره عمل کنند. این دستیاران هوشمند به وسیله تکنولوژی سیستمهای خبره طراحی شده اند و دلیل این کار، امکان بسط دانش آنها در آینده می باشد. هر چه دانش بیشتری به یک سیستم دستیار هوشمند اضافه شود، بیشتر شبیه به یک فرد خبره عمل می کند. توسعه یک سیستم دستیار هوشمند می تواند مرحله مهمی در ایجاد یک سیستم خبره کامل باشد. بعلاوه یک دستیار هوشمند می تواند با سرعت بخشیدن به حل مسئله، وقت فرد خبره را آزاد کند. معلمین هوشمند یکی دیگر از کاربردهای هوش مصنوعی هستند. بر خلاف سیستمهای قدیمی آموزش به کمک کامپیوتر، سیستمهای جدید می توانند بسته به زمینه و مفهوم، آموزش یا راهنمایی ارائه دهند (Giarratano 91a).

بر خلاف دانش مربوط به تکنیکهای حل مسایل عمومی، دانش یک فرد خبره حوزه مند است یعنی محدود به یک دامنه خاص است. دامنه یک مسئله، نشاندهنده حوزه خاصی همچون حوزه پزشکی، مالی، علوم و یا مهندسی است که یک فرد خبره می تواند مسایل آن را به خوبی حل کند. سیستمهای خبره طوری طراحی شده اند که مثل افراد خبره در یک حوزه خاص، مهارت داشته باشند. به عنوان مثال شما معمولا انتظار ندارید که یک متخصص شطرنج، در زمینه مسایل پزشکی نیز دانش تخصصی داشته باشد. تخصص داشتن در یک حوزه خاص، به خودی خود، منجر به تخصص داشتن در حوزه های دیگر نمی شود.

دانش یک فرد خبر درباره حل یک مساله خاص، حوزه دانش فرد خبره نامیده می شود.

طراحی سیستمهای خبره

انتخاب مسئله مناسب

قبل از اینکه شما یک سیستم خبره بسازید باید یک مسئله مناسب انتخاب کنید. مانند هر پروژه نرم افزاری، قبل از اینکه خود را درگیر تعهدات زیادی نسبت به افراد، منابع و زمان برای یک سیستم خبره پیشنهادی نماییم، باید بعضی ملاحظات کلی را در نظر داشته باشیم. هر چند این ملاحظات کلی در مدیریت پروژه هر برنامه معمولی نیز وجود دارد ولی باید به منظور پاسخگویی به نیازهای خاص سیستمهای خبره، آنها را اختصاصی کرد. نوعی نگرش اجمالی و از  بالا به مدیریت ایجاد سیستم خبره در شکل ۶-۱ نشان داده شده است. سه مرحله کلی که در شکل ۱-۶ نشان داده شده دارای ملاحظات تخصصی تری هستند که در بخش ۳-۶ بحث شده است. همچنین برخی ملاحظات تخصصی تر به صورت پرسش و پاسخ مطرح خواهند گردید تا به صورت یک مجموعه راهنماییها برای پروژه های سیستمهای خبره در آیند.

انتخاب الگوی مناسب

چرا ما یک سیستم خبره می سازیم؟

عواید سیستم

سیستم خبره چه عوایدی دارد؟

این سوال با سوال اول در ارتباط است. ولی از آنجا که این سوال به دنبال دانستن میزان بازگشت سرمایه بوده یعنی با لزوم بازگشت مخصوص سرمایه افراد، منابع، زمان و پول مورد نیاز در ارتباط است از سوال اولی عملی تر است. عواید سیستم ممکن است به صورت پول، افزایش کارایی و یا هر یک از مزایای سیستمهای خبره باشد همچنین یادآوری این نکته لازم است که اگر کسی از سیستم استفاده نکند آن سیستم هیچ عایدی نداشته است. از آنجا که سیستم خبره یک فن آوری نوین است پاسخ دادن به این سؤال در مقایسه با برنامه کامپیوتری معمولی بسیار دشوارتر و پر مخاطره تر است.

ابزارها

چه ابزارهایی برای ساخت سیستم در دسترس داریم؟

امروزه تعداد زیادی ابزار سیستم ذخیره در دسترس وجود دارد که هر یک مزایا و معایبی دارند. به دلیل توسعه سریع ابزارهای نرم افزاری معرفی یک لیست بهنگام از ابزارها کار دشواری است. به راحتی می توان دید که ابزارهای موجود هر ساله ارتقاء یافته و بعضا در طول دو تا سه سال کاملا بازنگری می شوند.

این ارتقا، فقط به ابزارهای نرم افزاری محدود نمی شود. بسیاری از ابزارهای دارای جدیدترین فن آوریها که در اواسط دهه ۱۹۸۰ فقط بر روی ماشینهای لیسپ ۰۰۰/۵۰ دلاری کار می کرد بعدها برای اجرا بر روی ریز کامپیوترها و ریزپردازنده های سفارشی بازنویسی گردید. این موضوع باعث شد قیمت سخت افزارهای بکار گیرنده این ابزارها بسیار کاهش یابد. بهترین راهنمایی برای انتخاب ابزار، بررسی مقالات روز و گفتگو با سازندگان سیستمهای خبره است.

هزینه

این کار چه میزان هزینه در برخواهد داشت؟

هزینه ساخت یک سیستم خبره بستگی به افراد، منابع و زمان تخصیص یافته برای ساخت آن دارد. علاوه بر سخت افزار و نرم افزار لازم برای اجرای یک ابزار سیستم خبره، ممکن است هزینه قابل توجهی نیز صرف آموزش آن شود. اگر پرسنل شما در خصوص کار با یک ابزار، کم تجربه یا بی تجربه باشند، آموزش آنها پر هزینه خواهد بود. به عنوان مثال آموزش یک ابزار سیستم خبره که دربردارنده آخرین تکنولوژی است ممکن است ۲۵۰۰ دلار در هفته برای هر نفر هزینه در بر داشته باشد.

سیستم خبره قسمت 1
سیستم خبره قسمت 2
سیستم خبره قسمت 3
سیستم خبره قسمت 4
سیستم خبره قسمت 5
سیستم خبره قسمت 6

مدل سیستم خبره

یک مدل سیستم خبره مشتمل بر چهار بخش اصلی است:

پایگاه دانش (Knowledge Base)

    1. موتور استنتاج (Inference Engine)
    2. امکانات توضیح (Explanation Facilities)
    3. رابط کاربر (User Interface)

پایگاه دانش (Knowledge Base)

محلی است که دانش خبره به صورت کدگذاری شده و قابل فهم برای سیستم ذخیره می‌شود. با این توصیف دو اصطلاح زیر تعریف می‌شود:

— شیء (Object): منظور از شیء در اینجا نتیجه‌ای است که با توجه به قوانین مربوط به آن تعریف می‌گردد.
— شاخص (Attribute): منظور از شاخص یا «صفت» یک کیفیت ویژه است که با توجه به قوانینی که برای آن در نظر گرفته شده است به شما در تعریف شیء یاری می‌دهد.

بنابراین می‌توان پایگاه دانش را به صورت لیستی از اشیاء که در آن قوانین و شاخص‌های مربوط به هر شیء نیز ذکر شده است در نظر گرفته شود.
در ساده‌ترین حالت (که در اکثر کاربردها نیز همین حالت بکار می‌رود) قانونی که به یک شاخص اعمال می‌شود این مطلب را بیان می‌کند که آیا شیء مورد نظر شاخص دارد یا ندارد؟
یک سیستم متخصص که انواع مختلف میوه را شناسایی می‌کند احتمالاً دارای بانک اطلاعاتی به صورت زیر خواهد بود:

شیء قانون شاخص
سیب دارد روی درخت رشد می‌کند.
دارد گرد است
دارد رنگ قرمز یا زرد است
ندارد در کویر رشد می‌کند

بانک ساده شده بالا، تنها با استفاده از قانون <<دارد>>:

شیء شاخص‌هایی که دارد
سیب رشد روی درخت
سیب گرد بودن
سیب رنگ قرمز یا زرد
سیب رشد نکردن در کویر

به کسی که دانش خبره را به صورت کدگذاری شده درمی‌آورد، مهندس دانش گفته می‌شود. به طور کلی دانش به صورت عبارات شرطی و قواعد در پایگاه دانش ذخیره می‌گردد.

فریمها(Minsky(1975، و پس از آن هستان شناسی‌ها از روشهای مدرن جهت ارائه دانش در سیستم‌های خبره‌اند.

موتور استنتاج (Inference Engine)

حتی زمانی که قلمرو دانش را با قوانین نمایش می‌دهیم، باز هم یک فرد خبره باید مشخص کند که کدام قوانین را برای حل مسئله خاصی به کار می‌برد. علاوه بر این باید مشخص کند که این قوانین را در چه رده‌ای به کار می‌برد. به طور مشابه یک سیستم خبره نیاز خواهد داشت تا تصمیم بگیرد که چه قانونی و در چه مورد و رده‌ای باید برای ارزیابی انتخاب شود.

دستگاه استنتاج در واقع قلب یک سیستم خبره است. یک نظام پیچیده که قواعد استنتاج را که به صورت مجموعه‌ای از قواعد “اگر … پس …” برای یافتن پاسخ یا قضاوت نهایی به کار می‌گیرد چیزی که سیستم خبره را سیستم خبره می‌کند روشی است که این قواعد براساس آن مورد پردازش قرار می‌گیرند. دستگاه استنتاج برای رسیدن به قضاوت می‌تواند به دو صورت عمل کند و در واقع ازسلسله مراتب قواعد استدلال به دو طریق عبور کند یکی از دو شیوه روش استدلال پیش رو است که از داده‌ها شروع می‌کند و به نتیجه می‌رسد یعنی با درنظر گرفتن داده‌های مربوط به موضوع مورد سؤال از (اگر)ها شروع کرده و به نتایج یا (پس)های مناسب می‌رسد به عبارت دیگر در زنجیره پیش رو از مقدمات به نتایج می‌رسیم، روش دوم استنتاج آن است که از نتایج شروع می‌کند و برای چنان نتایج مشخص به دنبال مقامات یا شرایط اولیه مناسب می‌گردد به عبارت دیگر نقطه شروع (پس)ها هستند و از آن‌ها به (اگر)ها دست می‌یابد. روش اول استنتاج را روش مبتنی بر داده و روش دوم را روش مبتنی بر هدف می‌خوانند.

امکانات توضیح (Explanation Facilities)

برای نشان دادن مراحل نتیجه‌گیری سیستم خبره برای یک مسئله خاص با واقعیات خاص به زبان قابل فهم برای کاربر به کار می‌رود. این امکانات این فایده را دارد که کاربر با دیدن مراحل استنتاج اطمینان بیشتری به تصمیم گرفته شده توسط سیستم خواهد داشت؛ و خبره‌ای که دانش او وارد پایگاه دانش شده است اطمینان حاصل خواهد کرد که دانش او به صورت صحیح وارد پایگاه دانش شده است.

رابط کاربر

منظور از رابط کاربر، مجموعه‌ای از تجهیزات و نرم‌افزارها است که به صورت کانال ارتباط کاربر و سیستم خبره عمل می‌کند یعنی به کاربر امکان ارایه اطلاعات مربوط به مسئله مورد نظر را به سیستم می‌دهد و از طرف دیگر استنتاجات سیستم را در اختیار کاربر می‌گذارد.

واسط کاربر یک سیستم خبره طبیعتاً باید از قدرت تبادلی بالایی برخوردار باشد تا ساختار تبادل اطلاعات به شکل گفتگوی یک متقاضی و یک انسان خبره صورت گیرد.

مزایای یک سیستم خبره چیست؟

میزان مطلوب بودن یک سیستم خبره اصولاً به میزان قابلیت دسترسی به آن و میزان سهولت کار با آن بستگی دارد.

مزایای سیستم‌های خبره را می‌توان به صورت زیر دسته‌بندی کرد:

    • افزایش قابلیت دسترسی: تجربیات بسیاری از طریق کامپیوتر دراختیار قرار می‌گیرد و به طور ساده‌تر می‌توان گفت یک سیستم خبره، تولید انبوه تجربیات است.
    • کاهش هزینه:تجربیات بسیاری از طریق کامپیوتر دراختیار قرار می‌گیرد و به طور ساده‌تر می‌توان گفت یک سیستم خبره، تولید انبوه تجربیات است
    • کاهش خطر: سیستم خبره می‌تواند در محیط‌هایی که ممکن است برای انسان سخت و خطرناک باشد نیز بکار رود.
    • دائمی بودن: سیستم‌های خبره دائمی و پایدار هستند. به عبارتی مانند انسان‌ها نمی‌میرند و فنا ناپذیرند.
    • تجربیات چندگانه: یک سیستم خبره می‌تواند مجموع تجربیات و آگاهی‌های چندین فرد خبره باشد.
    • افزایش قابلیت اطمینان: سیستم‌های خبره هیچ وقت خسته و بیمار نمی‌شوند، اعتصاب نمی‌کنند یا علیه مدیرشان توطئه نمی‌کنند، درصورتی که اغلب در افراد خبره چنین حالاتی پدید می‌آید.
    • قدرت تبیین (Explanation): یک سیستم خبره می‌تواند مسیر و مراحل استدلالی منتهی شده به نتیجه‌گیری را تشریح نماید. اما افراد خبره اغلب اوقات به دلایل مختلف (خستگی، عدم تمایل و…) نمی‌توانند این عمل را در زمان‌های تصمیم‌گیری انجام دهند. این قابلیت، اطمینان شما را در مورد صحیح بودن تصمیم‌گیری افزایش می‌دهد.
    • پاسخ‌دهی سریع:سیستم‌های خبره، سریع و دراسرع وقت جواب می‌دهند.
    • پاسخ‌دهی در همه حالات: در مواقع اضطراری و مورد نیاز، ممکن است یک فرد خبره به خاطر فشار روحی یا عوامل دیگر، صحیح تصمیم‌گیری نکند ولی سیستم خبره این معایب را ندارد.
    • پایگاه تجربه: سیستم خبره می‌تواند همانند یک پایگاه تجربه عمل کند و انبوهی از تجربیات را در دسترس قرار دهد.
    • آموزش کاربر(Intelligent Tutor): سیستم خبره می‌تواند همانند یک خودآموز هوش عمل کند. بدین صورت که مثال‌هایی را به سیستم خبره می‌دهند و روش استدلال سیستم را از آن می‌خواهند.
    • سهولت انتقال دانش: یکی از مهمترین مزایای سیستم خبره، سهولت انتقال آن به مکان‌های جغرافیایی گوناگون است. این امر برای توسعه کشورهایی که استطاعت خرید دانش متخصصان را ندارند، مهم‌است.

مثال‌هایی از سیستم‌های خبره تجاری:

    • MYCIN : اولین سیستم متخصص موفق جهان بود که در سال ۱۹۷۰ در دانشگاه استنفورد طراحی شد. هدف از ساخت این سیستم کمک به پزشکان در تشخیص بیماری‌های ناشی از باکتری بود. مشکل عمده در تشخیص بیماری برای یک پزشک آن است که تشخیص سریع و قاطع یک بیماری با توجه به تعداد بسیار زیاد بیماری موجود، عملی دشوار است.MYCIN با تشخیص دادن قاطع بیماری‌ها توانست که این نیاز را برآورده سازد.
    • PROSPECTOR: یک متخصص در امر زمین‌شناسی است که احتمال وجود رسوبات معدنی در یک ناحیه بخصوص را پیش بینی می‌کند. این سیستم در سال ۱۹۸۷ توسط «ریچارد دودا» و «پیتر هارد» و «رنه ربو» ساخته شد.

در اوایل دهه ۸۰ سیستم‌های متخصص به بازار عرضه شد که می‌توانستند مشورت‌های مالیاتی، توصیه‌های بیمه‌ای یا قانونی را به استفاده کنندگان خود ارائه دهند.

مشخصه‌های سیستم خبره

    1. جداسازی دانش از کنترل – یک سطح پایین‌تر این مبحث، در پایگاه داده قابل مشاهده است. در پایگاه داده سعی بر این است که داده‌ها از رویه‌های پیاده‌سازی شونده روی داده‌ها، مجزا باشند. مزیت این جداسازی این است که تعمیم یافتگی در سیستم، افزایش می‌یابد.
    2. برخورداری از دانش خبره و تخصصی
    3. تمرکز بر روی تخصص‌های خاص و ویژه
    4. استدلال با نمادها
    5. استدلال هیوریستیک و تجربی – استدلالی که بر اثر تجربه به دست می‌آید.
    6. قابلیت استدلال نادقیق – یعنی با قوانین احتمالی هم استدلال نماید. سیستم خبره باید بتواند در محیط‌هایی که اطلاعات نادقیق است(کامل نیست) استدلال کند. این استدلال می‌تواند اشتباه باشد چون اطلاعات کامل نیست. مثلاً پزشکی را در نظر بگیرید که تجربه داردو تازه‌کار هم نیست، ولی زمانی که وضعیت بحرانی پیش می‌آید بااید بتواند با اطلاعات کم، بهترین تصمیم را بگیرد.
    7. محدودیت نسبت به مسائل قابل حل – تنها مسائل قابل حل، توسط سیستم‌های خبره، قابل پیاده‌سازی باشد. تا مسئله‌ای حل نشده باشد، سیستم خبره نمی‌تواند به آن پاسخ دهد. باید یک فرد خبره‌ای باشد که اطلاعات از او گرفته شده و در سیستم قرار داده شود.
    8. مناسب بودن سیستم خبره از نظر پیچیدگی – مسائل سیستم خبره نباید خیلی سخت و نه خیلی راحت باشد.
    9. احتمال اشتباه – ممکن است سیستم خبره در تعیین راه‌حل دچار مشکل شود.

منبع


سیستم های خبره

سیستم های خِبره یا سیستم‌های خِبره (Expert systems) به دسته‌ای خاص از نرم‌افزارهای رایانه‌ای اطلاق می‌شود که در راستای کمک به کاردانان و متخصّصان انسانی و یا جایگزین جزئی آنان در زمینه‌های محدود تخصّصی تلاش دارند. اینگونه سیستم ها، در واقع، نمونه‌های آغازین و ساده‌تری از فناوری پیش‌رفته‌تر سیستم های دانش-بنیان به شمار می‌آیند. تیم ما توانایی اجرا و پیاده سازی انواع سیستم های خبره را دارد.

اگر بخواهیم سیستم‌های خبره را در یک جمله توصیف کنیم باید بگوییم که این سیستم‌ها به‌طور کلی برنامه‌هایی هستند که قادرند همانند انسان مسایل خاصی را استدلال کنند. این سیستم‌ها برای استدلال، از الگوهای منطقی خاصی استفاده می‌کنند که مشابه همان کاری است که انسان در زمان حل یک مسئله عمل می‌کند. در واقع همان‌طور که انسان برای حل یک مسئله، تعقل یا اندیشه می‌کند، سیستم‌های خبره نیز برای این کار به الگوها و راه و روش‌هایی متوسل می‌شوند که انسان برای آن‌ها مشخص کرده است، بنابراین چون از منطق بشری استفاده می‌کنند می‌توان گفت که تا حدودی همانند انسان فکر می‌کنند.

سیستم های خبره در زمینه‌های بسیار متنوعی کاربرد یافته‌اند که برخی از این زمینه‌ها عبارتند از پزشکی، حسابداری، کنترل فرایندها، منابع انسانی، خدمات مالی، و GIS. حسابداری، تجزیه و تحلیلهای مالی پزشکی (تشخیص بیماری)، آنژیوگرافی، باستان شناسی، تولید ویفرهای سیلیکونی و انواع خاصی از پرتونگاری در زمینه‌های مختلف دیگری نیز سیستمهای خبره پدید آمده‌اند همانند: مشاوره حقوقی، مشاوره برای انتخاب بهترین معماری یا ترکیب بندی سیستم کامپیوتری، مشاوره مهندسی ساختمان و غیره.

در هر یک از این زمینه‌ها می‌توان کارهایی از نوع راهنمایی، پردازش، دسته‌بندی، مشاوره، طراحی، تشخیص، کاوش، پیش بینی، ایجاد مفاهیم، شناسایی، توجیه، یادگیری، مدیریت، واپایش، برنامه‌ریزی، زمان‌بندی و آزمایش را با مددجویی از سیستم های تجربی با سرعت و آسانی بیشتری به انجام رسانید.

سیستم های خبره یا به عنوان جایگزین فرد متخصص یا به عنوان کمک به وی استفاده می‌شوند.

سیستم­ های خبره سیستم­ های برنامه ­ریزی شده­ای هستند که پایگاه­ دانش آنها انباشته از اطلاعاتی است که انسان­ها هنگام تصمیم­ گیری درباره یک موضوع خاص بر اساس آن تصمیم می­گیرند.

درواقع سیستم خبره برنامه­ های کامپیوتری هستند که نحوه تفکر یک متخصص در یک زمینه خاص را شبیه‌سازی می­کند. این نرم‌افزارها، دارای الگوی منطقی­ هستند که یک متخصص براساس آنان تصمیم‌گیری می­کند. یکی از اهداف هوش مصنوعی، فهم هوش انسانی با شبیه‌سازی آن توسط برنامه کامپیوتری است. البته بدیهی است که هوش را می‌توان به بسیاری از مهارت­های مبتنی بر فهم، از جمله توانایی تصمیم­ گیری، یادگیری و فهم زبان تعمیم داده و از این‌رو یک واژه کلی محسوب می­شود. بیشترین دستاوردهای هوش مصنوعی، در زمینه تصمیم‌گیری و حل مسئله بوده است؛ که عالی­ترین موضوع سیستم خبره را شامل می­شود. به آن نوعی از برنامه هوش مصنوعی که به سطحی از خبرگی می­رسند که می­توانند به‌جای یک متخصص در یک زمینه خاص تصمیم­ گیری کنند، سیستم خبره می‌گویند.

جهانی شدن در هر مکانی سازمان­ها را در مقابل موقعیت­ های جدید رقابتی قرار داده است، مکانی که توانمندی‌های علمی و رفتارهای کارآ را به‌سوی فراهم کردن حاشیه رقابتی سوق می‌دهد. این روزها بسیاری از سازمان­ها سعی می‌کنند تا موقعیت رقابتی‌شان را از طریق استفاده بهتر از دانش و جستجو برای روش‌های جدید، به‌منظور آماده کردن و ارتقای تجربیات و سرمایه‌های عقلانی که برای خود در نظر گرفته‌اند، بهبود دهند. به‌عبارت دیگر، محیط­های تجاری پیچیده‌تر و رقابتی‌تر شده‌اند و نیاز به ابزارها برای کمک به تصمیم­گیران که قادر به تصمیم­گیری دقیق نیستند، بیشتر شده است. موفقیت یک سازمان به بسیاری از عوامل بستگی دارد. بسیاری از این عوامل، در خارج از کنترل سازمان­ها است؛ عواملی از قبیل قوانین و مقررات دولتی و غیره که تأثیر نسبتا شدیدی را بر تصمیم‌های سازمانی دارند؛ اما اکثر عواملی که بر تصمیم­های سازمان اثرگذارند، در حیطه کنترل و اختیار سازمان­ها است. تکنولوژی سخت‌افزارها و نرم­افزارهای کامپیوتری در سال­های اخیر، تغییرات مشخصی را ایجاد کرده‌اند.

مزیت این قبیل تکنولوژی­ها تولید، جمع ­آوری، ذخیره ­سازی، مدیریت و توزیع اطلاعات به‌صورتی راحت‌تر و اثربخش‌تر است. کامپیوترها رشد چشم‌گیری داشته‌اند و قابلیت در دسترس بودن آنها، موجب رشد استفاده از سیستم‌های اطلاعاتی را فراهم آورده است. سیستم­ خبره به‌عنوان سیستم اطلاعاتی که به‌منظور توجه به امکان‌پذیری و انتخاب مناسب در شرایط معین طراحی شده است، جهت­ گیری متفاوت و برجسته­ ای در مقایسه با سیستم­های اطلاعاتی که مبنای آن مبادله­ ای است، دارند. سیستم اطلاعاتی مبادله­ ای، ابزاری کارآ در رابطه با فرآیند ذخیره‌سازی مبادلات است؛ بدین دلیل، این سیستم­ها ساختار ویژه­ای را ارائه می‌دهند که به‌طور خلاصه بر مبنای پایگاه منظمی قرارگرفته است. بنابراین در حالی‌که سیستم­های اطلاعاتی مبادله‌گرا، دارای تمرکز اطلاعاتی هستند، سیستم خبره دارای تمرکز خاصی برتصمیم ­گیری­ ها است.

با توسعه تحقیقات هوش مصنوعی که هدف آن مشابه‌سازی ویژگی‌های انسان از طریق سیستم‌های کامپیوتر است، سیستم‌های خبره به‌عنوان سیستم‌هایی که بتوانند به‌جای انسان در فرایند تصمیم‌گیری به انتخاب بپردازند، در اواخر دهه 90 مطرح گردید. اما نخستین سیستم خبره اتوماتیک در سال 1965 میلادی در دانشگاه استنفورد به‌نام DENDRAL طراحی شد؛ که در شیمی کاربرد داشت و هدف آن کمک به جستجوی ساختار ترکیبات ارگانیکی بود که از راه محاسبه بر روی فرمول‌های شیمیایی به‌دست می‌آمد.

سیستم‌های پشتیبانی تصمیم (DSS Design Support System)

سیستم­های خبره یکی از شاخه ­ها و زیرمجموعه­ های مهم سیستم­های پشتیبانی تصمیم هستند؛ که با کمک به متخصصان انسانی و با شبیه­ سازی تفکر خاص یک متخصص به فرآیند تصمیم­ گیری و تصمیم‌سازی در سازمان­ها کمک­ های فراونی می­کنند. می­توان DSS یا سیستم‌های پشتیبانی تصمیم را به‌عنوان یک سیستم پشتیبانی مدیران، جهت حل مسائل نیمه ساختاریافته به‌وسیله فراهم کردن اطلاعات و پیشنهادات تعریف کرد .این پیشنهاد می­تواند به‌شکل تصمیم ­های توصیه‌شده و هم‌چنین فرآیندهای توصیه ­ای برای به جریان انداختن امور جاریه سازمان باشد؛ ظرفیت فرآیند توصیه­ ای در این مقوله، DSS را به‌عنوان یک سیستم خبره معرفی می­نماید.

DSS سیستم‌های هدفمندی هستند که مدل‌های تحلیلی را باداده‌های عملیاتی برای مدیرانی که با موقعیت‌های تصمیم نیمه ساختاریافته مواجه هستند، ترکیب می‌نمایند. این سیستم­ها، به تحلیل و مدل‌سازی مشکلات و مسائل غیر ساختاریافته کمک شایانی می­کنند؛ یکی از مواردی که مکرر از سیستم‌های DSS استفاده می­شود، بسته یا نرم‌افزارهای صفحه‌گستر هستند؛ که توسط این صفحه‌گسترها کاربران می­توانند مدل­های مختلف را ساخته و متغیرها و فرضیات مختلف را بررسی کنند.

اجزای سیستم­های خبره

کاربر؛ شخصی است که با سیستم ارتباط متقابل دارد؛ که دسته بندی‌های مختلفی از آن وجود دارد. در بین این دسته‌بندی‌ها، کاربری که از هرجهت درگیر با پروژه سیستم باشد، نقش مهمی در موفقیت ایجاد سیستم‌های خبره دارد. ایجاد سیستم‌های خبره تا زمانی‌که مورد پذیرش کاربر قرارنگرفته باشند، سودی نخواهد داشت.

فرد خبره؛ شخصی که متخصص در یک زمینه خاص نه در تمام زمینه‌ها بوده و طی سال‌ها تجربه در حل مسائل مربوط به یک زمینه خاص، تخصص یافته است.

مهندس دانش؛ شخصی است که سیستم‌های خبره را طراحی کرده و می‌سازد؛ یک متخصص کامپیوتر که بر روش‌های هوش مصنوعی اشراف دارد و می‌تواند روش‌های متفاوت هوش مصنوعی را به‌طور مقتضی در حل مسائل واقعی به‌کار گیرد.

پایگاه داده؛ مجموع داده‌هایی درباره موضوع‌ها و وقایعی است که در پایگاه دانش، به‌منظور دست‌یابی به‌نتایج مورد نظر به‌کار خواهد رفت.

پایگاه دانش؛ مشتمل بر دانش متخصص و شیوه‌های داد و ستد با پایگاه داده برای دست‌یابی به نتایج مورد نظر است.

موتور استنتاج؛ امکان استنتاج و نتیجه‌گیری از ارتباط بین پایگاه داده و پایگاه دانش را فراهم می‌کند.

سیستم توضیح؛ چگونگی دست‌یابی سیستم به یک نتیجه خاصی را برای کاربر تشریح می‌نماید. این موضوع از اهمیت ویژه‌ای برخوردار است؛ زیرا پذیرش و تأیید کاربر را افزایش می‌دهد و به شناسایی و تصحیح خطا واشکال‌های ساده سیستم نیز کمک می‌کند.

قسمت اکتساب دانش؛ که فرایند استخراج، طراحی و ارائه دانش است. در‌ اغلب موارد، استخراج دانش متخصص از طریق تکنیک مصاحبه صورت می‌گیرد.

مزایا و محدودیت­های سیستم­های خبره

از دستاوردهای سیستم­های خبره می­توان صرفه‌جویی در هزینه­ ها و نیز تصمیم­ گیری بهتر و دقیق‌تر را نام برد. استفاده از سیستم­های خبره، برای شرکت­ها می­تواند صرفه­ جویی به‌همراه داشته باشد، در زمینه تصمیم­ گیری نیز گاهی می­توان در شرایط پیچیده با بهره­ گیری از چنین سیستم­ هایی تصمیم‌های بهتری را اتخاذ کرد و جنبه­ های پیچیده­ ای را در مدت زمان بسیار کمی مورد بررسی قرار داد که تحلیل آن به روزها زمان احتیاج دارد.

از سوی دیگر، به‌کارگیری سیستم­ های خبره، محدودیت­های خاصی را به‌دنبال دارد؛ به‌عنوان نمونه، این سیستم­ ها نسبت به آنچه انجام می­دهند، هیچ حسی ندارند. چنین سیستم­ هایی نمی­توانند خبرگی خود را به گستردگی وسیعی تعمیم دهند؛ چراکه تنها برای یک منظور خاص طراحی شده­ اند و پایگاه دانش آنان از دانش متخصصان آن حوزه نشات گرفته است؛ به‌همین علت، محدود هستند. این سیستم‌ها از آنجا که توسط دانش متخصصان، تغذیه اطلاعاتی شده­ اند، درصورت بروز برخی از موارد پیش‌بینی نشده نمی­توانند شرایط جدید را به‌درستی تجزیه و تحلیل کنند.

ریموند دو مشخصه برای محدودیت پتانسیل سسیستم‌های خبره به‌عنوان یک وسیله حل مسئله امور بازرگانی بر‌می‌شمارد: نخست اینکه، آنها علم متناقض را نمی‌توانند کنترل نمایند. دوم، سیستم‌های خبره نمی‌توانند مهارت‌های غیر استدلالی که به‌عنوان مشخصه شخص حل‌کننده مسئله است، را به‌کار برند.

مشکلات استقرار سیستم­های خبره

یکی از موانع اصلی بر سر استقرار سیستم‌های اطلاعاتی و به‌خصوص سیستم­های هوشمند تصمیم ­گیری، نیروی انسانی موجود در سازمان است. مقاومت در برابر تغییر یکی از نشانه‌های اهمیت نیروی انسانی سازمان است. بیشتر افراد با شدت­های متفاوت به تغییرپذیری بی­علاقه ­اند. انسان­ها متشکل از عادات خود هستند هرچه انسان­ها می­دانند، حتی اگر مطلبی را به اشتباه یاد گرفته باشند، آن‌را به‌عنوان ارزش قابل احترامی برای خود می‌دانند. تغییر و اصلاح این ارزش­ها هرچند در افراد مختلف متفاوت است، ولی تغییرپذیری انسان‌ها مترادف با بی‌ارزش شدن دانسته­ هایشان تلقی می‌شود و مقاومت ناخودآگاه با آن امری اجتناب‌ناپذیر است.

از جمله کاربردهای سیستم های خبره می توان به موارد زیر اشاره کرد:

  • کنترل ترافیک شهرهای بزرگ
  • هواپیما و فرودگاه ها
  • کتابخانه ها
  • سامانه های تحلیل مالی
  • سامانه های آماری
  • سامانه های آسان کننده تصمیم گیری

منبع

سیستم خبره قسمت 1
سیستم خبره قسمت 2
سیستم خبره قسمت 3
سیستم خبره قسمت 4
سیستم خبره قسمت 5
سیستم خبره قسمت 6

معایب و مزایای خوشه‌بندی k-میانگین

از آنجایی که در این روش خوشه‌بندی، محاسبه فاصله بین نقاط توسط تابع فاصله اقلیدسی انجام می‌شود، از این الگوریتم‌ها به صورت استاندارد، فقط برای مقدارهای عددی (و نه ویژگی‌های کیفی) می‌توان استفاده کرد. از طرف دیگر با توجه به محاسبات ساده و سریع آن‌ها،‌ پرکاربرد و موثر است. از طرف دیگر نسخه‌های تعمیم یافته از روش خوشه بندی k-میانگین نیز وجود دارد که با توابع فاصله دیگر مانند فاصله منهتن و یا فاصله‌هایی که برای داده‌های باینری قابل استفاده است، مراحل خوشه‌بندی را انجام می‌دهد.

به منظور ارزیابی نتایج خوشه‌بندی از معیارهای متفاوتی کمک گرفته می‌شود. ممکن است از قبل برچسب خوشه‌ها مشخص باشد و بخواهیم کارایی الگوریتم را با توجه به مقایسه برچسب‌های واقعی و حاصل از خوشه‌بندی، اندازه‌گیری کنیم. در این حالت، شاخص‌های ارزیابی بیرونی، بهترین راهنما و معیار برای سنجش صحت نتایج خوشه‌بندی محسوب می‌شوند. معمولا به این برچسب‌ها، استاندارد طلایی (Golden Standard) و در کل چنین عملی را ارزیابی Benchmark می‌گویند. برای مثال شاخص رَند (Rand Index) یکی از این معیارها و شاخص‌های بیرونی است که از محبوبیت خاصی نیز برخوردار است.

از طرف دیگر اگر هیچ اطلاعات اولیه از ساختار و دسته‌بندی مشاهدات وجود نداشته باشد، فقط ملاک ارزیابی، می‌تواند اندازه‌هایی باشد که میزان شباهت درون خوشه‌ها و یا عدم شباهت یا فاصله بین خوشه‌ها را اندازه می‌گیرند. بنابراین برای انتخاب بهتر و موثرترین روش خوشه‌بندی از میزان شباهت درون خوشه‌ها و شباهت بین خوشه‌ها استفاده می‌شود. روشی که دارای میزان شباهت بین خوشه‌ای کم و شباهت درون خوشه‌ای زیاد باشد مناسب‌ترین روش خواهد بود. این معیارها را به نام شاخص‌های ارزیابی درونی می‌شناسیم. به عنوان مثال شاخص نیم‌رخ (silhouette) یکی از این معیارها است که شاخصی برای سنجش مناسب بودن تعلق هر مشاهده به خوشه‌اش ارائه می‌دهد. به این ترتیب معیاری برای اندازه‌گیری کارایی الگوریتم خوشه‌بندی بدست می‌آید.

منبع


KMeans شاید ساده‌ترین الگوریتمِ خوشه‌بندی باشد که در بسیاری از مواقع جزوِ بهترین الگوریتم‌های خوشه‌بندی نیز هست. این الگوریتم از دسته الگوریتم‌هایی است که بایستی تعداد خوشه‌ها (گروه ها) را از قبل به او گفته باشیم. فرض کنید یک سری داده داریم و مانندِ درسِ شبکه های عصبی دو دسته داده داریم (پراید و اتوبوس) با این تفاوت که در یک مسئله‌ی خوشه‌بندی، نمی‌دانیم که کدام پراید است کدام اتوبوس؟ و فقط یک سری داده با دو ویژگی (طول ماشین و ارتفاع ماشین) در اختیار داریم. اجازه دهید اینبار این دو دسته را بدون دانستنِ برچسبِ آن ها بر روی نمودار رسم کنیم (برای اینکه بدانید چگونه این نمودار رسم می شود و بُعدهای مختلف آن چگونه ساخته می‌شود، درسِ شبکه‌ی عصبی را خوانده باشید) به صورت ساده، ما یک تعداد ماشین (اتومبیل) داریم که هر کدام ارتفاع و طولِ مشخصی را دارند. آن‌ها را به این گونه در دو بُعد در شکلِ زیر نمایش می‌دهیم):

برای مثال، ماشین شماره‌ی ۴#، دارای طولِ ۹ و ارتفاع ۴ است. در الگوریتمِ KMeans بایستی تعدادی نقطه در فضا ایجاد کنیم. تعداد این نقاط باید به تعداد خوشه‌هایی که می‌خواهیم در نهایت به آن برسیم، باشد (مثلا فرض کنید می‌خواهیم داده‌ها را به ۲خوشه تقسیم‌بندی کنیم، پس ۲نقطه به صورت تصادفی در فضای ۲بُعدیِ شکلِ بالا رسم می‌کنیم). شکل زیر را نگاه کنید:

الان ما دو نقطه‌ی سبز و قرمز انتخاب کردیم و این دو نقطه را جایی در فضا (به صورت تصادفی) قرار دادیم. حال فاصله‌ی هر کدام از نمونه‌ها را (۷ماشین) با این دو نقطه حساب می‌کنیم. برای این کار می‌توانیم از فاصله منهتن (Manhatan) استفاده کنیم. در واقع برای هر کدام از نمونه‌ها نسبت به دو نقطه‌ی سبز و قرمز در هر بُعد، با هم مقایسه کرده و از هم کم (تفاضل) میکنیم، سپس نتیجه‌ی کم کردنِ هر کدام از بُعد ها را با یکدیگر جمع میکنیم.

بعد از محاسبه‌ی فاصله‌ی هر کدام از نمونه‌ها با دو نقطه‌ی سبز و قرمز، برای هر نمونه، اگر آن نمونه به نقطه‌ی سبز نزدیک‌تر بود، آن نمونه سبز می‌شود (یعنی به خوشه‌ی سبزها می رود) و اگر به قرمز نزدیک‌تر بود به خوشه‌ی قرمزها می رود. مانند شکل زیر برای مثال بالا:

الان یک مرحله از الگوریتم را تمام کرده ایم. یعنی یک دور از الگوریتم تمام شد و می‌توانیم همین جا هم الگوریتم را تمام کنیم و نقاطی که سبز رنگ شده اند را در خوشه‌ی سبزها و نقاطی که قرمز رنگ شده‌اند را در خوشه‌ی قرمز‌ها قرار دهیم. ولی الگوریتمِ KMeans را بایستی چندین مرتبه تکرار کرد. ما هم همین کار را انجام می‌دهیم. برای شروعِ مرحله‌ی بعد، باید نقطه‌ی سبز و قرمز را جا‌به‌جا کنیم و به جایی ببریم که میانگینِ نمونه‌های مختلف در خوشه‌ی مربوط به خودشان قرار دارد. یعنی مثلا برای نقطه قرمز بایستی نقطه را به جایی ببریم که میانگینِ نمونه‌های قرمزِ دیگر (در مرحله‌ی قبلی) باشد. برای نقطه سبز هم همین طور. این کار را در شکل زیر انجام داده‌ایم:

الان دو نقطه قرمز و سبز جا‌به‌جا شدند. حال بایستی دوباره تمامیِ نمونه‌ها را هر کدام با دو نقطه‌ی سبز و قرمز مقایسه کنیم و مانند دور قبلی، آن نمونه‌هایی که به نقطه‌ی قرمز نزدیک‌تر هستند، خوشه‌ی قرمز و آن هایی که به نقطه‌ی سبز نزدیک هستند رنگِ سبز می‌گیرند. مانند شکل زیر:

دورِ دوم نیز به اتمام رسید و به نظرْ الگوریتم خوشه‌های خوبی را تشخیص داد. ولی اجازه بدهید یک دور دیگر نیز الگوریتم را ادامه دهیم. مانند شکل زیر دور سوم را انجام می شود (یعنی نقاطِ قرمز و سبز به مرکز خوشه‌ی خود (در مرحله‌ی قبلی) می‌روند و فاصله‌ی هر کدام از نمونه‌ها دوباره با نقاطِ قرمز و سبز (در محلِ جدید) محاسبه شده و هر کدام همرنگِ نزدیک‌ترین نقطه‌ی قرمز یا سبز می‌شود):

همان طور که می‌بینید در انتهای دورِ سوم، تغییری در خوشه‌ی هر کدام از نمونه‌ها رخ نداد. یعنی سبزها سبز ماندند و قرمزها، قرمز.این یکی از شروطی است که می‌تواند الگوریتم را خاتمه دهد. یعنی الگوریتمْ وقتی به این حالت رسید که در چند دورِ متوالی تغییری در خوشه‌ی نمونه‌ها (در این‌جا ماشین‌ها) به وجود نیامد، یعنی الگوریتمْ دیگر نمی‌تواند زیاد تغییر کند و این حالتِ پایانی برای خوشه‌هاست. البته می‌توان شرطی دیگر نیز برای پایان الگوریتم در نظر گرفت. برای مثال الگوریتمْ حداکثر در ۲۰دورِ متوالی می‌تواند عملیات را انجام دهد و دورِ ۲۰ام آخرین دورِ الگوریتم خواهد بود و الگوریتم دیگر بیشتر از آن پیشروی نخواهد کرد. به طور کل در الگوریتم‌های مبتنی بر دور (Iterative Algorithms) می‌توان تعدادِ دورها را محدود کرد تا الگوریتمْ بی‌نهایت دور نداشته باشد.

همان طور که دیدیم، این الگوریتم می‌تواند یک گروه‌بندیِ ذاتی برای داده‌ها بسازد، بدون اینکه برچسب داده‌ها یا نوع آن‌ها را بداند.

کاربردهای خوشه‌بندی بسیار زیاد است. برای مثال فرض کنید می‌خواهید مشتریانِ خود را (که هر کدام دارای ویژگی‌های مختلفی هستند) به خوشه‌های متفاوتی تقسیم کنید و هر کدام از خوشه‌ها را به صورتِ جزئی مورد بررسی قرار دهید. ممکن است با مطالعه‌ی خوشه‌هایی از مشتریان به این نتیجه برسید که برخی از آن‌ها که تعدادشان هم زیاد است، علارغم خرید با توالیِ زیاد، در هر بار خرید پول کمتری خرج می‌کنند. با این تحلیل‌هایی که از خوشه‌بندی به دست می‌آید یک مدیرِ کسب و کار می‌تواند به تحلیل‌داده‌ها و سپس تصمیم‌گیریِ درست‌تری برسد.

منبع


مروری بر الگوریتم K-Means

برای مشخص کردن شباهت داده‌ها از معیار و راه‌های مختلفی استفاده میشه که یکی از اونا فاصله اقلیدسی هست و در این‌جا هم ما از اون استفاده می‌کنیم.

اساس کار این الگوریتم به این صورت هست که اول باید تعداد خوشه‌هایی که مد نظر داریم رو مشخص کنیم. بعد از اون الگوریتم از مجموعه داده موجود، به تعداد خوشه‌هایی که مشخص کردیم میاد و به صورت تصادفی تعدادی رو به عنوان مرکز هر خوشه انتخاب میکنه. در مراحل بعدی به این خوشه‌ها داده‌های دیگری رو اضافه میکنه و میانگین داده‌های هر خوشه رو به عنوان مرکز اون خوشه در نظر می‌گیره. بعد از انتخاب مراکز خوشه جدید، داده‌های موجود در خوشه‌ها دوباره مشخص میشن. دلیلش هم این هست که در هر خوشه با انتخاب مرکز خوشه جدید ممکنه که بعضی از داده‌های اون خوشه از اون به بعد به خوشه(های) دیگه‌ای تعلق پیدا کنن.

در شکل زیر نمونه‌ای از خوشه‌بندی نشون داده شده که در اون داده‌ها به سه خوشه تقسیم‌ و به کمک سه رنگ نمایش داده شدن.

برای درک بهتر نحوه کار الگوریتم K-Means از مثال زیر استفاده می‌کنم:

فرض می‌کنیم که مجموعه داده‌ای داریم که شامل هر ۷ رکورد هست و همه رکوردهای اون ۲ ویژگی یا خصوصیت A و B رو دارن. (دز این‌جا میتونیم این ویژگی‌ها رو به عنوان طول و عرض در یک صفحه دو بعدی در نظر بگیریم)

رکورد A B
۱ ۱.۰ ۱.۰
۲ ۱.۵ ۲.۰
۳ ۳.۰ ۴.۰
۴ ۵.۰ ۷.۰
۵ ۳.۵ ۵.۰
۶ ۴.۵ ۵.۰
۷ ۳.۵ ۴.۵

فرض می‌کنیم که قراره داده‌ها به ۲ خوشه تقسیم بشن. پس برای این منظور به صورت تصادفی ۲ رکورد رو به عنوان مرکز این ۲ خوشه در نظر می‌گیریم.

رکورد مختصات
خوشه ۱ ۱ (۱.۰ و ۱.۰)
خوشه ۲ ۴ (۷.۰ و ۵.۰)

در ادامه الگوریتم داده‌ها رو به خوشه‌ای که فاصله اقلیدسی کمتری تا مرکز اون داره اختصاص میده. و هربار که داده جدیدی رو به یک خوشه اضافه می‌کنه مرکز اون خوشه رو هم دوباره محاسبه و مشخص میکنه.

خوشه ۱ خوشه ۲
گام رکورد مرکز خوشه رکورد مرکز خوشه
۱ ۱ (۱.۰ و ۱.۰) ۴ (۷.۰ و ۵.۰)
۲ ۱ و ۲ (۱.۵ و ۱.۲) ۴ (۷.۰ و ۵.۰)
۳ ۱ و ۲ و ۳ (۲.۳ و ۱.۸) ۴ (۷.۰ و ۵.۰)
۴ ۱ و ۲ و ۳ (۲.۳ و ۱.۸) ۴ و ۵ (۶.۰ و ۴.۲)
۵ ۱ و ۲ و ۳ (۲.۳ و ۱.۸) ۴ و ۵ و ۶ (۵.۷ و ۴.۳)
۶ ۱ و ۲ و ۳ (۲.۳ و ۱.۸) ۴ و ۵ و ۶ و ۷ (۵.۴ و ۴.۱)

پس در ادامه مرکزهای خوشه‌ها به صورت زیر در میان.

رکورد مرکز خوشه
خوشه ۱ ۱ و ۲ و ۳ (۲.۳ و ۱.۸)
خوشه ۲ ۴ و ۵ و ۶ و ۷ (۵.۴ و ۴.۱)

در ادامه فاصله داده‌ها تا این مرکز‌های خوشه‌های جدید به شکل جدول زیر در میان.

رکورد فاصله تا خوشه ۱ فاصله تا خوشه ۲
۱ ۱.۵ ۵.۴
۲ ۰.۴ ۴.۳
۳ ۲.۱ ۱.۸
۴ ۵.۷ ۱.۸
۵ ۳.۲ ۰.۷
۶ ۳.۸ ۰.۶
۷ ۲.۸ ۱.۱

در نتیجه و بر اساس این مراحل و اطلاعات مشاهده می‌کنیم رکورد ۳ که مربوط به خوشه ۱ بوده، فاصلش تا مرکز خوشه ۲ کمتر میشه. پس این رکورد رو باید به خوشه ۲ اختصاص بدیم.

رکورد مرکز خوشه
خوشه ۱ ۱ و ۲ خوشه ۱
خوشه ۲ ۳ و ۴ و ۵ و ۶ و ۷ خوشه ۲

و کل این فرایند و مراحل تا زمانی انجام میشه که تغییر و جابجایی در خوشه‌ها اتفاق نیفته.

این الگوریتم رو به راحتی و به کمک زبان‌های برنامه‌نویسی مختلفی میشه پیاده‌سازی کرد و در ادامه من پیاده‌سازی این الگوریتم رو برای همین مثال و به زبان جاوا و پایتون در این‌جا شرح میدم.

پیاده‌سازی الگوریتم  K-Means به زبان Java

 

import java.util.ArrayList;
public class KMeans_Ex {
    private static final int NUM_CLUSTERS = 2;    // Total clusters.
    private static final int TOTAL_DATA = 7;      // Total data points.
    private static final double SAMPLES[][] = new double[][]{{1.0, 1.0},
            {1.5, 2.0},
            {3.0, 4.0},
            {5.0, 7.0},
            {3.5, 5.0},
            {4.5, 5.0},
            {3.5, 4.5}};
    private static ArrayList    &amp;amp;lt; Data &amp;amp;gt;    dataSet = new ArrayList   &amp;amp;lt; Data &amp;amp;gt;  ();
    private static ArrayList   &amp;amp;lt; Centroid &amp;amp;gt;    centroids = new ArrayList   &amp;amp;lt; Centroid &amp;amp;gt;  ();
    private static void initialize() {
        System.out.println(&amp;quot;Centroids initialized at:&amp;quot;);
        centroids.add(new Centroid(1.0, 1.0)); // lowest set.
        centroids.add(new Centroid(5.0, 7.0)); // highest set.
        System.out.println(&amp;quot;     (&amp;quot; + centroids.get(0).X() + &amp;quot;, &amp;quot; + centroids.get(0).Y() + &amp;quot;)&amp;quot;);
        System.out.println(&amp;quot;     (&amp;quot; + centroids.get(1).X() + &amp;quot;, &amp;quot; + centroids.get(1).Y() + &amp;quot;)&amp;quot;);
        System.out.print(&amp;quot;\n&amp;quot;);
        return;
    }
    private static void kMeanCluster() {
        final double bigNumber = Math.pow(10, 10);    // some big number that's sure to be larger than our data range.
        double minimum = bigNumber;                   // The minimum value to beat.
        double distance = 0.0;                        // The current minimum value.
        int sampleNumber = 0;
        int cluster = 0;
        boolean isStillMoving = true;
        Data newData = null;
        // Add in new data, one at a time, recalculating centroids with each new one.
        while (dataSet.size()  &amp;amp;lt;  TOTAL_DATA) {
            newData = new Data(SAMPLES[sampleNumber][0], SAMPLES[sampleNumber][1]);
            dataSet.add(newData);
            minimum = bigNumber;
            for (int i = 0; i  &amp;amp;lt;  NUM_CLUSTERS; i++) {
                distance = dist(newData, centroids.get(i));
                if (distance &amp;amp;lt; minimum) {
                    minimum = distance;
                    cluster = i;
                }
            }
            newData.cluster(cluster);
            // calculate new centroids.
            for (int i = 0; i  &amp;amp;lt;  NUM_CLUSTERS; i++) {
                int totalX = 0;
                int totalY = 0;
                int totalInCluster = 0;
                for (int j = 0; j   &amp;amp;lt; dataSet.size(); j++) { if (dataSet.get(j).cluster() == i) { totalX += dataSet.get(j).X(); totalY += dataSet.get(j).Y(); totalInCluster++; } } if (totalInCluster &amp;amp;gt;    0) {
                    centroids.get(i).X(totalX / totalInCluster);
                    centroids.get(i).Y(totalY / totalInCluster);
                }
            }
            sampleNumber++;
        }
        // Now, keep shifting centroids until equilibrium occurs.
        while (isStillMoving) {
            // calculate new centroids.
            for (int i = 0; i  &amp;amp;lt;  NUM_CLUSTERS; i++) {
                int totalX = 0;
                int totalY = 0;
                int totalInCluster = 0;
                for (int j = 0; j   &amp;amp;lt; dataSet.size(); j++) { if (dataSet.get(j).cluster() == i) { totalX += dataSet.get(j).X(); totalY += dataSet.get(j).Y(); totalInCluster++; } } if (totalInCluster &amp;amp;gt;   0) {
                    centroids.get(i).X(totalX / totalInCluster);
                    centroids.get(i).Y(totalY / totalInCluster);
                }
            }
            // Assign all data to the new centroids
            isStillMoving = false;
            for (int i = 0; i   &amp;amp;lt;   dataSet.size(); i++) {
                Data tempData = dataSet.get(i);
                minimum = bigNumber;
                for (int j = 0; j   &amp;amp;lt;   NUM_CLUSTERS; j++) {
                    distance = dist(tempData, centroids.get(j));
                    if (distance   &amp;amp;lt;   minimum) {
                        minimum = distance;
                        cluster = j;
                    }
                }
                tempData.cluster(cluster);
                if (tempData.cluster() != cluster) {
                    tempData.cluster(cluster);
                    isStillMoving = true;
                }
            }
        }
        return;
    }
    /**
     * // Calculate Euclidean distance.
     *
     * @param d - Data object.
     * @param c - Centroid object.
     * @return - double value.
     */
    private static double dist(Data d, Centroid c) {
        return Math.sqrt(Math.pow((c.Y() - d.Y()), 2) + Math.pow((c.X() - d.X()), 2));
    }
    private static class Data {
        private double mX = 0;
        private double mY = 0;
        private int mCluster = 0;
        public Data() {
            return;
        }
        public Data(double x, double y) {
            this.X(x);
            this.Y(y);
            return;
        }
        public void X(double x) {
            this.mX = x;
            return;
        }
        public double X() {
            return this.mX;
        }
        public void Y(double y) {
            this.mY = y;
            return;
        }
        public double Y() {
            return this.mY;
        }
        public void cluster(int clusterNumber) {
            this.mCluster = clusterNumber;
            return;
        }
        public int cluster() {
            return this.mCluster;
        }
    }
    private static class Centroid {
        private double mX = 0.0;
        private double mY = 0.0;
        public Centroid() {
            return;
        }
        public Centroid(double newX, double newY) {
            this.mX = newX;
            this.mY = newY;
            return;
        }
        public void X(double newX) {
            this.mX = newX;
            return;
        }
        public double X() {
            return this.mX;
        }
        public void Y(double newY) {
            this.mY = newY;
            return;
        }
        public double Y() {
            return this.mY;
        }
    }
    public static void main(String[] args) {
        initialize();
        kMeanCluster();
        // Print out clustering results.
        for (int i = 0; i    &amp;amp;lt;    NUM_CLUSTERS; i++) {
            System.out.println(&amp;quot;Cluster &amp;quot; + i + &amp;quot; includes:&amp;quot;);
            for (int j = 0; j    &amp;amp;lt;    TOTAL_DATA; j++) {
                if (dataSet.get(j).cluster() == i) {
                    System.out.println(&amp;quot;     (&amp;quot; + dataSet.get(j).X() + &amp;quot;, &amp;quot; + dataSet.get(j).Y() + &amp;quot;)&amp;quot;);
                }
            } // j
            System.out.println();
        } // i
        // Print out centroid results.
        System.out.println(&amp;quot;Centroids finalized at:&amp;quot;);
        for (int i = 0; i    &amp;amp;lt;    NUM_CLUSTERS; i++) {
            System.out.println(&amp;quot;     (&amp;quot; + centroids.get(i).X() + &amp;quot;, &amp;quot; + centroids.get(i).Y() + &amp;quot;)&amp;quot;);
        }
        System.out.print(&amp;quot;\n&amp;quot;);
        return;
    }

 

پیاده‌سازی الگوریتم K-Means به زبانPython

 

import math
NUM_CLUSTERS = 2
TOTAL_DATA = 7
LOWEST_SAMPLE_POINT = 0  # element 0 of SAMPLES.
HIGHEST_SAMPLE_POINT = 3  # element 3 of SAMPLES.
BIG_NUMBER = math.pow(10, 10)
SAMPLES = [[1.0, 1.0], [1.5, 2.0], [3.0, 4.0], [5.0, 7.0], [3.5, 5.0], [4.5, 5.0], [3.5, 4.5]]
data = []
centroids = []
class DataPoint:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def set_x(self, x):
        self.x = x
    def get_x(self):
        return self.x
    def set_y(self, y):
        self.y = y
    def get_y(self):
        return self.y
    def set_cluster(self, clusterNumber):
        self.clusterNumber = clusterNumber
    def get_cluster(self):
        return self.clusterNumber
class Centroid:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def set_x(self, x):
        self.x = x
    def get_x(self):
        return self.x
    def set_y(self, y):
        self.y = y
    def get_y(self):
        return self.y
def initialize_centroids():
    # Set the centoid coordinates to match the data points furthest from each other.
    # In this example, (1.0, 1.0) and (5.0, 7.0)
    centroids.append(Centroid(SAMPLES[LOWEST_SAMPLE_POINT][0], SAMPLES[LOWEST_SAMPLE_POINT][1]))
    centroids.append(Centroid(SAMPLES[HIGHEST_SAMPLE_POINT][0], SAMPLES[HIGHEST_SAMPLE_POINT][1]))
    print(&amp;quot;Centroids initialized at:&amp;quot;)
    print(&amp;quot;(&amp;quot;, centroids[0].get_x(), &amp;quot;, &amp;quot;, centroids[0].get_y(), &amp;quot;)&amp;quot;)
    print(&amp;quot;(&amp;quot;, centroids[1].get_x(), &amp;quot;, &amp;quot;, centroids[1].get_y(), &amp;quot;)&amp;quot;)
    print()
    return
def initialize_datapoints():
    # DataPoint objects' x and y values are taken from the SAMPLE array.
    # The DataPoints associated with LOWEST_SAMPLE_POINT and HIGHEST_SAMPLE_POINT are initially
    # assigned to the clusters matching the LOWEST_SAMPLE_POINT and HIGHEST_SAMPLE_POINT centroids.
    for i in range(TOTAL_DATA):
        newPoint = DataPoint(SAMPLES[i][0], SAMPLES[i][1])
        if (i == LOWEST_SAMPLE_POINT):
            newPoint.set_cluster(0)
        elif (i == HIGHEST_SAMPLE_POINT):
            newPoint.set_cluster(1)
        else:
            newPoint.set_cluster(None)
        data.append(newPoint)
    return
def get_distance(dataPointX, dataPointY, centroidX, centroidY):
    # Calculate Euclidean distance.
    return math.sqrt(math.pow((centroidY - dataPointY), 2) + math.pow((centroidX - dataPointX), 2))
def recalculate_centroids():
    totalX = 0
    totalY = 0
    totalInCluster = 0
    for j in range(NUM_CLUSTERS):
        for k in range(len(data)):
            if (data[k].get_cluster() == j):
                totalX += data[k].get_x()
                totalY += data[k].get_y()
                totalInCluster += 1
        if (totalInCluster    &amp;gt;     0):
            centroids[j].set_x(totalX / totalInCluster)
            centroids[j].set_y(totalY / totalInCluster)
    return
def update_clusters():
    isStillMoving = 0
    for i in range(TOTAL_DATA):
        bestMinimum = BIG_NUMBER
        currentCluster = 0
        for j in range(NUM_CLUSTERS):
            distance = get_distance(data[i].get_x(), data[i].get_y(), centroids[j].get_x(), centroids[j].get_y())
            if (distance     &amp;lt;     bestMinimum):
                bestMinimum = distance
                currentCluster = j
        data[i].set_cluster(currentCluster)
        if (data[i].get_cluster() is None or data[i].get_cluster() != currentCluster):
            data[i].set_cluster(currentCluster)
            isStillMoving = 1
    return isStillMoving
def perform_kmeans():
    isStillMoving = 1
    initialize_centroids()
    initialize_datapoints()
    while (isStillMoving):
        recalculate_centroids()
        isStillMoving = update_clusters()
    return
def print_results():
    for i in range(NUM_CLUSTERS):
        print(&amp;quot;Cluster &amp;quot;, i, &amp;quot; includes:&amp;quot;)
        for j in range(TOTAL_DATA):
            if (data[j].get_cluster() == i):
                print(&amp;quot;(&amp;quot;, data[j].get_x(), &amp;quot;, &amp;quot;, data[j].get_y(), &amp;quot;)&amp;quot;)
        print()
    return
perform_kmeans()
print_results()

 

در این الگوریتم وقتی مرکز خوشه محاسبه میشه خیلی پیش میاد که این مرکز خوشه محاسبه‌شده در بین داده‌های واقعی موجود نباشه و صرفا یه میانگین محسوب میشه که همین موضوع باعث مقاوم نبودن این الگوریتم در برابر داده‌های پرت مبشه. برای حل این مشکل الگوریتمی پیشنهاد شده به نام K-Medoids که در این الگوریتم مرکز خوشه جدید وقتی محاسبه میشه خودش هم در بین داده‌های اصلی موجود هست. با کمی تغییر در الگوریتم K-Means می‌تونیم K-Medoids رو هم داشته باشیم.

این برنامه در سایت گیتلب قابل دسترس هست و شما می‌تونید اون رو تغییر بدین و بهترش کنید.

 

پیاده‌سازی الگوریتم KMEANS به زبان JAVA در گیتلب

پیاده‌سازی الگوریتم KMEANS به زبان PYTHON در گیتلب

منبع