วันอาทิตย์ที่ 19 กุมภาพันธ์ พ.ศ. 2560

Decision Tree


Decision Tree
          ในการที่คอมพิวเตอร์จะสามารถทำนายหรือตัดสินข้อมูลในอนาคตจำเป็นต้องมีข้อมูลจากอดีตที่มากเพียงพอจึงจะสามารถทำนายข้อมูลได้ จึงได้มีหลักการในการทำนายวิธีหนึ่งที่เรียกว่า Decision Tree
          Decision Tree คือ ต้นไม้ที่มีไว้สำหรับการตัดสินใจโดยใช้ข้อมูลเหตุการณ์ในอดีตที่เคยเก็บมา ประมวลแล้วมาทำนายอนาคต (เนื่องจากรูปแบบการเก็บข้อมูลคล้ายๆกับต้นไม้กลับหัว จึงตั้งชื่อหลักการวิธีการตัดสินใจนี้ว่า Decision Treeดังรูป)

ภาพแสดง Decision Tree

ซึ่งการจะได้โครงสร้าง Decision Tree จำเป็นต้องรวบรวมข้อมูลดังตัวอย่างข้อมูลด้านล่าง

Data
No Outlook Temperature Humidity Windy Play
1 sunny hot high FALSE no
2 sunny hot high FALSE no
3 overcast hot high FALSE yes
4 rainy mild high FALSE yes
5 rainy cool normal FALSE yes
6 rainy cool normal TRUE no
7 overcast cool normal TRUE yes
8 sunny mild high FALSE no
9 sunny mild normal FALSE yes
10 rainy mild normal FALSE yes
11 sunny mild normal TRUE yes
12 overcast mild high TRUE yes
13 overcast hot normal FALSE yes
14 rainy mild high TRUE no


      เมื่อเราสามารถสร้าง Decision Tree ได้แล้วเราก็จะสามารถทำนายโดยใช้ Decision Tree จากตัวอย่างรูปด้านล่างซึ่งได้จากการเก็บรวมรวมข้อมูลมาจำนวนมากตามตารางข้างบนแล้วมาสร้าง Decision Tree ได้ดังรูปข้างล่างนี้
     Decision Tree นี้เป็นตัวอย่างที่จะช่วยในการทำนายว่าเราจะออกไปเล่นข้างนอกหรือไม่ โดยใช้ แอตทริบิวต์ชื่อ Outlook(สภพอากาศข้างนอก), Temperature(อุณหภูมิ), Humidity(ความชื้น), Windy(ลมแรงหรือไม่) ช่วยในการตัดสินใจว่าจะออกไปเล่นข้างนอกหรือไม่
สมมุติ ถ้าปัจจุบันเราได้ข้อมูลดังนี้
           Outlook = rainy
           Temperature = hot
           Humidity = normal
           Windy = FALSE
Decision Tree ตามรูปด้านล่าง ก็จะดูที่ Outlook ก่อนว่าเป็นข้อมูลอะไร ซึ่งเราเป็น rainy เราก็ไปดู Node rainy ว่าต่อไปต้องดู แอตทริบิวต์อะไร ซึ่งต่อไปก็คือดูแอตทริบิวต์ Windy บังเอิญว่าปัจจุบัน Windy = False ผลปรากฎว่า Decision Tree ทำนายว่า Play = yes (คือทำนายว่าเล่นข้างนอกได้)

ภาพแสดง Decision Tree

นี่คือหลักการทำงานของ Decision Tree อย่างคร่าวๆครับ ถ้าต้องการรู้มากกว่านี้สามารถเข้าลิงค์ด้านล่างได้ครับ ซึ่งผมก็อ่านจากเว็บข้างล่างนี้ครับ




reference
http://dataminingtrend.com/2014/decision-tree-model/


วันเสาร์ที่ 11 กุมภาพันธ์ พ.ศ. 2560

Sql Server

            คราวนี้จะไม่เขียนเรื่อง Algorithm แต่จะเขียนเรื่องการ Query ใน Sql server เนื่องจากผมต้องการเขียนเก็บไว้เป็นความรู้ เป็นความทรงจำจะได้ไม่ต้อง พิมพ์ถาม Google ในเวลาที่จำไม่ได้

Select
      การ Select ทุก column
   SELECT * FROM table_name;

      การ Select บาง column
   SELECT column_name,column_name
   FROM table_name;

      การ Select บาง column แบบมีเงื่อนไข
   SELECT column_name,column_name
   FROM table_name
   WHERE column_name operator value;

   การ Select แบบเรียงลำดับ
   SELECT column_name, column_name
   FROM table_name
   ORDER BY column_name ASC|DESC, column_name ASC|DESC;


Group by
       การ Select โดยใช้ Group by
       SELECT column_name, aggregate_function(column_name)
   FROM table_name
   WHERE column_name operator value
   GROUP BY column_name, column_name,... ;

   การ Select โดยใช้ Group by แบบ มีเงื่อนไข
   SELECT column_name, aggregate_function(column_name)
   FROM table_name
   WHERE column_name operator value
   GROUP BY column_namecolumn_name,...
   HAVING aggregate_function(column_name) operator value;


Insert
      การ Insert ข้อมูลทุก Column
      INSERT INTO table_name
   VALUES (value1,value2,value3,...);

   การ Insert ข้อมูลบาง Column
   INSERT INTO table_name (column1,column2,column3,...)
   VALUES (value1,value2,value3,...);



Update
       UPDATE table_name
   SET column1=value1,column2=value2,...
   WHERE some_column=some_value;
Delete
      การ Delete Row
      DELETE FROM table_name
   WHERE some_column=some_value;

Join      inner join
      SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;

      left join
      SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;

      right join
      SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;


   full join
   SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;


Union
       Union คือการนำเอาข้อมูลในตาราง 2 ตารางมาต่อข้างใต้ Table เรื่อยๆ
       การ  Union เฉพาะค่าข้อมูลที่ไม่ซ้ำกัน
       SELECT column_name(s) FROM table1
   UNION
   SELECT column_name(s) FROM table2;

   การ Union โดยไม่สนใจว่าข้อมูลซ้ำหรือไม่
   SELECT column_name(s) FROM table1
   UNION ALL
   SELECT column_name(s) FROM table2;


Select Into
        Select Into คือการ select ข้อมูลจาก Table แล้วไป insert ใส่ Table ใหม่ (จะสร้าง Table ใหม่เอง)
        SELECT column_name(s)
    INTO newtable [IN externaldb]
    FROM table1;
    WHERE column_name operator value;

Insert Into Select
    Insert Into Select คือการ select ข้อมูลจาก Table แล้วไป insert Table อีก Table หนึ่งที่มีการสร้างไว้อยู่แล้ว
    INSERT INTO table2
    (column_name(s))
    SELECT column_name(s)
    FROM table1;
    WHERE column_name operator value;

Insert ด้วยเงื่อนไข
INSERT INTO EmailsRecebidos (De, Assunto, Data)
   VALUES (@_DE, @_ASSUNTO, @_DATA)
   WHERE NOT EXISTS ( SELECT * FROM EmailsRecebidos 
                   WHERE De = @_DE
                   AND Assunto = @_ASSUNTO

                   AND Data = @_DATA);

Function
    GETDATE()
    คือการเอาเวลาปัจจุบัน จาก Sql server

    Substring(start,count)
    คือการเอาข้อความจากตำแหน่ง Start จำนวน count ตัวอักษร (ใน Sql server ตำแหน่ง Start จะเริ่มต้นด้วย 0)

    AVG(column_name)
    คือการเฉลี่ยค่าใน Column ที่กำหนด

         SUM(column_name)
    คือการรวมค่าใน Column ที่กำหนด

    ROUND(column_name,decimals)
    คือการปัดเศษทศนิยม ถ้าน้อย กว่า 5 ให้ปัดลง มากกว่าเท่ากับ 5 ให้ปัดขึ้น
    column_name คือ column ที่ต้องการปัดเศษ
    decimals คือ จำนวนทศนิยมที่จะ return ถ้าใส่ค่าเป็น 0 จะ return เป็นจำนวนเต็ม ,ถ้าเป็น 1 จะ return เป็นทศนิยม 1 ตำแหน่ง , 2 เป็น 2 ตำแหน่ง, 3 เป็น 3 ตำแหน่ง,...

update from multi Table
        ถ้าเรามี 2 table แล้วต้องเอาค่าอีก table1 มา update ใส่ table2 เราจะช้คำสั่งดังนี้
        update t1 set  t1.column_name = value1, t1.column_name = value
        FROM table_name1 t1
        LEFT JOIN table_name2 t2

        ON t1.key = t2.key

Case
        คือ การมีเงื่อนไขคล้ายๆ ใช้ else if ใน sql จะใช้คำสั่งดังนี้
        update table_name set  column_name = case
        When column_name operator value then new_value
        When column_name operator value then new_value
        When column_name operator value then new_value
        When column_name operator value then new_value
        ...
        else
        new_value
        end
    WHERE some_column=some_value;

    ถ้าเงื่อนไขใน When เป็นจริง ค่าใหม่เป็น new_value
    ถ้าไม่เข้าเงื่อนไขใดเลย(คือไม่เข้า When ใดเลย) จะใช้ค่าใน else แทน


While
        DECLARE @cnt INT = 0;

          WHILE @cnt < 24
          BEGIN
                SET @cnt = @cnt + 1;
          END;


decrae
        คือ การประกาศตัวแปร ซึงเป็น Table จะใช้คำสั่งดังนี้
        declare @table_name TABLE(
        column_name column_type,
        column_name column_typr,
        ...
        )

       Example
       declare @TEMP_TMC_FEED TABLE(
       TMC nvarchar(9),
       COLOR float
       )



Store procedure
      use TrafficSpatial
      SET ANSI_NULLS ON
      GO
      SET QUOTED_IDENTIFIER ON
      GO

      CREATE PROCEDURE procedure_name
      AS
      BEGIN
         SET NOCOUNT OFF;
 
      END
      GO

การ Reset Auto Number ให้เริ่มค่า 1 ใหม่
DBCC CHECKIDENT (mytable, RESEED, 0)

เทคนิค การ Clear Connection แล้วทำการแก้ไขชื่อ Table
ALTER DATABASE [LOG_HISTORICAL]
 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

 GO

 EXEC sp_rename 'LogAuthen', 'LogAuthenOLD';

 GO

  ALTER DATABASE [LOG_HISTORICAL]
 SET MULTI_USER WITH ROLLBACK IMMEDIATE;


คำสั่ง Sql การสร้าง Table
CREATE TABLE [tablename](
[No] [int] IDENTITY(1,1) NOT NULL,
[CustomerName] [nvarchar](50) NULL,
[Area] [nvarchar](50) NULL,
[SALARY] [int] NULL,
) ON [PRIMARY]

การ Drop Table
DROP TABLE [schema].[tablename]



การ Drop หลาย Table
USE [databasename]
DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += '
DROP TABLE '
    + QUOTENAME(s.name)
    + '.' + QUOTENAME(t.name) + ';'
    FROM sys.tables AS t
    INNER JOIN sys.schemas AS s
    ON t.[schema_id] = s.[schema_id]
    WHERE t.name LIKE '2018_07_1%';

PRINT @sql;
EXEC sp_executesql @sql;



reference
http://www.w3schools.com/sql/default.asp





วันพฤหัสบดีที่ 2 กุมภาพันธ์ พ.ศ. 2560

K-nearest neighbors

     หลังจากที่พูดเรื่อง K Mean Algorithm ไปแล้วคราวนี้เราจะมาพูดถึง K Nearest Neighbors Algorithm ที่มีจุดประสงค์เพื่อแก้ปัญหาในการจัดกลุ่ม แต่การแก้ปัญหาในการจัดกลุ่มของ K Nearest Neighbors นั้นจะไม่เหมือนกับการแก้ปัญหาการจัดกลุ่ม ของ K Mean Algorithm

ภาพแสดง การแก้ปัญหาของ K Nearest Neighbor


     K Nearest Neighbor จะใช้สำหรับแก้ปัญหาที่เรารู้จำนวนกลุ่มที่แน่นอนอยู่แล้ว แต่มีบางข้อมูลเท่านั้นที่เราไม่สามารถบอกได้ว่าข้อมูลนั้นอยู่กลุ่มใด ถ้าจะให้ยกตัวอย่างเพื่อความเข้าใจง่าย

     ลองจินตนาการว่าในโลกนี้มีแผ่นดินหนึ่งที่มีเชื้อชาติอยู่แค่สองเชื้อชาติเท่านั้นคือ เชื้อชาติสีเขียว และ เชื้อชาติสีฟ้า ซึ่งทั้ง 2 เชื้อชาตินี้จะมีวัฒนธรรมที่ต่างกันคือเชื้อชาติสีเขียวจะนับถือเฉพาะสิ่งของที่เป็นสีเขียวดังนั้น บ้าน เสื้อผ้า และ สิ่งของต่างๆ ของคนชาตินี้จึงมีแต่สีเขียว ส่วนชนชาติสีฟ้าจะนับถือเฉพาะสีฟ้าเท่านั้น ด้วยการนับถือสีที่ต่างกันจึงทำให้สองชาตินี้ไม่ถูกกัน บังเอิญอยู่ดีๆคุณมาอยู่สถานที่แห่งนี้คุณต้องการอยู่รอดจากสถานที่แห่งนี้ดังนั้นคุณต้องใส่ชุดไม่สีเขียวก็สีฟ้า คุณจะใส่เสื้อสีอะไร


ภาพแสดง เชื้อชาติสีเขียว กับเชื้อชาติสีฟ้า



    คำตอบ แล้วแต่บริเวณที่คุณอยู่ ว่าคนเชื้อชาติบริเวณที่คุณอยู่ เชื้อชาติใดมีจำนวนคนมากกว่า
                 ถ้าบริเวณแถวๆนั้นมีคนเชื้อชาติสีเขียวเยอะกว่าเชื้อชาติสีฟ้า คุณจำเป็นที่จะต้องใส่เสื้อสีเขียว
                 ถ้าบริเวณแถวๆนั้นมีคนเชื้อชาติสีฟ้าเยอะกว่าเชื้อชาติสีเขียว คุณจำเป็นที่จะต้องใส่เสื้อสีฟ้า


หลักการทำงานของ K Nearest Neighbor Algorithm
      หลักการทำงาน K Nearest Neighbor นั้นก็จะคล้ายๆ กับคำตอบการเลือกใส่เสื้อสีเขียวหรือ เสื้อสีฟ้า ที่จะดูจำนวนข้อมูลบริเวณรอบๆ(Nearest Neighbor) ว่ามีกลุ่มใหนจำนวนเยอะกว่ากัน แล้วจึงเลือกกลุ่มที่มีจำนวนเยอะกว่า


ตัวอย่างการทำงาน K Nearest Neighbor Algorithm
สมมุติเรามีกลุ่ม 2 กลุ่ม และให้ค่า K = 3 (K คือค่าที่ไว้ดูจำนวนข้อมูลที่ใกล้เราที่สุดว่าจะดูกี่จำนวนในการตัดสินเลือกกลุ่ม)

รูปภาพแสดง ข้อมูลแบ่งเป็น 2 กลุ่ม



เรามีข้อมูลใหม่เข้ามา ต้องการทราบว่าข้อมูลที่เข้ามาใหม่ควรอยู่กลุ่มใหน

รูปภาพ แสดงมีข้อมูลเข้ามาใหม่



จึงดูรอบๆ ที่ใกล้ตัวมากที่สุด(Nearest Neighbor) 3 ข้อมูล ( K=3)

รูปภาพ แสดงการหา 3 Nearest Neighbor


พบว่าข้อมูล 3 ข้อมูลที่ใกล้คือ มีกลุ่มสีเขียว 1 ข้อมูล มีกลุ่มสีฟ้า 2 ข้อมูลเราจึงจัดให้ข้อมูลใหม่อยู่ในกลุ่มสีฟ้า

รูปภาพ แสดงการจัดกลุ่ม
รูปภาพ แสดงการจัดกลุ่ม



ข้อควรระวังการใช้ K Nearest Neighbor
- ค่า K ควรมีค่าเป็นเลขคี่สำหรับกลุ่มที่มีจำนวน คู่ กลุ่ม เนื่องจากถ้า K เป็นเลขคู่บางสถานะการจะไม่สามารถเลือกกลุ่มได้

ภาพแสดง ปัญหาเมื่อ K เป็นเลขคู่ สำหรับกลุ่มที่จำนวนคู่



- ค่า K ต้องไม่มีค่าเท่ากับค่าผลคูณของจำนวนกลุ่ม

ภาพแสดง ปัญหาเมื่อมีจำนวนกลุ่ม 3 กลุ่ม แต่มี ค่า K=6 ซึ่งเป็นค่าผลคูณของจำนวนกลุ่มคูณด้วย 2 (3*2)




- จะเกิดความลำบากเมื่อมีจำนวนข้อมูลมหาศาลเนื่องจากจำเป็นต้องค้นหาข้อมูลที่ใกล้ที่สุดจากทุกจำนวน


การทำงานของ K Nearest Neighbor ก็คร่าวๆประมาณนี้ครับ


K Mean Algorithm

         
        สวัสดีครับวันนี้ขออธิบายเนื่อหาด้าน Programming เกี่ยวกับ K-mean Algorithm
        K-mean Algorithmคือการแบ่งกลุ่มตามจำนวนกลุ่มที่เราต้องการแบ่งซึ่งใน Blog นี้จะเป็นตัวอย่างการใช้ K-mean ในด้านการจัดกลุ่มตามตำแหน่งระบบพิกัด X, Y ครับ

         K-mean Algorithm คือ Algorithm สำหรับการจัดกลุ่มชนิดหนึ่งซึ่งใช้ค่าเฉลี่ยช่วยในการจัดกลุ่มแบบ Partition (คือการแบ่งกลุ่มชัดเจนโดยไม่มีกลุ่มใดซับท้อนกัน) โดยเราจะต้องระบุจำนวนกลุ่มที่เราต้องการแบ่งลงไป(คือค่า K) แล้ว K-Mean Algorithm จะแบ่งกลุ่มโดยใช้ค่าเฉลี่ยในการประมวลผลครับ


ภาพแสดงจำนวนข้อมูลทั้งหมด
ภาพแสดงการแบ่งข้อมูลออกเป็น 2 กลุ่ม (K=2)
ภาพแสดงการแบ่งข้อมูลออกเป็น 3 กลุ่ม (K=3)


หลักการทำงานของ K-Mean Algorithm จะมีหลักการทำงานดังนี้ตามลำดับครับ
1. กำหนดจำนวนกลุ่มที่ต้องการจะแบ่ง (กำหนดค่า K)

    สมมุติเราต้องการแบ่งข้อมูลจำนวน 2 กลุ่มโดยมีจำนวนข้อมูลดังภาพ
ภาพแสดงจำนวนข้อมูลทั้งหมด


2. กำหนดตำแหน่งศูนย์กลางของกลุ่ม K ตำแหน่ง (ตำแหน่งศูนย์กลางเราจะเรียกว่า Cluster Center หรือ Centroid)
    เนื่องจากเราต้องการแบ่งกลุ่มเป็น 2 กลุ่ม เราจึงวาง Centroid 2 ตำแหน่ง(ในครั้งแรกเราจะวางตำแหน่งใหนก็ได้ครับ)

ภาพแสดงการวาง centriod โดยเครื่องหมาย + แสดงถึง ตำแหน่ง centriod ของแต่ละกลุ่ม


3. ทำการจัดกลุ่มโดยการเลือกระยะห่างระหว่างข้อมูลกับตำแหน่งศูนย์กลางของกลุ่ม(Centroid) ที่น้อยที่สุด

ภาพแสดงการจัดกลุ่ม โดยจัดกลุ่มข้อมูลที่ห่างจากตำแหน่ง Centriod น้อยที่สุด


4. เมื่อจัดกลุ่มเสร็จทั้งหมดแล้วก็หาค่าเฉลี่ยแต่ละกลุ่ม และ ให้ค่าเฉลี่ยนั้นเป็นตำแหน่งศูนย์กลาง(Centroid) แต่ละกลุ่มใหม่

ภาพแสดงการจัดตำแหน่ง Centriod ใหม่ให้อยู่กึ่งกลางของกลุ่ม หรือ ค่าเฉลี่ยของกลุ่มนั่นเอง


5. ทำซ้ำข้อ 3 ข้อ 4 เรื่อยๆ จนกระทั้งค่าเฉลี่ยหรือตำแหน่งศูนย์กลางของกลุ่ม(Centroid) ทุกกลุ่มไม่มีการเปลี่ยนแปลง


ภาพทำกระบวนการทำงาน ตามข้อ 3

ภาพทำกระบวนการทำงาน ตามข้อ 4



ตัวอย่าง Code การใช้ Kmean จัดกลุ่มข้อมูลเชิงเส้น