AI với Python - Hướng dẫn nhanh
Kể từ khi phát minh ra máy tính hoặc máy móc, khả năng thực hiện các nhiệm vụ khác nhau của họ đã tăng lên theo cấp số nhân. Con người đã phát triển sức mạnh của hệ thống máy tính về các lĩnh vực làm việc đa dạng của chúng, tốc độ ngày càng tăng và giảm kích thước theo thời gian.
Một nhánh của Khoa học Máy tính có tên Trí tuệ nhân tạo theo đuổi việc tạo ra các máy tính hoặc máy móc thông minh như con người.
Khái niệm cơ bản về trí tuệ nhân tạo (AI)
Theo cha đẻ của Trí tuệ nhân tạo, John McCarthy, đó là “Khoa học và kỹ thuật tạo ra các máy thông minh, đặc biệt là các chương trình máy tính thông minh”.
Trí tuệ nhân tạo là một cách làm cho một máy tính, một rô bốt điều khiển bằng máy tính hoặc một phần mềm suy nghĩ một cách thông minh, theo cách mà con người thông minh nghĩ. AI được hoàn thiện bằng cách nghiên cứu cách bộ não con người suy nghĩ và cách con người học hỏi, quyết định và làm việc trong khi cố gắng giải quyết một vấn đề, sau đó sử dụng kết quả của nghiên cứu này làm cơ sở phát triển phần mềm và hệ thống thông minh.
Trong khi khai thác sức mạnh của hệ thống máy tính, sự tò mò của con người khiến anh ta tự hỏi, "Liệu một cỗ máy có thể suy nghĩ và hành xử như con người không?"
Vì vậy, sự phát triển của AI bắt đầu với ý định tạo ra trí thông minh tương tự trong các máy móc mà chúng ta tìm thấy và đánh giá cao ở con người.
Sự cần thiết của việc học AI
Như chúng ta biết rằng AI theo đuổi việc tạo ra những cỗ máy thông minh như con người. Có rất nhiều lý do để chúng ta nghiên cứu về AI. Lý do như sau:
AI có thể học thông qua dữ liệu
Trong cuộc sống hàng ngày, chúng ta phải xử lý một lượng lớn dữ liệu và bộ não con người không thể theo dõi được nhiều dữ liệu như vậy. Đó là lý do tại sao chúng ta cần tự động hóa mọi thứ. Để thực hiện tự động hóa, chúng ta cần nghiên cứu AI vì nó có thể học hỏi từ dữ liệu và có thể thực hiện các tác vụ lặp đi lặp lại một cách chính xác và không mệt mỏi.
AI có thể tự dạy
Điều rất cần thiết là một hệ thống phải tự dạy vì bản thân dữ liệu luôn thay đổi và kiến thức có được từ dữ liệu đó phải được cập nhật liên tục. Chúng ta có thể sử dụng AI để thực hiện mục đích này vì hệ thống hỗ trợ AI có thể tự dạy.
AI có thể phản hồi trong thời gian thực
Trí tuệ nhân tạo với sự trợ giúp của mạng nơ-ron có thể phân tích dữ liệu sâu hơn. Do khả năng này, AI có thể suy nghĩ và phản ứng với các tình huống dựa trên các điều kiện trong thời gian thực.
AI đạt được độ chính xác
Với sự trợ giúp của các mạng nơ-ron sâu, AI có thể đạt được độ chính xác cao. AI giúp trong lĩnh vực y học chẩn đoán các bệnh như ung thư từ MRI của bệnh nhân.
AI có thể tổ chức dữ liệu để tận dụng tối đa
Dữ liệu là tài sản trí tuệ cho các hệ thống đang sử dụng các thuật toán tự học. Chúng ta cần AI để lập chỉ mục và tổ chức dữ liệu theo cách mà nó luôn mang lại kết quả tốt nhất.
Hiểu trí thông minh
Với AI, các hệ thống thông minh có thể được xây dựng. Chúng ta cần hiểu khái niệm trí thông minh để bộ não của chúng ta có thể xây dựng một hệ thống thông minh khác giống như chính nó.
Thông minh là gì?
Khả năng của một hệ thống để tính toán, suy luận, nhận thức các mối quan hệ và phép loại suy, học hỏi kinh nghiệm, lưu trữ và truy xuất thông tin từ bộ nhớ, giải quyết vấn đề, hiểu các ý tưởng phức tạp, sử dụng ngôn ngữ tự nhiên thành thạo, phân loại, khái quát hóa và thích ứng với các tình huống mới.
Các loại trí thông minh
Theo mô tả của Howard Gardner, một nhà tâm lý học về phát triển người Mỹ, Trí thông minh có nhiều mặt -
Sr.No | Thông minh & Mô tả | Thí dụ |
---|---|---|
1 | Linguistic intelligence Khả năng nói, nhận biết và sử dụng các cơ chế âm vị học (âm thanh lời nói), cú pháp (ngữ pháp) và ngữ nghĩa (ý nghĩa). |
Người tường thuật, Người hùng biện |
2 | Musical intelligence Khả năng tạo ra, giao tiếp và hiểu ý nghĩa của âm thanh, hiểu cao độ, nhịp điệu. |
Nhạc sĩ, Ca sĩ, Nhà soạn nhạc |
3 | Logical-mathematical intelligence Khả năng sử dụng và hiểu các mối quan hệ trong trường hợp không có hành động hoặc đối tượng. Đó cũng là khả năng hiểu những ý tưởng phức tạp và trừu tượng. |
Nhà toán học, nhà khoa học |
4 | Spatial intelligence Khả năng nhận thức thông tin hình ảnh hoặc thông tin không gian, thay đổi nó và tạo lại hình ảnh trực quan mà không cần tham chiếu đến các đối tượng, tạo hình ảnh 3D và di chuyển và xoay chúng. |
Người đọc bản đồ, Phi hành gia, Nhà vật lý |
5 | Bodily-Kinesthetic intelligence Khả năng sử dụng toàn bộ hoặc một phần cơ thể để giải quyết các vấn đề hoặc sản phẩm thời trang, kiểm soát các kỹ năng vận động tinh và thô cũng như thao tác các đồ vật. |
Người chơi, Vũ công |
6 | Intra-personal intelligence Khả năng phân biệt giữa cảm xúc, ý định và động cơ của chính mình. |
Gautam Buddhha |
7 | Interpersonal intelligence Khả năng nhận biết và phân biệt cảm xúc, niềm tin và ý định của người khác. |
Người giao tiếp đại chúng, Người phỏng vấn |
Bạn có thể nói một cỗ máy hoặc một hệ thống thông minh nhân tạo khi nó được trang bị ít nhất một hoặc tất cả các trí tuệ trong đó.
Thông minh được cấu thành từ gì?
Trí thông minh là vô hình. Nó bao gồm -
- Reasoning
- Learning
- Giải quyết vấn đề
- Perception
- Trí tuệ ngôn ngữ
Hãy để chúng tôi đi qua tất cả các thành phần ngắn gọn -
Lý luận
Nó là một tập hợp các quy trình cho phép chúng tôi cung cấp cơ sở để phán đoán, đưa ra quyết định và dự đoán. Có hai loại rộng rãi -
Lập luận quy nạp | Suy luận suy luận |
---|---|
Nó tiến hành các quan sát cụ thể để đưa ra các tuyên bố chung chung. | Nó bắt đầu với một tuyên bố chung và xem xét các khả năng để đi đến một kết luận cụ thể, hợp lý. |
Ngay cả khi tất cả các tiền đề đều đúng trong một phát biểu, thì suy luận quy nạp vẫn cho phép kết luận là sai. | Nếu điều gì đó đúng với một lớp sự vật nói chung, thì nó cũng đúng cho tất cả các thành viên của lớp đó. |
Example - "Nita là một giáo viên. Nita rất chăm học. Vì vậy, Tất cả các giáo viên đều chăm học." | Example - "Tất cả phụ nữ trên 60 tuổi đều là bà. Shalini 65 tuổi. Vì vậy, Shalini là bà." |
Học tập - l
Khả năng học tập được sở hữu bởi con người, các loài động vật cụ thể và các hệ thống hỗ trợ AI. Việc học được phân loại như sau:
Học thính giác
Đó là học bằng cách lắng nghe và nghe. Ví dụ, học sinh nghe các bài giảng ghi âm.
Học tập
Để học bằng cách ghi nhớ các chuỗi sự kiện mà một người đã chứng kiến hoặc trải qua. Đây là tuyến tính và có trật tự.
Học vận động
Nó đang học bằng chuyển động chính xác của các cơ. Ví dụ, chọn đồ vật, viết, v.v.
Học cách quan sát
Học bằng cách xem và bắt chước người khác. Ví dụ, trẻ cố gắng học bằng cách bắt chước bố mẹ.
Học tập tri giác
Nó đang học cách nhận biết những kích thích mà người ta đã thấy trước đây. Ví dụ, xác định và phân loại các đối tượng và tình huống.
Học quan hệ
Nó liên quan đến việc học cách phân biệt giữa các kích thích khác nhau trên cơ sở thuộc tính quan hệ, thay vì thuộc tính tuyệt đối. Ví dụ: Thêm muối 'ít hơn một chút' vào thời điểm nấu khoai tây đã trở nên mặn lần trước, khi nấu chín với thêm một thìa muối.
Spatial Learning - Đó là học thông qua các kích thích thị giác như hình ảnh, màu sắc, bản đồ, vv. Ví dụ, một người có thể tạo ra lộ trình trong đầu trước khi thực sự đi theo con đường.
Stimulus-Response Learning- Nó đang học cách thực hiện một hành vi cụ thể khi có một tác nhân kích thích nào đó. Ví dụ, một con chó dỏng tai lên khi nghe thấy tiếng chuông cửa.
Giải quyết vấn đề
Đó là quá trình một người nhận thức và cố gắng đạt được một giải pháp mong muốn từ tình huống hiện tại bằng cách đi theo một con đường nào đó, bị chặn bởi những rào cản đã biết hoặc chưa biết.
Giải quyết vấn đề cũng bao gồm decision making, là quá trình lựa chọn phương án thay thế phù hợp nhất trong số nhiều phương án để đạt được mục tiêu mong muốn.
Nhận thức
Nó là quá trình thu nhận, giải thích, lựa chọn và tổ chức thông tin cảm tính.
Nhận thức giả định sensing. Ở người, nhận thức được hỗ trợ bởi các cơ quan cảm giác. Trong lĩnh vực của AI, cơ chế nhận thức đặt dữ liệu mà các cảm biến thu được lại với nhau theo cách có ý nghĩa.
Trí tuệ ngôn ngữ
Đó là khả năng sử dụng, hiểu, nói và viết ngôn ngữ nói và viết. Nó quan trọng trong giao tiếp giữa các cá nhân.
Những gì liên quan đến AI
Trí tuệ nhân tạo là một lĩnh vực nghiên cứu rộng lớn. Lĩnh vực nghiên cứu này giúp tìm ra giải pháp cho các vấn đề trong thế giới thực.
Bây giờ chúng ta hãy xem các lĩnh vực nghiên cứu khác nhau trong AI -
Học máy
Đây là một trong những lĩnh vực phổ biến nhất của AI. Khái niệm cơ bản của tệp này là làm cho máy học từ dữ liệu khi con người có thể học hỏi từ kinh nghiệm của mình. Nó chứa các mô hình học tập trên cơ sở đó có thể đưa ra các dự đoán trên dữ liệu chưa biết.
Hợp lý
Đây là một lĩnh vực nghiên cứu quan trọng khác, trong đó logic toán học được sử dụng để thực thi các chương trình máy tính. Nó chứa các quy tắc và dữ kiện để thực hiện đối sánh mẫu, phân tích ngữ nghĩa, v.v.
Đang tìm kiếm
Lĩnh vực nghiên cứu này về cơ bản được sử dụng trong các trò chơi như cờ vua, tic-tac-toe. Các thuật toán tìm kiếm đưa ra giải pháp tối ưu sau khi tìm kiếm trên toàn bộ không gian tìm kiếm.
Mạng lưới thần kinh nhân tạo
Đây là một mạng lưới các hệ thống tính toán hiệu quả, chủ đề trung tâm của nó được vay mượn từ sự tương tự của các mạng thần kinh sinh học. ANN có thể được sử dụng trong rô bốt, nhận dạng giọng nói, xử lý giọng nói, v.v.
Thuật toán di truyền
Các thuật toán di truyền giúp giải quyết các vấn đề với sự hỗ trợ của nhiều chương trình. Kết quả sẽ dựa trên việc chọn người phù hợp nhất.
Trình bày tri thức
Đây là lĩnh vực nghiên cứu với sự trợ giúp của chúng ta có thể trình bày các sự kiện theo cách mà máy móc có thể hiểu được. Tri thức được trình bày hiệu quả hơn; hệ thống càng thông minh.
Ứng dụng của AI
Trong phần này, chúng ta sẽ thấy các trường khác nhau được hỗ trợ bởi AI -
Chơi game
AI đóng vai trò quan trọng trong các trò chơi chiến lược như cờ vua, poker, tic-tac-toe, v.v., nơi máy có thể nghĩ ra một số lượng lớn các vị trí có thể dựa trên kiến thức kinh nghiệm.
Xử lý ngôn ngữ tự nhiên
Có thể tương tác với máy tính hiểu ngôn ngữ tự nhiên của con người.
Những hệ thống chuyên gia
Có một số ứng dụng tích hợp máy móc, phần mềm và thông tin đặc biệt để truyền đạt lý luận và tư vấn. Họ cung cấp giải thích và lời khuyên cho người dùng.
Hệ thống Tầm nhìn
Các hệ thống này hiểu, diễn giải và lĩnh hội đầu vào trực quan trên máy tính. Ví dụ,
Máy bay do thám chụp ảnh, được sử dụng để tìm ra thông tin không gian hoặc bản đồ của các khu vực.
Các bác sĩ sử dụng hệ thống chuyên gia lâm sàng để chẩn đoán cho bệnh nhân.
Cảnh sát sử dụng phần mềm máy tính có thể nhận dạng khuôn mặt của tội phạm với bức chân dung được lưu trữ do nghệ sĩ pháp y thực hiện.
Nhận dạng giọng nói
Một số hệ thống thông minh có khả năng nghe và hiểu ngôn ngữ dưới dạng câu và ý nghĩa của chúng trong khi con người nói chuyện với nó. Nó có thể xử lý các trọng âm khác nhau, các từ lóng, tiếng ồn trong nền, thay đổi tiếng ồn của con người do lạnh, v.v.
Nhận dang chu Viet
Phần mềm nhận dạng chữ viết tay đọc văn bản được viết trên giấy bằng bút hoặc trên màn hình bằng bút cảm ứng. Nó có thể nhận ra hình dạng của các chữ cái và chuyển nó thành văn bản có thể chỉnh sửa.
Robot thông minh
Robot có thể thực hiện các nhiệm vụ do con người giao. Chúng có các cảm biến để phát hiện dữ liệu vật lý từ thế giới thực như ánh sáng, nhiệt, nhiệt độ, chuyển động, âm thanh, va chạm và áp suất. Chúng có bộ xử lý hiệu quả, nhiều cảm biến và bộ nhớ khổng lồ, để thể hiện trí thông minh. Ngoài ra, họ có khả năng học hỏi từ những sai lầm của mình và họ có thể thích nghi với môi trường mới.
Mô hình nhận thức: Mô phỏng quy trình tư duy của con người
Mô hình nhận thức về cơ bản là lĩnh vực nghiên cứu trong khoa học máy tính liên quan đến việc nghiên cứu và mô phỏng quá trình tư duy của con người. Nhiệm vụ chính của AI là làm cho máy móc suy nghĩ giống như con người. Đặc điểm quan trọng nhất của quá trình tư duy của con người là giải quyết vấn đề. Đó là lý do tại sao mô hình nhận thức ít nhiều cố gắng hiểu cách con người có thể giải quyết các vấn đề. Sau đó, mô hình này có thể được sử dụng cho các ứng dụng AI khác nhau như học máy, robot, xử lý ngôn ngữ tự nhiên, v.v. Sau đây là sơ đồ về các cấp độ tư duy khác nhau của não người -
Tác nhân & Môi trường
Trong phần này, chúng tôi sẽ tập trung vào tác nhân và môi trường và cách những tác nhân này giúp ích cho Trí tuệ nhân tạo.
Đặc vụ
Tác nhân là bất cứ thứ gì có thể nhận biết môi trường của nó thông qua các cảm biến và tác động lên môi trường đó thông qua các tác nhân.
A human agent có các cơ quan cảm giác như mắt, tai, mũi, lưỡi và da song song với các cảm biến, và các cơ quan khác như tay, chân, miệng để tạo hiệu ứng.
A robotic agent thay thế máy ảnh và công cụ tìm phạm vi hồng ngoại cho các cảm biến, cũng như các động cơ và bộ truyền động khác nhau cho các hiệu ứng.
A software agent có các chuỗi bit được mã hóa làm chương trình và hành động của nó.
Môi trường
Một số chương trình hoạt động hoàn toàn artificial environment được giới hạn trong đầu vào bàn phím, cơ sở dữ liệu, hệ thống tệp máy tính và đầu ra ký tự trên màn hình.
Ngược lại, một số tác nhân phần mềm (robot phần mềm hoặc softbots) tồn tại trong các miền softbots phong phú, không giới hạn. Trình mô phỏng cóvery detailed, complex environment. Tác nhân phần mềm cần chọn từ một loạt các hành động trong thời gian thực. Một softbot được thiết kế để quét các sở thích trực tuyến của khách hàng và hiển thị các mặt hàng thú vị cho khách hàng hoạt động trongreal cũng như một artificial Môi trường.
Trong chương này, chúng ta sẽ học cách bắt đầu với Python. Chúng ta cũng sẽ hiểu cách Python giúp ích cho Trí tuệ nhân tạo.
Tại sao Python cho AI
Trí tuệ nhân tạo được coi là công nghệ xu hướng của tương lai. Đã có một số ứng dụng được thực hiện trên đó. Do đó, nhiều công ty và nhà nghiên cứu đang quan tâm đến nó. Nhưng câu hỏi chính đặt ra ở đây là các ứng dụng AI này có thể được phát triển bằng ngôn ngữ lập trình nào? Có nhiều ngôn ngữ lập trình khác nhau như Lisp, Prolog, C ++, Java và Python, có thể được sử dụng để phát triển các ứng dụng của AI. Trong số đó, ngôn ngữ lập trình Python trở nên phổ biến rộng rãi và lý do là như sau:
Cú pháp đơn giản và ít mã hóa hơn
Python liên quan đến rất ít mã hóa và cú pháp đơn giản trong số các ngôn ngữ lập trình khác có thể được sử dụng để phát triển các ứng dụng AI. Do tính năng này, việc kiểm tra có thể dễ dàng hơn và chúng ta có thể tập trung hơn vào lập trình.
Các thư viện có sẵn cho các dự án AI
Một lợi thế lớn khi sử dụng Python cho AI là nó đi kèm với các thư viện có sẵn. Python có các thư viện cho hầu hết các loại dự án AI. Ví dụ,NumPy, SciPy, matplotlib, nltk, SimpleAI là một số thư viện có sẵn quan trọng của Python.
Open source- Python là một ngôn ngữ lập trình mã nguồn mở. Điều này làm cho nó phổ biến rộng rãi trong cộng đồng.
Can be used for broad range of programming- Python có thể được sử dụng cho một loạt các tác vụ lập trình như tập lệnh shell nhỏ đến các ứng dụng web doanh nghiệp. Đây là một lý do khác khiến Python phù hợp với các dự án AI.
Các tính năng của Python
Python là một ngôn ngữ kịch bản cấp cao, được thông dịch, tương tác và hướng đối tượng. Python được thiết kế để dễ đọc. Nó sử dụng các từ khóa tiếng Anh thường xuyên khi các ngôn ngữ khác sử dụng dấu câu và nó có ít cấu trúc cú pháp hơn các ngôn ngữ khác. Các tính năng của Python bao gồm:
Easy-to-learn- Python có ít từ khóa, cấu trúc đơn giản và cú pháp được xác định rõ ràng. Điều này cho phép học sinh tiếp thu ngôn ngữ nhanh chóng.
Easy-to-read - Mã Python được xác định rõ ràng hơn và có thể nhìn thấy bằng mắt.
Easy-to-maintain - Mã nguồn của Python khá dễ bảo trì.
A broad standard library - Phần lớn thư viện của Python rất di động và tương thích đa nền tảng trên UNIX, Windows và Macintosh.
Interactive Mode - Python có hỗ trợ chế độ tương tác cho phép kiểm tra tương tác và gỡ lỗi các đoạn mã.
Portable - Python có thể chạy trên nhiều nền tảng phần cứng và có giao diện giống nhau trên tất cả các nền tảng.
Extendable- Chúng ta có thể thêm các mô-đun cấp thấp vào trình thông dịch Python. Các mô-đun này cho phép các lập trình viên thêm vào hoặc tùy chỉnh các công cụ của họ để hiệu quả hơn.
Databases - Python cung cấp giao diện cho tất cả các cơ sở dữ liệu thương mại lớn.
GUI Programming - Python hỗ trợ các ứng dụng GUI có thể được tạo và chuyển sang nhiều lệnh gọi hệ thống, thư viện và hệ thống cửa sổ, chẳng hạn như Windows MFC, Macintosh và hệ thống X Window của Unix.
Scalable - Python cung cấp một cấu trúc tốt hơn và hỗ trợ cho các chương trình lớn hơn so với kịch bản shell.
Các tính năng quan trọng của Python
Bây giờ chúng ta hãy xem xét các tính năng quan trọng sau của Python:
Nó hỗ trợ các phương pháp lập trình có cấu trúc và chức năng cũng như OOP.
Nó có thể được sử dụng như một ngôn ngữ kịch bản hoặc có thể được biên dịch thành mã byte để xây dựng các ứng dụng lớn.
Nó cung cấp các kiểu dữ liệu động cấp rất cao và hỗ trợ kiểm tra kiểu động.
Nó hỗ trợ thu gom rác tự động.
Nó có thể dễ dàng tích hợp với C, C ++, COM, ActiveX, CORBA và Java.
Cài đặt Python
Phân phối Python có sẵn cho một số lượng lớn nền tảng. Bạn chỉ cần tải xuống mã nhị phân áp dụng cho nền tảng của mình và cài đặt Python.
Nếu mã nhị phân cho nền tảng của bạn không có sẵn, bạn cần trình biên dịch C để biên dịch mã nguồn theo cách thủ công. Việc biên dịch mã nguồn mang lại sự linh hoạt hơn trong việc lựa chọn các tính năng mà bạn yêu cầu trong cài đặt của mình.
Dưới đây là tổng quan nhanh về cài đặt Python trên các nền tảng khác nhau -
Cài đặt Unix và Linux
Làm theo các bước sau để cài đặt Python trên máy Unix / Linux.
Mở trình duyệt Web và truy cập https://www.python.org/downloads
Nhấp vào liên kết để tải xuống mã nguồn nén có sẵn cho Unix / Linux.
Tải xuống và giải nén tệp.
Chỉnh sửa tệp Mô-đun / Thiết lập nếu bạn muốn tùy chỉnh một số tùy chọn.
chạy tập lệnh ./configure
make
thực hiện cài đặt
Điều này cài đặt Python tại vị trí tiêu chuẩn / usr / local / bin và các thư viện của nó tại / usr / local / lib / pythonXX trong đó XX là phiên bản của Python.
Cài đặt Windows
Làm theo các bước sau để cài đặt Python trên máy Windows.
Mở trình duyệt Web và truy cập https://www.python.org/downloads
Nhấp vào liên kết cho tệp .msi python-XYZ của trình cài đặt Windows , trong đó XYZ là phiên bản bạn cần cài đặt.
Để sử dụng trình cài đặt này python-XYZ .msi, hệ thống Windows phải hỗ trợ Microsoft Installer 2.0. Lưu tệp trình cài đặt vào máy cục bộ của bạn và sau đó chạy nó để tìm hiểu xem máy của bạn có hỗ trợ MSI hay không.
Chạy tệp đã tải xuống. Thao tác này sẽ hiển thị trình hướng dẫn cài đặt Python, rất dễ sử dụng. Chỉ cần chấp nhận cài đặt mặc định và đợi cho đến khi quá trình cài đặt hoàn tất.
Cài đặt Macintosh
Nếu bạn đang sử dụng Mac OS X, bạn nên sử dụng Homebrew để cài đặt Python 3. Đây là một trình cài đặt gói tuyệt vời dành cho Mac OS X và nó thực sự dễ sử dụng. Nếu bạn không có Homebrew, bạn có thể cài đặt nó bằng lệnh sau:
$ ruby -e "$(curl -fsSL
https://raw.githubusercontent.com/Homebrew/install/master/install)"
Chúng tôi có thể cập nhật trình quản lý gói bằng lệnh bên dưới:
$ brew update
Bây giờ hãy chạy lệnh sau để cài đặt Python3 trên hệ thống của bạn:
$ brew install python3
Thiết lập PATH
Chương trình và các tệp thực thi khác có thể nằm trong nhiều thư mục, vì vậy hệ điều hành cung cấp một đường dẫn tìm kiếm liệt kê các thư mục mà hệ điều hành tìm kiếm tệp thực thi.
Đường dẫn được lưu trữ trong một biến môi trường, là một chuỗi có tên được duy trì bởi hệ điều hành. Biến này chứa thông tin có sẵn cho trình bao lệnh và các chương trình khác.
Biến đường dẫn được đặt tên là PATH trong Unix hoặc Path trong Windows (Unix phân biệt chữ hoa chữ thường; Windows thì không).
Trong Mac OS, trình cài đặt xử lý chi tiết đường dẫn. Để gọi trình thông dịch Python từ bất kỳ thư mục cụ thể nào, bạn phải thêm thư mục Python vào đường dẫn của mình.
Thiết lập đường dẫn tại Unix / Linux
Để thêm thư mục Python vào đường dẫn cho một phiên cụ thể trong Unix -
Trong vỏ csh
Kiểu setenv PATH "$PATH:/usr/local/bin/python" và hãy nhấn Enter.
Trong bash shell (Linux)
Kiểu export ATH = "$PATH:/usr/local/bin/python" và hãy nhấn Enter.
Trong vỏ sh hoặc ksh
Kiểu PATH = "$PATH:/usr/local/bin/python" và hãy nhấn Enter.
Note - / usr / local / bin / python là đường dẫn của thư mục Python.
Thiết lập đường dẫn trên Windows
Để thêm thư mục Python vào đường dẫn cho một phiên cụ thể trong Windows -
At the command prompt - loại path %path%;C:\Python và hãy nhấn Enter.
Note - C: \ Python là đường dẫn của thư mục Python.
Chạy Python
Bây giờ chúng ta hãy xem các cách khác nhau để chạy Python. Các cách được mô tả bên dưới -
Phiên dịch tương tác
Chúng ta có thể khởi động Python từ Unix, DOS hoặc bất kỳ hệ thống nào khác cung cấp cho bạn trình thông dịch dòng lệnh hoặc cửa sổ shell.
Đi vào python tại dòng lệnh.
Bắt đầu viết mã ngay trong trình thông dịch tương tác.
$python # Unix/Linux
hoặc là
python% # Unix/Linux
hoặc là
C:> python # Windows/DOS
Đây là danh sách tất cả các tùy chọn dòng lệnh có sẵn:
Không. | Tùy chọn & Mô tả |
---|---|
1 | -d Nó cung cấp đầu ra gỡ lỗi. |
2 | -o Nó tạo bytecode được tối ưu hóa (tạo ra các tệp .pyo). |
3 | -S Không chạy trang web nhập để tìm đường dẫn Python khi khởi động. |
4 | -v Đầu ra chi tiết (theo dõi chi tiết trên các báo cáo nhập khẩu). |
5 | -x Vô hiệu hóa các ngoại lệ tích hợp dựa trên lớp (chỉ sử dụng chuỗi); lỗi thời bắt đầu từ phiên bản 1.6. |
6 | -c cmd Chạy tập lệnh Python được gửi dưới dạng chuỗi cmd. |
7 | File Chạy tập lệnh Python từ tệp đã cho. |
Tập lệnh từ dòng lệnh
Một tập lệnh Python có thể được thực thi tại dòng lệnh bằng cách gọi trình thông dịch trên ứng dụng của bạn, như sau:
$python script.py # Unix/Linux
hoặc là,
python% script.py # Unix/Linux
hoặc là,
C:> python script.py # Windows/DOS
Note - Đảm bảo chế độ cho phép tệp cho phép thực thi.
Môi trường phát triển tích hợp
Bạn cũng có thể chạy Python từ môi trường Giao diện người dùng đồ họa (GUI), nếu bạn có ứng dụng GUI trên hệ thống của mình hỗ trợ Python.
Unix - IDLE là Unix IDE đầu tiên dành cho Python.
Windows - PythonWin là giao diện Windows đầu tiên dành cho Python và là một IDE có GUI.
Macintosh - Phiên bản Python của Macintosh cùng với IDLE IDE có sẵn trên trang web chính, có thể tải xuống dưới dạng tệp MacBinary hoặc BinHex'd.
Nếu bạn không thể thiết lập môi trường đúng cách, bạn có thể nhờ quản trị viên hệ thống của mình trợ giúp. Đảm bảo rằng môi trường Python được thiết lập đúng cách và hoạt động hoàn toàn tốt.
Chúng tôi cũng có thể sử dụng một nền tảng Python khác có tên là Anaconda. Nó bao gồm hàng trăm gói khoa học dữ liệu phổ biến và gói conda và trình quản lý môi trường ảo cho Windows, Linux và MacOS. Bạn có thể tải xuống theo hệ điều hành của mình từ liên kếthttps://www.anaconda.com/download/.
Đối với hướng dẫn này, chúng tôi đang sử dụng phiên bản Python 3.6.3 trên MS Windows.
Học tập có nghĩa là thu nhận kiến thức hoặc kỹ năng thông qua học tập hoặc kinh nghiệm. Dựa trên điều này, chúng ta có thể định nghĩa học máy (ML) như sau:
Nó có thể được định nghĩa là lĩnh vực khoa học máy tính, cụ thể hơn là một ứng dụng của trí tuệ nhân tạo, cung cấp cho các hệ thống máy tính khả năng học hỏi với dữ liệu và cải thiện từ kinh nghiệm mà không cần được lập trình rõ ràng.
Về cơ bản, trọng tâm chính của học máy là cho phép máy tính học tự động mà không cần sự can thiệp của con người. Bây giờ câu hỏi đặt ra là việc học như vậy có thể được bắt đầu và thực hiện như thế nào? Nó có thể được bắt đầu với việc quan sát dữ liệu. Dữ liệu có thể là một số ví dụ, hướng dẫn hoặc một số kinh nghiệm trực tiếp. Sau đó, trên cơ sở đầu vào này, máy đưa ra quyết định tốt hơn bằng cách tìm kiếm một số mẫu trong dữ liệu.
Các loại máy học (ML)
Thuật toán học máy giúp hệ thống máy tính học mà không cần được lập trình rõ ràng. Các thuật toán này được phân loại thành có giám sát hoặc không được giám sát. Bây giờ chúng ta hãy xem một vài thuật toán -
Các thuật toán học máy được giám sát
Đây là thuật toán học máy được sử dụng phổ biến nhất. Nó được gọi là có giám sát vì quá trình học thuật toán từ tập dữ liệu đào tạo có thể được coi như một giáo viên giám sát quá trình học tập. Trong loại thuật toán ML này, các kết quả có thể đã được biết trước và dữ liệu huấn luyện cũng được gắn nhãn với các câu trả lời đúng. Nó có thể được hiểu như sau:
Giả sử chúng ta có các biến đầu vào x và một biến đầu ra y và chúng tôi đã áp dụng một thuật toán để học hàm ánh xạ từ đầu vào đến đầu ra, chẳng hạn như:
Y = f(x)
Bây giờ, mục tiêu chính là xấp xỉ hàm ánh xạ tốt đến mức khi chúng ta có dữ liệu đầu vào mới (x), chúng ta có thể dự đoán biến đầu ra (Y) cho dữ liệu đó.
Các vấn đề về tinh gọn được giám sát chủ yếu có thể được chia thành hai loại vấn đề sau:
Classification - Một vấn đề được gọi là bài toán phân loại khi chúng ta có đầu ra được phân loại như “đen”, “dạy”, “không dạy”, v.v.
Regression - Một bài toán được gọi là bài toán hồi quy khi chúng ta có đầu ra giá trị thực như “khoảng cách”, “kilôgam”, v.v.
Cây quyết định, rừng ngẫu nhiên, knn, hồi quy logistic là các ví dụ của thuật toán học máy có giám sát.
Các thuật toán học máy không được giám sát
Như tên cho thấy, các loại thuật toán học máy này không có bất kỳ người giám sát nào để cung cấp bất kỳ loại hướng dẫn nào. Đó là lý do tại sao các thuật toán học máy không được giám sát phù hợp chặt chẽ với cái mà một số người gọi là trí tuệ nhân tạo thực sự. Nó có thể được hiểu như sau:
Giả sử chúng ta có biến đầu vào x, thì sẽ không có biến đầu ra tương ứng như trong thuật toán học có giám sát.
Nói một cách dễ hiểu, chúng ta có thể nói rằng trong học tập không có giám sát sẽ không có câu trả lời chính xác và không có giáo viên hướng dẫn. Các thuật toán giúp khám phá các mẫu thú vị trong dữ liệu.
Các vấn đề học tập không được giám sát có thể được chia thành hai loại vấn đề sau:
Clustering- Trong các bài toán phân cụm, chúng ta cần khám phá các phân nhóm vốn có trong dữ liệu. Ví dụ, phân nhóm khách hàng theo hành vi mua hàng của họ.
Association- Một vấn đề được gọi là vấn đề kết hợp bởi vì những loại vấn đề như vậy yêu cầu khám phá các quy tắc mô tả phần lớn dữ liệu của chúng ta. Ví dụ: tìm khách hàng mua cả haix và y.
K-mean để phân cụm, thuật toán Apriori cho liên kết là những ví dụ về thuật toán học máy không giám sát.
Củng cố thuật toán học máy
Các loại thuật toán học máy này được sử dụng rất ít. Các thuật toán này huấn luyện hệ thống đưa ra các quyết định cụ thể. Về cơ bản, máy được tiếp xúc với môi trường nơi nó tự đào tạo liên tục bằng phương pháp thử và sai. Các thuật toán này học hỏi từ kinh nghiệm trong quá khứ và cố gắng nắm bắt kiến thức tốt nhất có thể để đưa ra quyết định chính xác. Quy trình quyết định Markov là một ví dụ về các thuật toán học máy tăng cường.
Các thuật toán học máy phổ biến nhất
Trong phần này, chúng ta sẽ tìm hiểu về các thuật toán học máy phổ biến nhất. Các thuật toán được mô tả bên dưới:
Hồi quy tuyến tính
Nó là một trong những thuật toán nổi tiếng nhất trong thống kê và học máy.
Khái niệm cơ bản - Hồi quy tuyến tính chủ yếu là một mô hình tuyến tính giả định mối quan hệ tuyến tính giữa các biến đầu vào là x và biến đầu ra duy nhất là y. Nói cách khác, chúng ta có thể nói rằng y có thể được tính toán từ sự kết hợp tuyến tính của các biến đầu vào x. Mối quan hệ giữa các biến có thể được thiết lập bằng cách lắp một dòng tốt nhất.
Các loại hồi quy tuyến tính
Hồi quy tuyến tính có hai loại sau:
Simple linear regression - Thuật toán hồi quy tuyến tính được gọi là hồi quy tuyến tính đơn giản nếu nó chỉ có một biến độc lập.
Multiple linear regression - Một thuật toán hồi quy tuyến tính được gọi là hồi quy nhiều tuyến tính nếu nó có nhiều hơn một biến độc lập.
Hồi quy tuyến tính chủ yếu được sử dụng để ước tính các giá trị thực dựa trên (các) biến liên tục. Ví dụ: tổng doanh thu của một cửa hàng trong một ngày, dựa trên giá trị thực, có thể được ước tính bằng hồi quy tuyến tính.
Hồi quy logistic
Nó là một thuật toán phân loại và còn được gọi là logit hồi quy.
Chủ yếu hồi quy logistic là một thuật toán phân loại được sử dụng để ước tính các giá trị rời rạc như 0 hoặc 1, đúng hoặc sai, có hoặc không dựa trên một tập hợp các biến độc lập nhất định. Về cơ bản, nó dự đoán xác suất do đó đầu ra của nó nằm trong khoảng từ 0 đến 1.
Cây quyết định
Cây quyết định là một thuật toán học có giám sát được sử dụng chủ yếu cho các bài toán phân loại.
Về cơ bản nó là một bộ phân loại được biểu diễn dưới dạng phân vùng đệ quy dựa trên các biến độc lập. Cây quyết định có các nút tạo thành cây gốc. Cây có gốc là cây có hướng với một nút được gọi là "gốc". Gốc không có bất kỳ cạnh nào và tất cả các nút khác đều có một cạnh đến. Các nút này được gọi là lá hoặc nút quyết định. Ví dụ, hãy xem xét cây quyết định sau đây để xem liệu một người có phù hợp hay không.
Máy vectơ hỗ trợ (SVM)
Nó được sử dụng cho cả vấn đề phân loại và hồi quy. Nhưng chủ yếu nó được sử dụng cho các bài toán phân loại. Khái niệm chính của SVM là vẽ mỗi mục dữ liệu là một điểm trong không gian n chiều với giá trị của mỗi đối tượng là giá trị của một tọa độ cụ thể. Đây n sẽ là các tính năng chúng tôi sẽ có. Sau đây là một biểu diễn đồ họa đơn giản để hiểu khái niệm về SVM -
Trong sơ đồ trên, chúng ta có hai đặc trưng, do đó trước tiên chúng ta cần vẽ hai biến này trong không gian hai chiều nơi mỗi điểm có hai tọa độ, được gọi là vectơ hỗ trợ. Dòng chia dữ liệu thành hai nhóm được phân loại khác nhau. Dòng này sẽ là bộ phân loại.
Naïve Bayes
Nó cũng là một kỹ thuật phân loại. Logic đằng sau kỹ thuật phân loại này là sử dụng định lý Bayes để xây dựng các bộ phân loại. Giả định là các yếu tố dự đoán là độc lập. Nói cách đơn giản, nó giả định rằng sự hiện diện của một đối tượng cụ thể trong một lớp không liên quan đến sự hiện diện của bất kỳ đối tượng địa lý nào khác. Dưới đây là phương trình cho định lý Bayes -
$$ P \ left (\ frac {A} {B} \ right) = \ frac {P \ left (\ frac {B} {A} \ right) P \ left (A \ right)} {P \ left ( B \ right)} $$
Mô hình Naïve Bayes rất dễ xây dựng và đặc biệt hữu ích cho các tập dữ liệu lớn.
K-Hàng xóm gần nhất (KNN)
Nó được sử dụng để phân loại và hồi quy các vấn đề. Nó được sử dụng rộng rãi để giải quyết các vấn đề phân loại. Khái niệm chính của thuật toán này là nó được sử dụng để lưu trữ tất cả các trường hợp có sẵn và phân loại các trường hợp mới theo đa số phiếu bầu của k hàng xóm của nó. Sau đó, trường hợp được gán cho lớp phổ biến nhất trong số các hàng xóm K gần nhất của nó, được đo bằng hàm khoảng cách. Hàm khoảng cách có thể là khoảng cách Euclidean, Minkowski và Hamming. Hãy xem xét những điều sau để sử dụng KNN -
Về mặt tính toán KNN đắt hơn các thuật toán khác được sử dụng cho các bài toán phân loại.
Việc chuẩn hóa các biến cần thiết, nếu không, các biến phạm vi cao hơn có thể làm sai lệch nó.
Trong KNN, chúng ta cần làm việc ở giai đoạn tiền xử lý như loại bỏ nhiễu.
K-Means Clustering
Như tên cho thấy, nó được sử dụng để giải quyết các vấn đề phân cụm. Về cơ bản nó là một kiểu học không giám sát. Logic chính của thuật toán phân cụm K-Means là phân loại tập dữ liệu thông qua một số cụm. Thực hiện theo các bước sau để tạo cụm bằng K-means -
K-mean chọn k số điểm cho mỗi cụm được gọi là trung tâm.
Bây giờ mỗi điểm dữ liệu tạo thành một cụm với các tâm gần nhất, tức là k cụm.
Bây giờ, nó sẽ tìm các trung tâm của mỗi cụm dựa trên các thành viên cụm hiện có.
Chúng ta cần lặp lại các bước này cho đến khi sự hội tụ xảy ra.
Rừng ngẫu nhiên
Nó là một thuật toán phân loại có giám sát. Ưu điểm của thuật toán rừng ngẫu nhiên là nó có thể được sử dụng cho cả loại bài toán phân loại và hồi quy. Về cơ bản nó là tập hợp các cây quyết định (tức là rừng) hay bạn có thể nói là tập hợp các cây quyết định. Khái niệm cơ bản của rừng ngẫu nhiên là mỗi cây đưa ra một phân loại và khu rừng chọn những phân loại tốt nhất từ chúng. Tiếp theo là những ưu điểm của thuật toán Rừng ngẫu nhiên -
Bộ phân loại rừng ngẫu nhiên có thể được sử dụng cho cả nhiệm vụ phân loại và hồi quy.
Họ có thể xử lý các giá trị bị thiếu.
Nó sẽ không phù hợp với mô hình ngay cả khi chúng ta có nhiều cây hơn trong rừng.
Chúng tôi đã nghiên cứu các thuật toán học máy có giám sát cũng như không được giám sát. Các thuật toán này yêu cầu dữ liệu được định dạng để bắt đầu quá trình đào tạo. Chúng ta phải chuẩn bị hoặc định dạng dữ liệu theo một cách nhất định để nó có thể được cung cấp làm đầu vào cho các thuật toán ML.
Chương này tập trung vào việc chuẩn bị dữ liệu cho các thuật toán học máy.
Xử lý trước dữ liệu
Trong cuộc sống hàng ngày, chúng ta xử lý rất nhiều dữ liệu nhưng dữ liệu này ở dạng thô. Để cung cấp dữ liệu làm đầu vào của các thuật toán học máy, chúng ta cần chuyển nó thành một dữ liệu có ý nghĩa. Đó là nơi mà quá trình tiền xử lý dữ liệu trở thành hình ảnh. Nói cách khác, chúng ta có thể nói rằng trước khi cung cấp dữ liệu cho các thuật toán học máy, chúng ta cần phải xử lý trước dữ liệu.
Các bước xử lý trước dữ liệu
Làm theo các bước sau để xử lý trước dữ liệu bằng Python -
Step 1 − Importing the useful packages - Nếu chúng ta đang sử dụng Python thì đây sẽ là bước đầu tiên để chuyển đổi dữ liệu sang một định dạng nhất định, tức là tiền xử lý. Nó có thể được thực hiện như sau:
import numpy as np
import sklearn.preprocessing
Ở đây chúng tôi đã sử dụng hai gói sau:
NumPy - Về cơ bản NumPy là một gói xử lý mảng đa chiều được thiết kế để thao tác hiệu quả các mảng đa chiều lớn của các bản ghi tùy ý mà không phải hy sinh quá nhiều tốc độ cho các mảng đa chiều nhỏ.
Sklearn.preprocessing - Gói này cung cấp nhiều hàm tiện ích phổ biến và các lớp biến áp để thay đổi các vectơ đặc trưng thô thành một biểu diễn phù hợp hơn với các thuật toán học máy.
Step 2 − Defining sample data - Sau khi nhập các gói, chúng ta cần xác định một số dữ liệu mẫu để có thể áp dụng các kỹ thuật tiền xử lý trên dữ liệu đó. Bây giờ chúng ta sẽ xác định dữ liệu mẫu sau:
input_data = np.array([2.1, -1.9, 5.5],
[-1.5, 2.4, 3.5],
[0.5, -7.9, 5.6],
[5.9, 2.3, -5.8])
Step3 − Applying preprocessing technique - Trong bước này, chúng ta cần áp dụng bất kỳ kỹ thuật tiền xử lý nào.
Phần sau đây mô tả các kỹ thuật tiền xử lý dữ liệu.
Kỹ thuật tiền xử lý dữ liệu
Các kỹ thuật để xử lý trước dữ liệu được mô tả dưới đây:
Binarization
Đây là kỹ thuật tiền xử lý được sử dụng khi chúng ta cần chuyển đổi các giá trị số thành các giá trị Boolean. Chúng ta có thể sử dụng một phương thức có sẵn để mã hóa dữ liệu đầu vào bằng cách sử dụng 0,5 làm giá trị ngưỡng theo cách sau:
data_binarized = preprocessing.Binarizer(threshold = 0.5).transform(input_data)
print("\nBinarized data:\n", data_binarized)
Bây giờ, sau khi chạy đoạn mã trên, chúng ta sẽ nhận được kết quả sau, tất cả các giá trị trên 0,5 (giá trị ngưỡng) sẽ được chuyển thành 1 và tất cả các giá trị dưới 0,5 sẽ được chuyển thành 0.
Binarized data
[[ 1. 0. 1.]
[ 0. 1. 1.]
[ 0. 0. 1.]
[ 1. 1. 0.]]
Loại bỏ trung bình
Đây là một kỹ thuật tiền xử lý rất phổ biến khác được sử dụng trong học máy. Về cơ bản, nó được sử dụng để loại bỏ giá trị trung bình khỏi vectơ đặc trưng để mọi đối tượng đều được căn giữa bằng 0. Chúng tôi cũng có thể xóa sai lệch khỏi các đối tượng trong vectơ đối tượng. Để áp dụng kỹ thuật tiền xử lý loại bỏ trung bình trên dữ liệu mẫu, chúng ta có thể viết mã Python được hiển thị bên dưới. Mã sẽ hiển thị Độ lệch trung bình và Độ lệch chuẩn của dữ liệu đầu vào -
print("Mean = ", input_data.mean(axis = 0))
print("Std deviation = ", input_data.std(axis = 0))
Chúng ta sẽ nhận được đầu ra sau khi chạy các dòng mã trên:
Mean = [ 1.75 -1.275 2.2]
Std deviation = [ 2.71431391 4.20022321 4.69414529]
Bây giờ, đoạn mã dưới đây sẽ loại bỏ Độ lệch trung bình và Độ lệch chuẩn của dữ liệu đầu vào -
data_scaled = preprocessing.scale(input_data)
print("Mean =", data_scaled.mean(axis=0))
print("Std deviation =", data_scaled.std(axis = 0))
Chúng ta sẽ nhận được đầu ra sau khi chạy các dòng mã trên:
Mean = [ 1.11022302e-16 0.00000000e+00 0.00000000e+00]
Std deviation = [ 1. 1. 1.]
Mở rộng quy mô
Nó là một kỹ thuật tiền xử lý dữ liệu khác được sử dụng để chia tỷ lệ các vectơ đặc trưng. Chia tỷ lệ của vectơ đối tượng là cần thiết vì giá trị của mọi đối tượng có thể khác nhau giữa nhiều giá trị ngẫu nhiên. Nói cách khác, chúng ta có thể nói rằng việc mở rộng quy mô là quan trọng bởi vì chúng tôi không muốn bất kỳ đối tượng địa lý nào là tổng hợp lớn hay nhỏ. Với sự trợ giúp của mã Python sau, chúng tôi có thể thực hiện việc mở rộng dữ liệu đầu vào của mình, tức là vectơ đặc trưng -
# Min max scaling
data_scaler_minmax = preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaled_minmax = data_scaler_minmax.fit_transform(input_data)
print ("\nMin max scaled data:\n", data_scaled_minmax)
Chúng ta sẽ nhận được đầu ra sau khi chạy các dòng mã trên:
Min max scaled data
[ [ 0.48648649 0.58252427 0.99122807]
[ 0. 1. 0.81578947]
[ 0.27027027 0. 1. ]
[ 1. 0. 99029126 0. ]]
Bình thường hóa
Nó là một kỹ thuật tiền xử lý dữ liệu khác được sử dụng để sửa đổi các vectơ đặc trưng. Loại sửa đổi như vậy là cần thiết để đo các vectơ đặc trưng trên một tỷ lệ chung. Tiếp theo là hai loại chuẩn hóa có thể được sử dụng trong học máy -
L1 Normalization
Nó cũng được gọi là Least Absolute Deviations. Loại chuẩn hóa này sửa đổi các giá trị để tổng các giá trị tuyệt đối luôn lên đến 1 trong mỗi hàng. Nó có thể được triển khai trên dữ liệu đầu vào với sự trợ giúp của mã Python sau:
# Normalize data
data_normalized_l1 = preprocessing.normalize(input_data, norm = 'l1')
print("\nL1 normalized data:\n", data_normalized_l1)
Dòng mã trên tạo ra kết quả & miuns;
L1 normalized data:
[[ 0.22105263 -0.2 0.57894737]
[ -0.2027027 0.32432432 0.47297297]
[ 0.03571429 -0.56428571 0.4 ]
[ 0.42142857 0.16428571 -0.41428571]]
L2 Normalization
Nó cũng được gọi là least squares. Loại chuẩn hóa này sửa đổi các giá trị để tổng các ô vuông luôn lên đến 1 trong mỗi hàng. Nó có thể được triển khai trên dữ liệu đầu vào với sự trợ giúp của mã Python sau:
# Normalize data
data_normalized_l2 = preprocessing.normalize(input_data, norm = 'l2')
print("\nL2 normalized data:\n", data_normalized_l2)
Dòng mã trên sẽ tạo ra kết quả sau:
L2 normalized data:
[[ 0.33946114 -0.30713151 0.88906489]
[ -0.33325106 0.53320169 0.7775858 ]
[ 0.05156558 -0.81473612 0.57753446]
[ 0.68706914 0.26784051 -0.6754239 ]]
Gắn nhãn dữ liệu
Chúng ta đã biết rằng dữ liệu ở một định dạng nhất định là cần thiết cho các thuật toán học máy. Một yêu cầu quan trọng khác là dữ liệu phải được dán nhãn thích hợp trước khi gửi nó như là đầu vào của các thuật toán học máy. Ví dụ, nếu chúng ta nói về phân loại, có rất nhiều nhãn trên dữ liệu. Các nhãn đó ở dạng từ, số, v.v. Các chức năng liên quan đến học máy trongsklearnmong đợi rằng dữ liệu phải có nhãn số. Do đó, nếu dữ liệu ở dạng khác thì nó phải được chuyển đổi thành số. Quá trình biến đổi các nhãn từ thành dạng số được gọi là mã hóa nhãn.
Các bước mã hóa nhãn
Làm theo các bước sau để mã hóa các nhãn dữ liệu bằng Python -
Step1 − Importing the useful packages
Nếu chúng ta đang sử dụng Python thì đây sẽ là bước đầu tiên để chuyển đổi dữ liệu sang định dạng nhất định, tức là tiền xử lý. Nó có thể được thực hiện như sau:
import numpy as np
from sklearn import preprocessing
Step 2 − Defining sample labels
Sau khi nhập các gói, chúng ta cần xác định một số nhãn mẫu để chúng ta có thể tạo và đào tạo bộ mã hóa nhãn. Bây giờ chúng ta sẽ xác định các nhãn mẫu sau:
# Sample input labels
input_labels = ['red','black','red','green','black','yellow','white']
Step 3 − Creating & training of label encoder object
Trong bước này, chúng ta cần tạo bộ mã hóa nhãn và đào tạo nó. Đoạn mã Python sau sẽ giúp thực hiện việc này:
# Creating the label encoder
encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)
Sau đây sẽ là đầu ra sau khi chạy mã Python ở trên:
LabelEncoder()
Step4 − Checking the performance by encoding random ordered list
Bước này có thể được sử dụng để kiểm tra hiệu suất bằng cách mã hóa danh sách được sắp xếp ngẫu nhiên. Mã Python sau có thể được viết để làm tương tự:
# encoding a set of labels
test_labels = ['green','red','black']
encoded_values = encoder.transform(test_labels)
print("\nLabels =", test_labels)
Các nhãn sẽ được in như sau:
Labels = ['green', 'red', 'black']
Bây giờ, chúng ta có thể nhận được danh sách các giá trị được mã hóa tức là các nhãn từ được chuyển đổi thành số như sau:
print("Encoded values =", list(encoded_values))
Các giá trị được mã hóa sẽ được in như sau:
Encoded values = [1, 2, 0]
Step 5 − Checking the performance by decoding a random set of numbers −
Bước này có thể được sử dụng để kiểm tra hiệu suất bằng cách giải mã bộ số ngẫu nhiên. Mã Python sau có thể được viết để làm tương tự:
# decoding a set of values
encoded_values = [3,0,4,1]
decoded_list = encoder.inverse_transform(encoded_values)
print("\nEncoded values =", encoded_values)
Bây giờ, các giá trị được mã hóa sẽ được in như sau:
Encoded values = [3, 0, 4, 1]
print("\nDecoded labels =", list(decoded_list))
Bây giờ, các giá trị được giải mã sẽ được in như sau:
Decoded labels = ['white', 'black', 'yellow', 'green']
Dữ liệu không được gắn nhãn v / s được gắn nhãn
Dữ liệu không được gắn nhãn chủ yếu bao gồm các mẫu vật thể tự nhiên hoặc do con người tạo ra có thể dễ dàng lấy được từ thế giới. Chúng bao gồm âm thanh, video, ảnh, tin bài, v.v.
Mặt khác, dữ liệu được gắn nhãn lấy một tập hợp dữ liệu không được gắn nhãn và tăng cường mỗi phần của dữ liệu không được gắn nhãn đó với một số thẻ hoặc nhãn hoặc lớp có ý nghĩa. Ví dụ, nếu chúng ta có một bức ảnh thì nhãn có thể được đặt dựa trên nội dung của bức ảnh, tức là, đó là ảnh của một bé trai hoặc bé gái hoặc động vật hoặc bất cứ thứ gì khác. Việc gắn nhãn dữ liệu cần có chuyên môn hoặc sự đánh giá của con người về một phần dữ liệu chưa được gắn nhãn nhất định.
Có nhiều tình huống trong đó dữ liệu không được gắn nhãn rất dồi dào và dễ dàng lấy được nhưng dữ liệu được gắn nhãn thường yêu cầu con người / chuyên gia chú thích. Học tập bán giám sát cố gắng kết hợp dữ liệu được gắn nhãn và không được gắn nhãn để xây dựng các mô hình tốt hơn.
Trong chương này, chúng ta sẽ tập trung vào việc thực hiện phân loại - học có giám sát.
Kỹ thuật phân loại hoặc mô hình cố gắng thu được một số kết luận từ các giá trị quan sát được. Trong bài toán phân loại, chúng ta có đầu ra được phân loại như “Đen” hoặc “trắng” hoặc “Dạy” và “Không dạy”. Trong khi xây dựng mô hình phân loại, chúng ta cần có tập dữ liệu huấn luyện chứa các điểm dữ liệu và các nhãn tương ứng. Ví dụ, nếu chúng ta muốn kiểm tra xem hình ảnh có phải của một chiếc ô tô hay không. Để kiểm tra điều này, chúng tôi sẽ xây dựng một tập dữ liệu đào tạo có hai lớp liên quan đến “xe hơi” và “không xe hơi”. Sau đó, chúng ta cần đào tạo mô hình bằng cách sử dụng các mẫu đào tạo. Các mô hình phân loại chủ yếu được sử dụng trong nhận dạng khuôn mặt, nhận dạng thư rác, v.v.
Các bước để xây dựng bộ phân loại bằng Python
Để xây dựng bộ phân loại bằng Python, chúng ta sẽ sử dụng Python 3 và Scikit-learning là một công cụ dành cho học máy. Làm theo các bước sau để xây dựng bộ phân loại bằng Python -
Bước 1 - Nhập Scikit-learning
Đây sẽ là bước đầu tiên để xây dựng một bộ phân loại trong Python. Trong bước này, chúng tôi sẽ cài đặt một gói Python có tên là Scikit-learning, một trong những mô-đun học máy tốt nhất trong Python. Lệnh sau sẽ giúp chúng tôi nhập gói:
Import Sklearn
Bước 2 - Nhập bộ dữ liệu của Scikit-learning
Trong bước này, chúng ta có thể bắt đầu làm việc với tập dữ liệu cho mô hình học máy của mình. Ở đây, chúng tôi sẽ sử dụngthe Cơ sở dữ liệu chẩn đoán ung thư vú Wisconsin. Bộ dữ liệu bao gồm nhiều thông tin khác nhau về các khối u ung thư vú, cũng như các nhãn phân loại củamalignant hoặc là benign. Tập dữ liệu có 569 trường hợp hoặc dữ liệu về 569 khối u và bao gồm thông tin về 30 thuộc tính hoặc đặc điểm, chẳng hạn như bán kính của khối u, kết cấu, độ mịn và diện tích. Với sự trợ giúp của lệnh sau, chúng tôi có thể nhập bộ dữ liệu ung thư vú của Scikit-learning -
from sklearn.datasets import load_breast_cancer
Bây giờ, lệnh sau sẽ tải tập dữ liệu.
data = load_breast_cancer()
Sau đây là danh sách các khóa từ điển quan trọng -
- Tên nhãn phân loại (target_names)
- Các nhãn thực tế (mục tiêu)
- Các tên thuộc tính / đối tượng (feature_names)
- Thuộc tính (dữ liệu)
Bây giờ, với sự trợ giúp của lệnh sau, chúng ta có thể tạo các biến mới cho từng tập thông tin quan trọng và gán dữ liệu. Nói cách khác, chúng ta có thể tổ chức dữ liệu bằng các lệnh sau:
label_names = data['target_names']
labels = data['target']
feature_names = data['feature_names']
features = data['data']
Bây giờ, để làm rõ ràng hơn, chúng ta có thể in nhãn lớp, nhãn của cá thể dữ liệu đầu tiên, tên đối tượng của chúng ta và giá trị của đối tượng với sự trợ giúp của các lệnh sau:
print(label_names)
Lệnh trên sẽ in tên lớp tương ứng là ác tính và lành tính. Nó được hiển thị như đầu ra bên dưới:
['malignant' 'benign']
Bây giờ, lệnh dưới đây sẽ cho thấy rằng chúng được ánh xạ tới các giá trị nhị phân 0 và 1. Ở đây 0 đại diện cho ung thư ác tính và 1 đại diện cho ung thư lành tính. Bạn sẽ nhận được kết quả sau:
print(labels[0])
0
Hai lệnh dưới đây sẽ tạo ra tên đối tượng và giá trị đối tượng địa lý.
print(feature_names[0])
mean radius
print(features[0])
[ 1.79900000e+01 1.03800000e+01 1.22800000e+02 1.00100000e+03
1.18400000e-01 2.77600000e-01 3.00100000e-01 1.47100000e-01
2.41900000e-01 7.87100000e-02 1.09500000e+00 9.05300000e-01
8.58900000e+00 1.53400000e+02 6.39900000e-03 4.90400000e-02
5.37300000e-02 1.58700000e-02 3.00300000e-02 6.19300000e-03
2.53800000e+01 1.73300000e+01 1.84600000e+02 2.01900000e+03
1.62200000e-01 6.65600000e-01 7.11900000e-01 2.65400000e-01
4.60100000e-01 1.18900000e-01]
Từ kết quả trên, chúng ta có thể thấy rằng trường hợp dữ liệu đầu tiên là một khối u ác tính có bán kính là 1.7990000e + 01.
Bước 3 - Tổ chức dữ liệu thành tập hợp
Trong bước này, chúng ta sẽ chia dữ liệu của mình thành hai phần cụ thể là tập huấn luyện và tập kiểm tra. Việc chia nhỏ dữ liệu thành các tập hợp này là rất quan trọng vì chúng ta phải kiểm tra mô hình của mình trên dữ liệu không nhìn thấy. Để chia dữ liệu thành các tập hợp, sklearn có một chức năng được gọi làtrain_test_split()chức năng. Với sự trợ giúp của các lệnh sau, chúng ta có thể chia dữ liệu trong các tập hợp này:
from sklearn.model_selection import train_test_split
Lệnh trên sẽ nhập train_test_splithàm từ sklearn và lệnh bên dưới sẽ chia dữ liệu thành dữ liệu huấn luyện và kiểm tra. Trong ví dụ dưới đây, chúng tôi đang sử dụng 40% dữ liệu để thử nghiệm và dữ liệu còn lại sẽ được sử dụng để đào tạo mô hình.
train, test, train_labels, test_labels = train_test_split(features,labels,test_size = 0.40, random_state = 42)
Bước 4 - Xây dựng mô hình
Trong bước này, chúng tôi sẽ xây dựng mô hình của mình. Chúng tôi sẽ sử dụng thuật toán Naïve Bayes để xây dựng mô hình. Các lệnh sau có thể được sử dụng để xây dựng mô hình:
from sklearn.naive_bayes import GaussianNB
Lệnh trên sẽ nhập mô-đun GaussianNB. Bây giờ, lệnh sau sẽ giúp bạn khởi tạo mô hình.
gnb = GaussianNB()
Chúng tôi sẽ đào tạo mô hình bằng cách điều chỉnh nó với dữ liệu bằng cách sử dụng gnb.fit ().
model = gnb.fit(train, train_labels)
Bước 5 - Đánh giá mô hình và độ chính xác của nó
Trong bước này, chúng tôi sẽ đánh giá mô hình bằng cách đưa ra dự đoán trên dữ liệu thử nghiệm của chúng tôi. Sau đó, chúng tôi cũng sẽ tìm ra độ chính xác của nó. Để đưa ra dự đoán, chúng ta sẽ sử dụng hàm dự đoán (). Lệnh sau sẽ giúp bạn làm điều này:
preds = gnb.predict(test)
print(preds)
[1 0 0 1 1 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1
0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0
0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 0 0
0 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0
1 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0
1 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0
1 1 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0
1 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1]
Dãy số 0 và 1 ở trên là giá trị dự đoán cho các lớp khối u - ác tính và lành tính.
Bây giờ, bằng cách so sánh hai mảng cụ thể là test_labels và preds, chúng tôi có thể tìm hiểu độ chính xác của mô hình của chúng tôi. Chúng tôi sẽ sử dụngaccuracy_score()chức năng xác định độ chính xác. Hãy xem xét lệnh sau cho điều này:
from sklearn.metrics import accuracy_score
print(accuracy_score(test_labels,preds))
0.951754385965
Kết quả cho thấy trình phân loại NaïveBayes chính xác đến 95,17%.
Bằng cách này, với sự trợ giúp của các bước trên, chúng ta có thể xây dựng bộ phân loại của mình bằng Python.
Xây dựng bộ phân loại bằng Python
Trong phần này, chúng ta sẽ học cách xây dựng một bộ phân loại trong Python.
Naïve Bayes Classifier
Naïve Bayes là một kỹ thuật phân loại được sử dụng để xây dựng bộ phân loại bằng cách sử dụng định lý Bayes. Giả định là các yếu tố dự đoán là độc lập. Nói cách đơn giản, nó giả định rằng sự hiện diện của một đối tượng cụ thể trong một lớp không liên quan đến sự hiện diện của bất kỳ đối tượng địa lý nào khác. Để xây dựng bộ phân loại Naïve Bayes, chúng ta cần sử dụng thư viện python có tên là scikit learning. Có ba loại mô hình Naïve Bayes được đặt tên làGaussian, Multinomial and Bernoulli theo gói học scikit.
Để xây dựng mô hình phân loại học máy Naïve Bayes, chúng ta cần
Dataset
Chúng tôi sẽ sử dụng tập dữ liệu có tên Cơ sở dữ liệu chẩn đoán ung thư vú Wisconsin. Bộ dữ liệu bao gồm nhiều thông tin khác nhau về các khối u ung thư vú, cũng như các nhãn phân loại củamalignant hoặc là benign. Tập dữ liệu có 569 trường hợp hoặc dữ liệu về 569 khối u và bao gồm thông tin về 30 thuộc tính hoặc đặc điểm, chẳng hạn như bán kính của khối u, kết cấu, độ mịn và diện tích. Chúng tôi có thể nhập tập dữ liệu này từ gói sklearn.
Mô hình Naïve Bayes
Để xây dựng bộ phân loại Naïve Bayes, chúng ta cần một mô hình Naïve Bayes. Như đã nói trước đó, có ba loại mô hình Naïve Bayes được đặt tên làGaussian, Multinomial và Bernoullitheo gói học scikit. Ở đây, trong ví dụ sau, chúng ta sẽ sử dụng mô hình Gaussian Naïve Bayes.
Bằng cách sử dụng ở trên, chúng tôi sẽ xây dựng một mô hình học máy Naïve Bayes để sử dụng thông tin về khối u để dự đoán khối u là ác tính hay lành tính.
Để bắt đầu, chúng ta cần cài đặt mô-đun sklearn. Nó có thể được thực hiện với sự trợ giúp của lệnh sau:
Import Sklearn
Bây giờ, chúng ta cần nhập tập dữ liệu có tên Cơ sở dữ liệu chẩn đoán ung thư vú Wisconsin.
from sklearn.datasets import load_breast_cancer
Bây giờ, lệnh sau sẽ tải tập dữ liệu.
data = load_breast_cancer()
Dữ liệu có thể được tổ chức như sau:
label_names = data['target_names']
labels = data['target']
feature_names = data['feature_names']
features = data['data']
Bây giờ, để làm rõ ràng hơn, chúng ta có thể in nhãn lớp, nhãn của cá thể dữ liệu đầu tiên, tên đối tượng của chúng ta và giá trị của đối tượng với sự trợ giúp của các lệnh sau:
print(label_names)
Lệnh trên sẽ in tên lớp tương ứng là ác tính và lành tính. Nó được hiển thị như đầu ra bên dưới:
['malignant' 'benign']
Bây giờ, lệnh đưa ra bên dưới sẽ cho thấy rằng chúng được ánh xạ tới các giá trị nhị phân 0 và 1. Ở đây 0 đại diện cho ung thư ác tính và 1 đại diện cho ung thư lành tính. Nó được hiển thị như đầu ra bên dưới:
print(labels[0])
0
Hai lệnh sau sẽ tạo ra tên đối tượng và giá trị đối tượng.
print(feature_names[0])
mean radius
print(features[0])
[ 1.79900000e+01 1.03800000e+01 1.22800000e+02 1.00100000e+03
1.18400000e-01 2.77600000e-01 3.00100000e-01 1.47100000e-01
2.41900000e-01 7.87100000e-02 1.09500000e+00 9.05300000e-01
8.58900000e+00 1.53400000e+02 6.39900000e-03 4.90400000e-02
5.37300000e-02 1.58700000e-02 3.00300000e-02 6.19300000e-03
2.53800000e+01 1.73300000e+01 1.84600000e+02 2.01900000e+03
1.62200000e-01 6.65600000e-01 7.11900000e-01 2.65400000e-01
4.60100000e-01 1.18900000e-01]
Từ kết quả trên, chúng ta có thể thấy rằng trường hợp dữ liệu đầu tiên là một khối u ác tính, bán kính chính của nó là 1.7990000e + 01.
Để thử nghiệm mô hình của chúng tôi trên dữ liệu không nhìn thấy, chúng tôi cần chia dữ liệu của mình thành dữ liệu đào tạo và thử nghiệm. Nó có thể được thực hiện với sự trợ giúp của đoạn mã sau:
from sklearn.model_selection import train_test_split
Lệnh trên sẽ nhập train_test_splithàm từ sklearn và lệnh bên dưới sẽ chia dữ liệu thành dữ liệu huấn luyện và kiểm tra. Trong ví dụ dưới đây, chúng tôi đang sử dụng 40% dữ liệu để thử nghiệm và dữ liệu nhắc nhở sẽ được sử dụng để đào tạo mô hình.
train, test, train_labels, test_labels =
train_test_split(features,labels,test_size = 0.40, random_state = 42)
Bây giờ, chúng tôi đang xây dựng mô hình bằng các lệnh sau:
from sklearn.naive_bayes import GaussianNB
Lệnh trên sẽ nhập GaussianNBmô-đun. Bây giờ, với lệnh dưới đây, chúng ta cần khởi tạo mô hình.
gnb = GaussianNB()
Chúng tôi sẽ đào tạo mô hình bằng cách phù hợp với dữ liệu bằng cách sử dụng gnb.fit().
model = gnb.fit(train, train_labels)
Bây giờ, đánh giá mô hình bằng cách đưa ra dự đoán trên dữ liệu thử nghiệm và nó có thể được thực hiện như sau:
preds = gnb.predict(test)
print(preds)
[1 0 0 1 1 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1
0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0
0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 0 0
0 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0
1 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0
1 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0
1 1 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0
1 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1]
Dãy số 0 và 1 ở trên là giá trị dự đoán cho các lớp khối u tức là ác tính và lành tính.
Bây giờ, bằng cách so sánh hai mảng cụ thể là test_labels và preds, chúng tôi có thể tìm hiểu độ chính xác của mô hình của chúng tôi. Chúng tôi sẽ sử dụngaccuracy_score()chức năng xác định độ chính xác. Hãy xem xét lệnh sau:
from sklearn.metrics import accuracy_score
print(accuracy_score(test_labels,preds))
0.951754385965
Kết quả cho thấy trình phân loại NaïveBayes chính xác đến 95,17%.
Đó là trình phân loại học máy dựa trên mô hình Naïve Bayse Gaussian.
Hỗ trợ Máy vectơ (SVM)
Về cơ bản, Máy vectơ hỗ trợ (SVM) là một thuật toán học máy được giám sát có thể được sử dụng cho cả hồi quy và phân loại. Khái niệm chính của SVM là vẽ mỗi mục dữ liệu dưới dạng một điểm trong không gian n chiều với giá trị của mỗi đối tượng là giá trị của một tọa độ cụ thể. Đây n sẽ là các tính năng chúng tôi sẽ có. Sau đây là một biểu diễn đồ họa đơn giản để hiểu khái niệm về SVM -
Trong sơ đồ trên, chúng ta có hai đặc điểm. Do đó, trước tiên chúng ta cần vẽ hai biến này trong không gian hai chiều nơi mỗi điểm có hai tọa độ, được gọi là vectơ hỗ trợ. Dòng chia dữ liệu thành hai nhóm được phân loại khác nhau. Dòng này sẽ là bộ phân loại.
Ở đây, chúng ta sẽ xây dựng bộ phân loại SVM bằng cách sử dụng tập dữ liệu scikit-learning và iris. Thư viện Scikitlearn cósklearn.svmvà cung cấp sklearn.svm.svc để phân loại. Bộ phân loại SVM để dự đoán loại cây diên vĩ dựa trên 4 đặc điểm được hiển thị bên dưới.
Dataset
Chúng tôi sẽ sử dụng tập dữ liệu mống mắt bao gồm 3 lớp, mỗi lớp gồm 50 trường hợp, trong đó mỗi lớp đề cập đến một loại cây diên vĩ. Mỗi cá thể có bốn đặc điểm cụ thể là chiều dài đài hoa, chiều rộng đài hoa, chiều dài cánh hoa và chiều rộng cánh hoa. Bộ phân loại SVM để dự đoán loại cây diên vĩ dựa trên 4 đặc điểm được hiển thị bên dưới.
Kernel
Nó là một kỹ thuật được sử dụng bởi SVM. Về cơ bản đây là những hàm lấy không gian đầu vào có chiều thấp và biến đổi nó thành không gian có chiều cao hơn. Nó chuyển đổi vấn đề không thể phân tách thành vấn đề có thể phân tách. Hàm nhân có thể là một hàm bất kỳ trong số các hàm tuyến tính, đa thức, rbf và sigmoid. Trong ví dụ này, chúng ta sẽ sử dụng nhân tuyến tính.
Bây giờ chúng ta hãy nhập các gói sau:
import pandas as pd
import numpy as np
from sklearn import svm, datasets
import matplotlib.pyplot as plt
Bây giờ, hãy tải dữ liệu đầu vào -
iris = datasets.load_iris()
Chúng tôi đang sử dụng hai tính năng đầu tiên -
X = iris.data[:, :2]
y = iris.target
Chúng tôi sẽ vẽ các ranh giới máy vector hỗ trợ với dữ liệu gốc. Chúng tôi đang tạo một lưới để lập mưu.
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
h = (x_max / x_min)/100
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
X_plot = np.c_[xx.ravel(), yy.ravel()]
Chúng ta cần đưa ra giá trị của tham số chính quy.
C = 1.0
Chúng ta cần tạo đối tượng phân loại SVM.
Svc_classifier = svm_classifier.SVC(kernel='linear',
C=C, decision_function_shape = 'ovr').fit(X, y)
Z = svc_classifier.predict(X_plot)
Z = Z.reshape(xx.shape)
plt.figure(figsize = (15, 5))
plt.subplot(121)
plt.contourf(xx, yy, Z, cmap = plt.cm.tab10, alpha = 0.3)
plt.scatter(X[:, 0], X[:, 1], c = y, cmap = plt.cm.Set1)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('SVC with linear kernel')
Hồi quy logistic
Về cơ bản, mô hình hồi quy logistic là một trong những thành viên của họ thuật toán phân loại có giám sát. Hồi quy logistic đo lường mối quan hệ giữa các biến phụ thuộc và các biến độc lập bằng cách ước tính xác suất sử dụng hàm logistic.
Ở đây, nếu chúng ta nói về các biến phụ thuộc và độc lập thì biến phụ thuộc là biến lớp mục tiêu mà chúng ta sẽ dự đoán và ở mặt khác, các biến độc lập là các tính năng mà chúng ta sẽ sử dụng để dự đoán lớp mục tiêu.
Trong hồi quy logistic, ước tính xác suất có nghĩa là dự đoán khả năng xảy ra sự kiện. Ví dụ, chủ cửa hàng muốn dự đoán khách hàng vào cửa hàng có mua sắm thả ga (chẳng hạn) hay không. Sẽ có nhiều đặc điểm về khách hàng - giới tính, độ tuổi, v.v. sẽ được nhân viên cửa hàng quan sát để dự đoán khả năng xảy ra, tức là có mua trạm chơi hay không. Hàm logistic là đường cong sigmoid được sử dụng để xây dựng hàm với các tham số khác nhau.
Điều kiện tiên quyết
Trước khi xây dựng bộ phân loại bằng hồi quy logistic, chúng ta cần cài đặt gói Tkinter trên hệ thống của mình. Nó có thể được cài đặt từhttps://docs.python.org/2/library/tkinter.html.
Bây giờ, với sự trợ giúp của đoạn mã dưới đây, chúng ta có thể tạo một bộ phân loại bằng cách sử dụng hồi quy logistic -
Đầu tiên, chúng tôi sẽ nhập một số gói -
import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt
Bây giờ, chúng ta cần xác định dữ liệu mẫu có thể được thực hiện như sau:
X = np.array([[2, 4.8], [2.9, 4.7], [2.5, 5], [3.2, 5.5], [6, 5], [7.6, 4],
[3.2, 0.9], [2.9, 1.9],[2.4, 3.5], [0.5, 3.4], [1, 4], [0.9, 5.9]])
y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3])
Tiếp theo, chúng ta cần tạo bộ phân loại hồi quy logistic, có thể được thực hiện như sau:
Classifier_LR = linear_model.LogisticRegression(solver = 'liblinear', C = 75)
Cuối cùng nhưng không kém phần quan trọng, chúng ta cần đào tạo bộ phân loại này -
Classifier_LR.fit(X, y)
Bây giờ, làm thế nào chúng ta có thể hình dung đầu ra? Nó có thể được thực hiện bằng cách tạo một hàm có tên Logistic_visualize () -
Def Logistic_visualize(Classifier_LR, X, y):
min_x, max_x = X[:, 0].min() - 1.0, X[:, 0].max() + 1.0
min_y, max_y = X[:, 1].min() - 1.0, X[:, 1].max() + 1.0
Trong dòng trên, chúng tôi đã xác định các giá trị tối thiểu và tối đa X và Y được sử dụng trong lưới lưới. Ngoài ra, chúng ta sẽ xác định kích thước bước để vẽ lưới ô vuông.
mesh_step_size = 0.02
Hãy để chúng tôi xác định lưới lưới của các giá trị X và Y như sau:
x_vals, y_vals = np.meshgrid(np.arange(min_x, max_x, mesh_step_size),
np.arange(min_y, max_y, mesh_step_size))
Với sự trợ giúp của mã sau, chúng ta có thể chạy trình phân loại trên lưới lưới -
output = classifier.predict(np.c_[x_vals.ravel(), y_vals.ravel()])
output = output.reshape(x_vals.shape)
plt.figure()
plt.pcolormesh(x_vals, y_vals, output, cmap = plt.cm.gray)
plt.scatter(X[:, 0], X[:, 1], c = y, s = 75, edgecolors = 'black',
linewidth=1, cmap = plt.cm.Paired)
Dòng mã sau sẽ xác định ranh giới của lô đất
plt.xlim(x_vals.min(), x_vals.max())
plt.ylim(y_vals.min(), y_vals.max())
plt.xticks((np.arange(int(X[:, 0].min() - 1), int(X[:, 0].max() + 1), 1.0)))
plt.yticks((np.arange(int(X[:, 1].min() - 1), int(X[:, 1].max() + 1), 1.0)))
plt.show()
Bây giờ, sau khi chạy mã, chúng ta sẽ nhận được kết quả sau, bộ phân loại hồi quy logistic -
Bộ phân loại cây quyết định
Cây quyết định về cơ bản là một lưu đồ cây nhị phân trong đó mỗi nút chia một nhóm quan sát theo một số biến đặc trưng.
Ở đây, chúng tôi đang xây dựng bộ phân loại Cây quyết định để dự đoán nam hay nữ. Chúng tôi sẽ lấy một tập dữ liệu rất nhỏ có 19 mẫu. Những mẫu này sẽ bao gồm hai đặc điểm - 'chiều cao' và 'chiều dài của tóc'.
Điều kiện tiên quyết
Để xây dựng bộ phân loại sau, chúng ta cần cài đặt pydotplus và graphviz. Về cơ bản, graphviz là một công cụ để vẽ đồ họa bằng cách sử dụng các tệp chấm vàpydotpluslà một mô-đun cho ngôn ngữ Dot của Graphviz. Nó có thể được cài đặt bằng trình quản lý gói hoặc pip.
Bây giờ, chúng ta có thể xây dựng bộ phân loại cây quyết định với sự trợ giúp của mã Python sau:
Để bắt đầu, chúng ta hãy nhập một số thư viện quan trọng như sau:
import pydotplus
from sklearn import tree
from sklearn.datasets import load_iris
from sklearn.metrics import classification_report
from sklearn import cross_validation
import collections
Bây giờ, chúng ta cần cung cấp tập dữ liệu như sau:
X = [[165,19],[175,32],[136,35],[174,65],[141,28],[176,15],[131,32],
[166,6],[128,32],[179,10],[136,34],[186,2],[126,25],[176,28],[112,38],
[169,9],[171,36],[116,25],[196,25]]
Y = ['Man','Woman','Woman','Man','Woman','Man','Woman','Man','Woman',
'Man','Woman','Man','Woman','Woman','Woman','Man','Woman','Woman','Man']
data_feature_names = ['height','length of hair']
X_train, X_test, Y_train, Y_test = cross_validation.train_test_split
(X, Y, test_size=0.40, random_state=5)
Sau khi cung cấp tập dữ liệu, chúng ta cần điều chỉnh mô hình có thể được thực hiện như sau:
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X,Y)
Dự đoán có thể được thực hiện với sự trợ giúp của mã Python sau:
prediction = clf.predict([[133,37]])
print(prediction)
Chúng ta có thể hình dung cây quyết định với sự trợ giúp của mã Python sau:
dot_data = tree.export_graphviz(clf,feature_names = data_feature_names,
out_file = None,filled = True,rounded = True)
graph = pydotplus.graph_from_dot_data(dot_data)
colors = ('orange', 'yellow')
edges = collections.defaultdict(list)
for edge in graph.get_edge_list():
edges[edge.get_source()].append(int(edge.get_destination()))
for edge in edges: edges[edge].sort()
for i in range(2):dest = graph.get_node(str(edges[edge][i]))[0]
dest.set_fillcolor(colors[i])
graph.write_png('Decisiontree16.png')
Nó sẽ đưa ra dự đoán cho đoạn mã trên là [‘Woman’] và tạo cây quyết định sau:
Chúng tôi có thể thay đổi giá trị của các tính năng trong dự đoán để kiểm tra nó.
Bộ phân loại rừng ngẫu nhiên
Như chúng ta biết rằng phương pháp tổng hợp là các phương pháp kết hợp các mô hình học máy thành một mô hình học máy mạnh mẽ hơn. Random Forest, một tập hợp các cây quyết định, là một trong số đó. Nó tốt hơn cây quyết định đơn lẻ bởi vì trong khi vẫn giữ được sức mạnh dự đoán, nó có thể giảm bớt sự phù hợp quá mức bằng cách lấy trung bình các kết quả. Ở đây, chúng tôi sẽ triển khai mô hình rừng ngẫu nhiên trên bộ dữ liệu ung thư học scikit.
Nhập các gói cần thiết -
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
import matplotlib.pyplot as plt
import numpy as np
Bây giờ, chúng tôi cần cung cấp tập dữ liệu có thể được thực hiện như sau & trừ
cancer = load_breast_cancer()
X_train, X_test, y_train,
y_test = train_test_split(cancer.data, cancer.target, random_state = 0)
Sau khi cung cấp tập dữ liệu, chúng ta cần điều chỉnh mô hình có thể được thực hiện như sau:
forest = RandomForestClassifier(n_estimators = 50, random_state = 0)
forest.fit(X_train,y_train)
Bây giờ, hãy nắm bắt độ chính xác khi đào tạo cũng như kiểm tra tập hợp con: nếu chúng ta tăng số lượng công cụ ước tính thì độ chính xác của tập hợp con thử nghiệm cũng sẽ tăng lên.
print('Accuracy on the training subset:(:.3f)',format(forest.score(X_train,y_train)))
print('Accuracy on the training subset:(:.3f)',format(forest.score(X_test,y_test)))
Đầu ra
Accuracy on the training subset:(:.3f) 1.0
Accuracy on the training subset:(:.3f) 0.965034965034965
Bây giờ, giống như cây quyết định, rừng ngẫu nhiên có feature_importancemô-đun này sẽ cung cấp một cái nhìn tốt hơn về trọng lượng tính năng hơn là cây quyết định. Nó có thể được vẽ và hình dung như sau:
n_features = cancer.data.shape[1]
plt.barh(range(n_features),forest.feature_importances_, align='center')
plt.yticks(np.arange(n_features),cancer.feature_names)
plt.xlabel('Feature Importance')
plt.ylabel('Feature')
plt.show()
Hiệu suất của bộ phân loại
Sau khi thực hiện một thuật toán học máy, chúng ta cần tìm hiểu mức độ hiệu quả của mô hình. Các tiêu chí để đo lường hiệu quả có thể dựa trên bộ dữ liệu và số liệu. Để đánh giá các thuật toán học máy khác nhau, chúng tôi có thể sử dụng các số liệu hiệu suất khác nhau. Ví dụ: giả sử nếu một bộ phân loại được sử dụng để phân biệt giữa các hình ảnh của các đối tượng khác nhau, chúng tôi có thể sử dụng các số liệu hiệu suất phân loại như độ chính xác trung bình, AUC, v.v. Theo một nghĩa nào đó, số liệu chúng tôi chọn để đánh giá mô hình học máy của mình là rất quan trọng vì việc lựa chọn số liệu ảnh hưởng đến cách đo lường và so sánh hiệu suất của thuật toán học máy. Sau đây là một số chỉ số -
Ma trận hỗn loạn
Về cơ bản, nó được sử dụng cho bài toán phân loại trong đó đầu ra có thể là hai hoặc nhiều loại lớp. Đây là cách dễ nhất để đo hiệu suất của bộ phân loại. Ma trận nhầm lẫn về cơ bản là một bảng có hai thứ nguyên là "Thực tế" và "Dự đoán". Cả hai thứ nguyên đều có “Phủ định thật (TP)”, “Phủ định thực (TN)”, “Phủ định sai (FP)”, “Phủ định giả (FN)”.
Trong ma trận nhầm lẫn ở trên, 1 dành cho lớp dương và 0 dành cho lớp âm.
Sau đây là các thuật ngữ liên quan đến ma trận Lẫn lộn -
True Positives − TP là các trường hợp khi lớp dữ liệu thực tế là 1 và dự đoán cũng là 1.
True Negatives − TN là các trường hợp khi lớp thực của điểm dữ liệu là 0 và dự đoán cũng bằng 0.
False Positives − FP là các trường hợp khi lớp dữ liệu thực tế là 0 và dự đoán cũng là 1.
False Negatives − FN là các trường hợp khi lớp thực tế của điểm dữ liệu là 1 và dự đoán cũng là 0.
Sự chính xác
Bản thân ma trận nhầm lẫn không phải là một thước đo hiệu suất nhưng hầu như tất cả các ma trận hiệu suất đều dựa trên ma trận nhầm lẫn. Một trong số đó là độ chính xác. Trong các bài toán phân loại, nó có thể được định nghĩa là số lượng các dự đoán đúng được thực hiện bởi mô hình so với tất cả các loại dự đoán được thực hiện. Công thức tính độ chính xác như sau:
$$ Accuracy = \ frac {TP + TN} {TP + FP + FN + TN} $$
Độ chính xác
Nó chủ yếu được sử dụng trong việc truy xuất tài liệu. Nó có thể được định nghĩa là có bao nhiêu tài liệu được trả lại là đúng. Sau đây là công thức tính độ chính xác:
$$ Precision = \ frac {TP} {TP + FP} $$
Nhớ lại hoặc độ nhạy
Nó có thể được định nghĩa là mô hình trả về bao nhiêu điểm tích cực. Sau đây là công thức tính toán độ thu hồi / độ nhạy của mô hình:
$$ Nhớ lại = \ frac {TP} {TP + FN} $$
Tính đặc hiệu
Nó có thể được định nghĩa là có bao nhiêu phủ định mà mô hình trả về. Nó hoàn toàn ngược lại để thu hồi. Sau đây là công thức tính độ cụ thể của mô hình:
$$ Đặc hiệu = \ frac {TN} {TN + FP} $$
Vấn đề mất cân bằng lớp
Mất cân bằng lớp là kịch bản trong đó số lượng quan sát thuộc một lớp thấp hơn đáng kể so với những quan sát thuộc các lớp khác. Ví dụ, vấn đề này nổi bật trong trường hợp chúng ta cần xác định các bệnh hiếm gặp, các giao dịch gian lận trong ngân hàng, v.v.
Ví dụ về các lớp không cân bằng
Chúng ta hãy xem xét một ví dụ về tập dữ liệu phát hiện gian lận để hiểu khái niệm về lớp không cân bằng -
Total observations = 5000
Fraudulent Observations = 50
Non-Fraudulent Observations = 4950
Event Rate = 1%
Giải pháp
Balancing the classes’hoạt động như một giải pháp cho các lớp học mất cân bằng. Mục tiêu chính của việc cân bằng các tầng lớp là tăng tần suất của tầng lớp thiểu số hoặc giảm tần suất của tầng lớp đa số. Sau đây là các cách tiếp cận để giải quyết vấn đề mất cân bằng các lớp:
Lấy mẫu lại
Lấy mẫu lại là một loạt các phương pháp được sử dụng để xây dựng lại các tập dữ liệu mẫu - cả tập huấn luyện và tập thử nghiệm. Lấy mẫu lại được thực hiện để cải thiện độ chính xác của mô hình. Sau đây là một số kỹ thuật lấy mẫu lại -
Random Under-Sampling- Kỹ thuật này nhằm mục đích cân bằng phân phối lớp bằng cách loại bỏ ngẫu nhiên các ví dụ lớp đa số. Điều này được thực hiện cho đến khi các cá thể của giai cấp đa số và thiểu số được cân bằng.
Total observations = 5000
Fraudulent Observations = 50
Non-Fraudulent Observations = 4950
Event Rate = 1%
Trong trường hợp này, chúng tôi sẽ lấy 10% mẫu mà không cần thay thế từ các trường hợp không gian lận và sau đó kết hợp chúng với các trường hợp gian lận -
Các quan sát không gian lận sau khi lấy mẫu ngẫu nhiên = 10% của 4950 = 495
Tổng số quan sát sau khi kết hợp chúng với các quan sát gian lận = 50 + 495 = 545
Do đó, hiện tại, tỷ lệ sự kiện cho tập dữ liệu mới sau khi được lấy mẫu = 9%
Ưu điểm chính của kỹ thuật này là nó có thể giảm thời gian chạy và cải thiện khả năng lưu trữ. Nhưng ở mặt khác, nó có thể loại bỏ thông tin hữu ích trong khi giảm số lượng mẫu dữ liệu đào tạo.
Random Over-Sampling - Kỹ thuật này nhằm mục đích cân bằng phân phối lớp bằng cách tăng số lượng cá thể trong lớp thiểu số bằng cách nhân rộng chúng.
Total observations = 5000
Fraudulent Observations = 50
Non-Fraudulent Observations = 4950
Event Rate = 1%
Trong trường hợp chúng tôi sao chép 50 quan sát gian lận 30 lần thì các quan sát gian lận sau khi nhân rộng các quan sát của lớp thiểu số sẽ là 1500. Và khi đó tổng số quan sát trong dữ liệu mới sau khi lấy mẫu quá mức sẽ là 4950 + 1500 = 6450. Do đó tỷ lệ sự kiện cho tập dữ liệu mới sẽ là 1500/6450 = 23%.
Ưu điểm chính của phương pháp này là sẽ không mất thông tin hữu ích. Nhưng mặt khác, nó có cơ hội tăng quá phù hợp vì nó sao chép các sự kiện của tầng lớp thiểu số.
Kỹ thuật lắp ráp
Phương pháp luận này về cơ bản được sử dụng để sửa đổi các thuật toán phân loại hiện có để làm cho chúng phù hợp với các tập dữ liệu không cân bằng. Trong cách tiếp cận này, chúng tôi xây dựng một số bộ phân loại hai giai đoạn từ dữ liệu ban đầu và sau đó tổng hợp các dự đoán của chúng. Bộ phân loại rừng ngẫu nhiên là một ví dụ về bộ phân loại dựa trên quần thể.
Hồi quy là một trong những công cụ thống kê và máy học quan trọng nhất. Chúng tôi sẽ không sai khi nói rằng hành trình của học máy bắt đầu từ hồi quy. Nó có thể được định nghĩa là kỹ thuật tham số cho phép chúng ta đưa ra quyết định dựa trên dữ liệu hoặc nói cách khác cho phép chúng ta đưa ra dự đoán dựa trên dữ liệu bằng cách tìm hiểu mối quan hệ giữa các biến đầu vào và đầu ra. Ở đây, các biến đầu ra phụ thuộc vào các biến đầu vào, là các số thực có giá trị liên tục. Trong hồi quy, mối quan hệ giữa các biến đầu vào và đầu ra rất quan trọng và nó giúp chúng ta hiểu giá trị của biến đầu ra thay đổi như thế nào với sự thay đổi của biến đầu vào. Hồi quy thường được sử dụng để dự đoán giá cả, kinh tế, các biến thể, v.v.
Xây dựng Regressors trong Python
Trong phần này, chúng ta sẽ học cách xây dựng bộ hồi quy đơn cũng như đa biến.
Bộ hồi quy tuyến tính / Bộ hồi quy biến đơn
Hãy để chúng tôi quan trọng một vài gói bắt buộc -
import numpy as np
from sklearn import linear_model
import sklearn.metrics as sm
import matplotlib.pyplot as plt
Bây giờ, chúng tôi cần cung cấp dữ liệu đầu vào và chúng tôi đã lưu dữ liệu của mình trong tệp có tên là linear.txt.
input = 'D:/ProgramData/linear.txt'
Chúng tôi cần tải dữ liệu này bằng cách sử dụng np.loadtxt chức năng.
input_data = np.loadtxt(input, delimiter=',')
X, y = input_data[:, :-1], input_data[:, -1]
Bước tiếp theo sẽ là đào tạo mô hình. Hãy để chúng tôi cung cấp cho đào tạo và thử nghiệm mẫu.
training_samples = int(0.6 * len(X))
testing_samples = len(X) - num_training
X_train, y_train = X[:training_samples], y[:training_samples]
X_test, y_test = X[training_samples:], y[training_samples:]
Bây giờ, chúng ta cần tạo một đối tượng hồi quy tuyến tính.
reg_linear = linear_model.LinearRegression()
Huấn luyện đối tượng bằng các mẫu huấn luyện.
reg_linear.fit(X_train, y_train)
Chúng tôi cần thực hiện dự đoán với dữ liệu thử nghiệm.
y_test_pred = reg_linear.predict(X_test)
Bây giờ vẽ và hình dung dữ liệu.
plt.scatter(X_test, y_test, color = 'red')
plt.plot(X_test, y_test_pred, color = 'black', linewidth = 2)
plt.xticks(())
plt.yticks(())
plt.show()
Đầu ra
Bây giờ, chúng ta có thể tính toán hiệu suất của hồi quy tuyến tính như sau:
print("Performance of Linear regressor:")
print("Mean absolute error =", round(sm.mean_absolute_error(y_test, y_test_pred), 2))
print("Mean squared error =", round(sm.mean_squared_error(y_test, y_test_pred), 2))
print("Median absolute error =", round(sm.median_absolute_error(y_test, y_test_pred), 2))
print("Explain variance score =", round(sm.explained_variance_score(y_test, y_test_pred),
2))
print("R2 score =", round(sm.r2_score(y_test, y_test_pred), 2))
Đầu ra
Hiệu suất của bộ hồi quy tuyến tính -
Mean absolute error = 1.78
Mean squared error = 3.89
Median absolute error = 2.01
Explain variance score = -0.09
R2 score = -0.09
Trong đoạn mã trên, chúng tôi đã sử dụng dữ liệu nhỏ này. Nếu bạn muốn một số tập dữ liệu lớn thì bạn có thể sử dụng sklearn.dataset để nhập tập dữ liệu lớn hơn.
2,4.82.9,4.72.5,53.2,5.56,57.6,43.2,0.92.9,1.92.4,
3.50.5,3.41,40.9,5.91.2,2.583.2,5.65.1,1.54.5,
1.22.3,6.32.1,2.8
Bộ hồi quy đa biến
Trước tiên, hãy để chúng tôi nhập một vài gói bắt buộc -
import numpy as np
from sklearn import linear_model
import sklearn.metrics as sm
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
Bây giờ, chúng tôi cần cung cấp dữ liệu đầu vào và chúng tôi đã lưu dữ liệu của mình trong tệp có tên là linear.txt.
input = 'D:/ProgramData/Mul_linear.txt'
Chúng tôi sẽ tải dữ liệu này bằng cách sử dụng np.loadtxt chức năng.
input_data = np.loadtxt(input, delimiter=',')
X, y = input_data[:, :-1], input_data[:, -1]
Bước tiếp theo sẽ là đào tạo mô hình; chúng tôi sẽ cung cấp cho đào tạo và thử nghiệm mẫu.
training_samples = int(0.6 * len(X))
testing_samples = len(X) - num_training
X_train, y_train = X[:training_samples], y[:training_samples]
X_test, y_test = X[training_samples:], y[training_samples:]
Bây giờ, chúng ta cần tạo một đối tượng hồi quy tuyến tính.
reg_linear_mul = linear_model.LinearRegression()
Huấn luyện đối tượng bằng các mẫu huấn luyện.
reg_linear_mul.fit(X_train, y_train)
Bây giờ, cuối cùng chúng ta cần thực hiện dự đoán với dữ liệu thử nghiệm.
y_test_pred = reg_linear_mul.predict(X_test)
print("Performance of Linear regressor:")
print("Mean absolute error =", round(sm.mean_absolute_error(y_test, y_test_pred), 2))
print("Mean squared error =", round(sm.mean_squared_error(y_test, y_test_pred), 2))
print("Median absolute error =", round(sm.median_absolute_error(y_test, y_test_pred), 2))
print("Explain variance score =", round(sm.explained_variance_score(y_test, y_test_pred), 2))
print("R2 score =", round(sm.r2_score(y_test, y_test_pred), 2))
Đầu ra
Hiệu suất của bộ hồi quy tuyến tính -
Mean absolute error = 0.6
Mean squared error = 0.65
Median absolute error = 0.41
Explain variance score = 0.34
R2 score = 0.33
Bây giờ, chúng ta sẽ tạo một đa thức bậc 10 và đào tạo bộ hồi quy. Chúng tôi sẽ cung cấp điểm dữ liệu mẫu.
polynomial = PolynomialFeatures(degree = 10)
X_train_transformed = polynomial.fit_transform(X_train)
datapoint = [[2.23, 1.35, 1.12]]
poly_datapoint = polynomial.fit_transform(datapoint)
poly_linear_model = linear_model.LinearRegression()
poly_linear_model.fit(X_train_transformed, y_train)
print("\nLinear regression:\n", reg_linear_mul.predict(datapoint))
print("\nPolynomial regression:\n", poly_linear_model.predict(poly_datapoint))
Đầu ra
Hồi quy tuyến tính -
[2.40170462]
Hồi quy đa thức -
[1.8697225]
Trong đoạn mã trên, chúng tôi đã sử dụng dữ liệu nhỏ này. Sau đó, nếu bạn muốn có một tập dữ liệu lớn, bạn có thể sử dụng sklearn.dataset để nhập một tập dữ liệu lớn hơn.
2,4.8,1.2,3.22.9,4.7,1.5,3.62.5,5,2.8,23.2,5.5,3.5,2.16,5,
2,3.27.6,4,1.2,3.23.2,0.9,2.3,1.42.9,1.9,2.3,1.22.4,3.5,
2.8,3.60.5,3.4,1.8,2.91,4,3,2.50.9,5.9,5.6,0.81.2,2.58,
3.45,1.233.2,5.6,2,3.25.1,1.5,1.2,1.34.5,1.2,4.1,2.32.3,
6.3,2.5,3.22.1,2.8,1.2,3.6
Trong chương này, chúng ta sẽ tập trung vào lập trình logic và nó giúp ích như thế nào trong Trí tuệ nhân tạo.
Chúng ta đã biết rằng logic là nghiên cứu các nguyên tắc của suy luận đúng đắn hay nói một cách đơn giản nó là nghiên cứu về cái gì xảy ra sau cái gì. Ví dụ, nếu hai câu lệnh đúng thì chúng ta có thể suy ra bất kỳ câu lệnh thứ ba nào từ nó.
Ý tưởng
Lập trình Logic là sự kết hợp của hai từ, logic và lập trình. Lập trình Logic là một mô hình lập trình trong đó các vấn đề được thể hiện dưới dạng các dữ kiện và quy tắc bằng các câu lệnh chương trình nhưng trong một hệ thống logic chính thức. Cũng giống như các mô hình lập trình khác như hướng đối tượng, chức năng, khai báo và thủ tục, v.v., nó cũng là một cách cụ thể để tiếp cận lập trình.
Cách giải quyết vấn đề với lập trình logic
Lập trình Logic sử dụng các dữ kiện và quy tắc để giải quyết vấn đề. Đó là lý do tại sao chúng được gọi là khối xây dựng của Lập trình Logic. Một mục tiêu cần được xác định cho mọi chương trình trong lập trình logic. Để hiểu cách một vấn đề có thể được giải quyết trong lập trình logic, chúng ta cần biết về các nguyên tắc xây dựng - Sự kiện và Quy tắc -
Sự thật
Trên thực tế, mọi chương trình logic đều cần các dữ kiện để làm việc để nó có thể đạt được mục tiêu đã cho. Sự thật về cơ bản là những tuyên bố đúng về chương trình và dữ liệu. Ví dụ, Delhi là thủ đô của Ấn Độ.
Quy tắc
Trên thực tế, các quy tắc là những ràng buộc cho phép chúng ta đưa ra kết luận về miền vấn đề. Về cơ bản, các quy tắc được viết dưới dạng mệnh đề logic để diễn đạt nhiều sự kiện khác nhau. Ví dụ, nếu chúng ta đang xây dựng bất kỳ trò chơi nào thì tất cả các quy tắc phải được xác định.
Các quy tắc rất quan trọng để giải quyết bất kỳ vấn đề nào trong Lập trình Logic. Các quy tắc về cơ bản là kết luận logic có thể diễn đạt các sự kiện. Sau đây là cú pháp của quy tắc:
A∶− B1, B2, ..., B n .
Ở đây, A là phần đầu và B1, B2, ... Bn là phần thân.
Ví dụ - tổ tiên (X, Y): - cha (X, Y).
tổ tiên (X, Z): - cha (X, Y), tổ tiên (Y, Z).
Điều này có thể được đọc là, với mọi X và Y, nếu X là cha của Y và Y là tổ tiên của Z, thì X là tổ tiên của Z. Với mọi X và Y, X là tổ tiên của Z, nếu X là cha của Y và Y là tổ tiên của Z.
Cài đặt các gói hữu ích
Để bắt đầu lập trình logic bằng Python, chúng ta cần cài đặt hai gói sau:
Kanren
Nó cung cấp cho chúng tôi một cách để đơn giản hóa cách chúng tôi tạo mã cho logic nghiệp vụ. Nó cho phép chúng tôi thể hiện logic về các quy tắc và sự kiện. Lệnh sau sẽ giúp bạn cài đặt kanren -
pip install kanren
SymPy
SymPy là một thư viện Python cho toán học biểu tượng. Nó nhằm mục đích trở thành một hệ thống đại số máy tính (CAS) đầy đủ tính năng trong khi vẫn giữ cho mã đơn giản nhất có thể để dễ hiểu và dễ dàng mở rộng. Lệnh sau sẽ giúp bạn cài đặt SymPy:
pip install sympy
Ví dụ về lập trình logic
Sau đây là một số ví dụ có thể được giải quyết bằng lập trình logic -
Đối sánh các biểu thức toán học
Trên thực tế, chúng ta có thể tìm thấy các giá trị chưa biết bằng cách sử dụng lập trình logic một cách rất hiệu quả. Đoạn mã Python sau sẽ giúp bạn so khớp một biểu thức toán học:
Trước tiên, hãy xem xét việc nhập các gói sau:
from kanren import run, var, fact
from kanren.assoccomm import eq_assoccomm as eq
from kanren.assoccomm import commutative, associative
Chúng ta cần xác định các phép toán mà chúng ta sẽ sử dụng -
add = 'add'
mul = 'mul'
Cả phép cộng và phép nhân đều là quá trình giao tiếp. Do đó, chúng ta cần xác định nó và điều này có thể được thực hiện như sau:
fact(commutative, mul)
fact(commutative, add)
fact(associative, mul)
fact(associative, add)
Bắt buộc phải xác định các biến; điều này có thể được thực hiện như sau:
a, b = var('a'), var('b')
Chúng ta cần kết hợp biểu thức với mẫu ban đầu. Chúng ta có mẫu ban đầu sau, về cơ bản là (5 + a) * b -
Original_pattern = (mul, (add, 5, a), b)
Chúng ta có hai biểu thức sau để khớp với mẫu ban đầu:
exp1 = (mul, 2, (add, 3, 1))
exp2 = (add,5,(mul,8,1))
Đầu ra có thể được in bằng lệnh sau:
print(run(0, (a,b), eq(original_pattern, exp1)))
print(run(0, (a,b), eq(original_pattern, exp2)))
Sau khi chạy mã này, chúng ta sẽ nhận được kết quả sau:
((3,2))
()
Đầu ra đầu tiên đại diện cho các giá trị cho a và b. Biểu thức đầu tiên khớp với mẫu ban đầu và trả về các giá trị choa và b nhưng biểu thức thứ hai không khớp với mẫu ban đầu do đó không có gì được trả về.
Kiểm tra các số nguyên tố
Với sự trợ giúp của lập trình logic, chúng ta có thể tìm các số nguyên tố từ một danh sách các số và cũng có thể tạo ra các số nguyên tố. Mã Python đưa ra bên dưới sẽ tìm số nguyên tố từ danh sách các số và cũng sẽ tạo ra 10 số nguyên tố đầu tiên.
Đầu tiên chúng ta hãy xem xét việc nhập các gói sau:
from kanren import isvar, run, membero
from kanren.core import success, fail, goaleval, condeseq, eq, var
from sympy.ntheory.generate import prime, isprime
import itertools as it
Bây giờ, chúng ta sẽ định nghĩa một hàm có tên là prime_check sẽ kiểm tra các số nguyên tố dựa trên các số đã cho dưới dạng dữ liệu.
def prime_check(x):
if isvar(x):
return condeseq([(eq,x,p)] for p in map(prime, it.count(1)))
else:
return success if isprime(x) else fail
Bây giờ, chúng ta cần khai báo một biến sẽ được sử dụng:
x = var()
print((set(run(0,x,(membero,x,(12,14,15,19,20,21,22,23,29,30,41,44,52,62,65,85)),
(prime_check,x)))))
print((run(10,x,prime_check(x))))
Đầu ra của đoạn mã trên sẽ như sau:
{19, 23, 29, 41}
(2, 3, 5, 7, 11, 13, 17, 19, 23, 29)
Giải quyết câu đố
Lập trình logic có thể được sử dụng để giải quyết nhiều vấn đề như 8 câu đố, câu đố Zebra, Sudoku, N-queen, v.v. Ở đây chúng tôi lấy một ví dụ về một biến thể của câu đố Zebra như sau:
There are five houses.
The English man lives in the red house.
The Swede has a dog.
The Dane drinks tea.
The green house is immediately to the left of the white house.
They drink coffee in the green house.
The man who smokes Pall Mall has birds.
In the yellow house they smoke Dunhill.
In the middle house they drink milk.
The Norwegian lives in the first house.
The man who smokes Blend lives in the house next to the house with cats.
In a house next to the house where they have a horse, they smoke Dunhill.
The man who smokes Blue Master drinks beer.
The German smokes Prince.
The Norwegian lives next to the blue house.
They drink water in a house next to the house where they smoke Blend.
Chúng tôi đang giải quyết nó cho câu hỏi who owns zebra với sự trợ giúp của Python.
Hãy để chúng tôi nhập các gói cần thiết -
from kanren import *
from kanren.core import lall
import time
Bây giờ, chúng ta cần xác định hai hàm - left() và next() để kiểm tra xem nhà của ai còn lại hoặc bên cạnh nhà của ai -
def left(q, p, list):
return membero((q,p), zip(list, list[1:]))
def next(q, p, list):
return conde([left(q, p, list)], [left(p, q, list)])
Bây giờ, chúng ta sẽ khai báo một ngôi nhà biến như sau:
houses = var()
Chúng ta cần xác định các quy tắc với sự trợ giúp của gói lall như sau.
Có 5 ngôi nhà -
rules_zebraproblem = lall(
(eq, (var(), var(), var(), var(), var()), houses),
(membero,('Englishman', var(), var(), var(), 'red'), houses),
(membero,('Swede', var(), var(), 'dog', var()), houses),
(membero,('Dane', var(), 'tea', var(), var()), houses),
(left,(var(), var(), var(), var(), 'green'),
(var(), var(), var(), var(), 'white'), houses),
(membero,(var(), var(), 'coffee', var(), 'green'), houses),
(membero,(var(), 'Pall Mall', var(), 'birds', var()), houses),
(membero,(var(), 'Dunhill', var(), var(), 'yellow'), houses),
(eq,(var(), var(), (var(), var(), 'milk', var(), var()), var(), var()), houses),
(eq,(('Norwegian', var(), var(), var(), var()), var(), var(), var(), var()), houses),
(next,(var(), 'Blend', var(), var(), var()),
(var(), var(), var(), 'cats', var()), houses),
(next,(var(), 'Dunhill', var(), var(), var()),
(var(), var(), var(), 'horse', var()), houses),
(membero,(var(), 'Blue Master', 'beer', var(), var()), houses),
(membero,('German', 'Prince', var(), var(), var()), houses),
(next,('Norwegian', var(), var(), var(), var()),
(var(), var(), var(), var(), 'blue'), houses),
(next,(var(), 'Blend', var(), var(), var()),
(var(), var(), 'water', var(), var()), houses),
(membero,(var(), var(), var(), 'zebra', var()), houses)
)
Bây giờ, hãy chạy trình giải với các ràng buộc trước đó -
solutions = run(0, houses, rules_zebraproblem)
Với sự trợ giúp của đoạn mã sau, chúng ta có thể trích xuất đầu ra từ bộ giải:
output_zebra = [house for house in solutions[0] if 'zebra' in house][0][0]
Đoạn mã sau sẽ giúp in ra giải pháp:
print ('\n'+ output_zebra + 'owns zebra.')
Đầu ra của đoạn mã trên sẽ như sau:
German owns zebra.
Các thuật toán học máy không được giám sát không có bất kỳ người giám sát nào để cung cấp bất kỳ loại hướng dẫn nào. Đó là lý do tại sao chúng liên kết chặt chẽ với cái mà một số người gọi là trí tuệ nhân tạo thực sự.
Trong học tập không có giám sát, sẽ không có câu trả lời chính xác và không có giáo viên hướng dẫn. Các thuật toán cần khám phá mô hình thú vị trong dữ liệu để học.
Phân cụm là gì?
Về cơ bản, nó là một loại phương pháp học tập không giám sát và một kỹ thuật phổ biến để phân tích dữ liệu thống kê được sử dụng trong nhiều lĩnh vực. Phân cụm chủ yếu là nhiệm vụ chia tập hợp các quan sát thành các tập con, được gọi là các cụm, theo cách sao cho các quan sát trong cùng một cụm giống nhau theo một nghĩa và chúng khác với các quan sát trong các cụm khác. Nói một cách dễ hiểu, chúng ta có thể nói rằng mục tiêu chính của phân cụm là nhóm dữ liệu trên cơ sở tương đồng và khác biệt.
Ví dụ: sơ đồ sau đây cho thấy loại dữ liệu tương tự trong các cụm khác nhau:
Các thuật toán để phân cụm dữ liệu
Sau đây là một số thuật toán phổ biến để phân nhóm dữ liệu:
Thuật toán K-Means
Thuật toán phân cụm K-mean là một trong những thuật toán nổi tiếng để phân cụm dữ liệu. Chúng ta cần giả định rằng số lượng các cụm đã được biết trước. Đây còn được gọi là phân cụm phẳng. Nó là một thuật toán phân cụm lặp đi lặp lại. Các bước đưa ra bên dưới cần được thực hiện cho thuật toán này -
Step 1 - Ta cần xác định số lượng K nhóm con mong muốn.
Step 2- Cố định số lượng các cụm và gán ngẫu nhiên mỗi điểm dữ liệu vào một cụm. Hay nói cách khác, chúng ta cần phân loại dữ liệu của mình dựa trên số lượng các cụm.
Trong bước này, các trung tâm cụm sẽ được tính toán.
Vì đây là một thuật toán lặp lại, chúng ta cần cập nhật vị trí của K centroid với mỗi lần lặp lại cho đến khi chúng ta tìm thấy optima toàn cục hay nói cách khác là các centroid đạt đến vị trí tối ưu của chúng.
Đoạn mã sau sẽ giúp thực hiện thuật toán phân cụm K-mean trong Python. Chúng tôi sẽ sử dụng mô-đun Scikit-learning.
Hãy để chúng tôi nhập các gói cần thiết -
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans
Dòng mã sau sẽ giúp tạo tập dữ liệu hai chiều, chứa bốn đốm màu, bằng cách sử dụng make_blob từ sklearn.dataset gói hàng.
from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs(n_samples = 500, centers = 4,
cluster_std = 0.40, random_state = 0)
Chúng ta có thể hình dung tập dữ liệu bằng cách sử dụng đoạn mã sau:
plt.scatter(X[:, 0], X[:, 1], s = 50);
plt.show()
Ở đây, chúng tôi đang khởi tạo kmeans để trở thành thuật toán KMeans, với tham số bắt buộc là bao nhiêu cụm (n_clusters).
kmeans = KMeans(n_clusters = 4)
Chúng ta cần đào tạo mô hình K-means với dữ liệu đầu vào.
kmeans.fit(X)
y_kmeans = kmeans.predict(X)
plt.scatter(X[:, 0], X[:, 1], c = y_kmeans, s = 50, cmap = 'viridis')
centers = kmeans.cluster_centers_
Đoạn mã được đưa ra bên dưới sẽ giúp chúng tôi vẽ và hình dung các phát hiện của máy dựa trên dữ liệu của chúng tôi và cách lắp ráp theo số lượng cụm sẽ được tìm thấy.
plt.scatter(centers[:, 0], centers[:, 1], c = 'black', s = 200, alpha = 0.5);
plt.show()
Thuật toán dịch chuyển trung bình
Nó là một thuật toán phân cụm phổ biến và mạnh mẽ khác được sử dụng trong học tập không giám sát. Nó không đưa ra bất kỳ giả định nào do đó nó là một thuật toán phi tham số. Nó còn được gọi là phân cụm phân cấp hoặc phân tích cụm dịch chuyển trung bình. Các bước tiếp theo sẽ là các bước cơ bản của thuật toán này -
Trước hết, chúng ta cần bắt đầu với các điểm dữ liệu được gán cho một cụm của riêng chúng.
Bây giờ, nó tính toán các trung tâm và cập nhật vị trí của các trung tâm mới.
Bằng cách lặp lại quá trình này, chúng tôi di chuyển đến gần đỉnh của cụm tức là về phía vùng có mật độ cao hơn.
Thuật toán này dừng lại ở giai đoạn mà các centroid không di chuyển nữa.
Với sự trợ giúp của đoạn mã sau, chúng tôi đang triển khai thuật toán phân cụm Mean Shift trong Python. Chúng tôi sẽ sử dụng mô-đun Scikit-learning.
Hãy để chúng tôi nhập các gói cần thiết -
import numpy as np
from sklearn.cluster import MeanShift
import matplotlib.pyplot as plt
from matplotlib import style
style.use("ggplot")
Đoạn mã sau sẽ giúp tạo tập dữ liệu hai chiều, chứa bốn đốm màu, bằng cách sử dụng make_blob từ sklearn.dataset gói hàng.
from sklearn.datasets.samples_generator import make_blobs
Chúng ta có thể hình dung tập dữ liệu bằng đoạn mã sau
centers = [[2,2],[4,5],[3,10]]
X, _ = make_blobs(n_samples = 500, centers = centers, cluster_std = 1)
plt.scatter(X[:,0],X[:,1])
plt.show()
Bây giờ, chúng ta cần đào tạo mô hình cụm Mean Shift với dữ liệu đầu vào.
ms = MeanShift()
ms.fit(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_
Đoạn mã sau sẽ in các trung tâm cụm và số lượng cụm dự kiến theo dữ liệu đầu vào:
print(cluster_centers)
n_clusters_ = len(np.unique(labels))
print("Estimated clusters:", n_clusters_)
[[ 3.23005036 3.84771893]
[ 3.02057451 9.88928991]]
Estimated clusters: 2
Đoạn mã được đưa ra dưới đây sẽ giúp vẽ biểu đồ và trực quan hóa các phát hiện của máy dựa trên dữ liệu của chúng tôi và cách lắp ráp theo số lượng các cụm sẽ được tìm thấy.
colors = 10*['r.','g.','b.','c.','k.','y.','m.']
for i in range(len(X)):
plt.plot(X[i][0], X[i][1], colors[labels[i]], markersize = 10)
plt.scatter(cluster_centers[:,0],cluster_centers[:,1],
marker = "x",color = 'k', s = 150, linewidths = 5, zorder = 10)
plt.show()
Đo lường hiệu suất phân cụm
Dữ liệu thế giới thực không tự nhiên được tổ chức thành một số cụm riêng biệt. Vì lý do này, không dễ dàng hình dung và rút ra suy luận. Đó là lý do tại sao chúng ta cần đo hiệu suất phân cụm cũng như chất lượng của nó. Nó có thể được thực hiện với sự trợ giúp của phân tích hình bóng.
Phân tích Silhouette
Phương pháp này có thể được sử dụng để kiểm tra chất lượng của phân cụm bằng cách đo khoảng cách giữa các cụm. Về cơ bản, nó cung cấp một cách để đánh giá các thông số như số lượng cụm bằng cách cho điểm hình bóng. Điểm số này là một số liệu đo lường mức độ gần của mỗi điểm trong một cụm với các điểm trong các cụm lân cận.
Phân tích điểm bóng
Điểm số có phạm vi là [-1, 1]. Sau đây là phân tích về điểm số này -
Score of +1 - Điểm gần +1 cho biết mẫu ở xa cụm lân cận.
Score of 0 - Điểm 0 cho biết mẫu nằm trên hoặc rất gần ranh giới quyết định giữa hai cụm lân cận.
Score of -1 - Điểm âm chỉ ra rằng các mẫu đã được chỉ định vào các cụm sai.
Tính điểm Silhouette
Trong phần này, chúng ta sẽ học cách tính điểm hình bóng.
Điểm Silhouette có thể được tính bằng công thức sau:
$$ bóng điểm = \ frac {\ left (pq \ right)} {max \ left (p, q \ right)} $$
Đây là khoảng cách trung bình đến các điểm trong cụm gần nhất mà điểm dữ liệu không phải là một phần của nó. Và, là khoảng cách trung bình trong cụm đến tất cả các điểm trong cụm của chính nó.
Để tìm số lượng cụm tối ưu, chúng ta cần chạy lại thuật toán phân nhóm bằng cách nhập metrics mô-đun từ sklearngói hàng. Trong ví dụ sau, chúng tôi sẽ chạy thuật toán phân cụm K-mean để tìm số lượng cụm tối ưu -
Nhập các gói cần thiết như được hiển thị -
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans
Với sự trợ giúp của đoạn mã sau, chúng tôi sẽ tạo tập dữ liệu hai chiều, chứa bốn đốm màu, bằng cách sử dụng make_blob từ sklearn.dataset gói hàng.
from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs(n_samples = 500, centers = 4, cluster_std = 0.40, random_state = 0)
Khởi tạo các biến như hình:
scores = []
values = np.arange(2, 10)
Chúng ta cần lặp lại mô hình K-mean qua tất cả các giá trị và cũng cần đào tạo nó với dữ liệu đầu vào.
for num_clusters in values:
kmeans = KMeans(init = 'k-means++', n_clusters = num_clusters, n_init = 10)
kmeans.fit(X)
Bây giờ, hãy ước tính điểm hình bóng cho mô hình phân nhóm hiện tại bằng cách sử dụng số liệu khoảng cách Euclide -
score = metrics.silhouette_score(X, kmeans.labels_,
metric = 'euclidean', sample_size = len(X))
Dòng mã sau đây sẽ giúp hiển thị số lượng cụm cũng như điểm số Silhouette.
print("\nNumber of clusters =", num_clusters)
print("Silhouette score =", score)
scores.append(score)
Bạn sẽ nhận được kết quả sau:
Number of clusters = 9
Silhouette score = 0.340391138371
num_clusters = np.argmax(scores) + values[0]
print('\nOptimal number of clusters =', num_clusters)
Bây giờ, đầu ra cho số lượng cụm tối ưu sẽ như sau:
Optimal number of clusters = 2
Tìm những người hàng xóm gần nhất
Nếu chúng ta muốn xây dựng hệ thống giới thiệu chẳng hạn như hệ thống giới thiệu phim thì chúng ta cần hiểu khái niệm tìm kiếm những người hàng xóm gần nhất. Đó là bởi vì hệ thống khuyến nghị sử dụng khái niệm về những người hàng xóm gần nhất.
Các concept of finding nearest neighborscó thể được định nghĩa là quá trình tìm điểm gần nhất với điểm đầu vào từ tập dữ liệu đã cho. Việc sử dụng chính của thuật toán KNN) K-láng giềng gần nhất này là xây dựng các hệ thống phân loại phân loại một điểm dữ liệu về mức độ lân cận của điểm dữ liệu đầu vào với các lớp khác nhau.
Mã Python đưa ra bên dưới giúp tìm K-lân cận gần nhất của một tập dữ liệu nhất định -
Nhập các gói cần thiết như hình dưới đây. Ở đây, chúng tôi đang sử dụngNearestNeighbors mô-đun từ sklearn gói hàng
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import NearestNeighbors
Bây giờ chúng ta hãy xác định dữ liệu đầu vào -
A = np.array([[3.1, 2.3], [2.3, 4.2], [3.9, 3.5], [3.7, 6.4], [4.8, 1.9],
[8.3, 3.1], [5.2, 7.5], [4.8, 4.7], [3.5, 5.1], [4.4, 2.9],])
Bây giờ, chúng ta cần xác định các láng giềng gần nhất -
k = 3
Chúng tôi cũng cần cung cấp dữ liệu thử nghiệm mà từ đó tìm thấy những người hàng xóm gần nhất -
test_data = [3.3, 2.9]
Đoạn mã sau có thể trực quan hóa và vẽ biểu đồ dữ liệu đầu vào do chúng tôi xác định:
plt.figure()
plt.title('Input data')
plt.scatter(A[:,0], A[:,1], marker = 'o', s = 100, color = 'black')
Bây giờ, chúng ta cần xây dựng K Nearest Neighbor. Đối tượng cũng cần được đào tạo
knn_model = NearestNeighbors(n_neighbors = k, algorithm = 'auto').fit(X)
distances, indices = knn_model.kneighbors([test_data])
Bây giờ, chúng ta có thể in K láng giềng gần nhất như sau
print("\nK Nearest Neighbors:")
for rank, index in enumerate(indices[0][:k], start = 1):
print(str(rank) + " is", A[index])
Chúng tôi có thể hình dung các hàng xóm gần nhất cùng với điểm dữ liệu thử nghiệm
plt.figure()
plt.title('Nearest neighbors')
plt.scatter(A[:, 0], X[:, 1], marker = 'o', s = 100, color = 'k')
plt.scatter(A[indices][0][:][:, 0], A[indices][0][:][:, 1],
marker = 'o', s = 250, color = 'k', facecolors = 'none')
plt.scatter(test_data[0], test_data[1],
marker = 'x', s = 100, color = 'k')
plt.show()
Đầu ra
K Nearest Neighbors
1 is [ 3.1 2.3]
2 is [ 3.9 3.5]
3 is [ 4.4 2.9]
K-Nearest Neighbors Classifier
Bộ phân loại K-Nearest Neighbors (KNN) là một mô hình phân loại sử dụng thuật toán láng giềng gần nhất để phân loại một điểm dữ liệu nhất định. Chúng ta đã thực hiện thuật toán KNN trong phần trước, bây giờ chúng ta sẽ xây dựng bộ phân loại KNN bằng thuật toán đó.
Khái niệm về KNN Classifier
Khái niệm cơ bản của phân loại láng giềng gần nhất K là tìm một số được xác định trước, tức là, 'k' - của các mẫu huấn luyện gần nhất trong khoảng cách với một mẫu mới, mà mẫu này phải được phân loại. Các mẫu mới sẽ được dán nhãn từ chính những người hàng xóm. Các bộ phân loại KNN có một hằng số do người dùng xác định cố định cho số lượng hàng xóm phải được xác định. Đối với khoảng cách, khoảng cách Euclid tiêu chuẩn là lựa chọn phổ biến nhất. KNN Classifier hoạt động trực tiếp trên các mẫu đã học thay vì tạo ra các quy tắc để học. Thuật toán KNN là một trong những thuật toán đơn giản nhất trong tất cả các thuật toán học máy. Nó đã khá thành công trong một số lượng lớn các bài toán phân loại và hồi quy, ví dụ, nhận dạng ký tự hoặc phân tích hình ảnh.
Example
Chúng tôi đang xây dựng bộ phân loại KNN để nhận dạng các chữ số. Đối với điều này, chúng tôi sẽ sử dụng tập dữ liệu MNIST. Chúng tôi sẽ viết mã này trong Máy tính xách tay Jupyter.
Nhập các gói cần thiết như hình dưới đây.
Ở đây chúng tôi đang sử dụng KNeighborsClassifier mô-đun từ sklearn.neighbors gói -
from sklearn.datasets import *
import pandas as pd
%matplotlib inline
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
import numpy as np
Đoạn mã sau sẽ hiển thị hình ảnh của chữ số để xác minh hình ảnh mà chúng tôi phải kiểm tra -
def Image_display(i):
plt.imshow(digit['images'][i],cmap = 'Greys_r')
plt.show()
Bây giờ, chúng ta cần tải tập dữ liệu MNIST. Trên thực tế có tổng cộng 1797 hình ảnh nhưng chúng tôi đang sử dụng 1600 hình ảnh đầu tiên làm mẫu đào tạo và 197 hình ảnh còn lại sẽ được giữ cho mục đích thử nghiệm.
digit = load_digits()
digit_d = pd.DataFrame(digit['data'][0:1600])
Bây giờ, khi hiển thị các hình ảnh, chúng ta có thể thấy kết quả như sau:
Image_display(0)
Image_display (0)
Hình ảnh của 0 được hiển thị như sau:
Image_display (9)
Hình ảnh của 9 được hiển thị như sau:
digit.keys ()
Bây giờ, chúng ta cần tạo tập dữ liệu đào tạo và thử nghiệm và cung cấp tập dữ liệu thử nghiệm cho các bộ phân loại KNN.
train_x = digit['data'][:1600]
train_y = digit['target'][:1600]
KNN = KNeighborsClassifier(20)
KNN.fit(train_x,train_y)
Đầu ra sau sẽ tạo K phương thức khởi tạo bộ phân loại láng giềng gần nhất:
KNeighborsClassifier(algorithm = 'auto', leaf_size = 30, metric = 'minkowski',
metric_params = None, n_jobs = 1, n_neighbors = 20, p = 2,
weights = 'uniform')
Chúng ta cần tạo mẫu thử nghiệm bằng cách cung cấp bất kỳ số tùy ý nào lớn hơn 1600, là các mẫu huấn luyện.
test = np.array(digit['data'][1725])
test1 = test.reshape(1,-1)
Image_display(1725)
Image_display (6)
Hình ảnh của 6 được hiển thị như sau:
Bây giờ chúng ta sẽ dự đoán dữ liệu thử nghiệm như sau:
KNN.predict(test1)
Đoạn mã trên sẽ tạo ra kết quả sau:
array([6])
Bây giờ, hãy xem xét những điều sau:
digit['target_names']
Đoạn mã trên sẽ tạo ra kết quả sau:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Xử lý ngôn ngữ tự nhiên (NLP) đề cập đến phương pháp AI giao tiếp với các hệ thống thông minh bằng ngôn ngữ tự nhiên như tiếng Anh.
Xử lý ngôn ngữ tự nhiên là bắt buộc khi bạn muốn một hệ thống thông minh như rô-bốt thực hiện theo chỉ dẫn của bạn, khi bạn muốn nghe quyết định từ hệ thống chuyên gia lâm sàng dựa trên đối thoại, v.v.
Lĩnh vực NLP liên quan đến việc làm cho máy tính thực hiện các nhiệm vụ hữu ích với ngôn ngữ tự nhiên mà con người sử dụng. Đầu vào và đầu ra của một hệ thống NLP có thể là:
- Speech
- Văn bản viết tay
Các thành phần của NLP
Trong phần này, chúng ta sẽ tìm hiểu về các thành phần khác nhau của NLP. Có hai thành phần của NLP. Các thành phần được mô tả bên dưới:
Hiểu ngôn ngữ tự nhiên (NLU)
Nó bao gồm các nhiệm vụ sau:
Ánh xạ đầu vào đã cho bằng ngôn ngữ tự nhiên thành các biểu diễn hữu ích.
Phân tích các khía cạnh khác nhau của ngôn ngữ.
Thế hệ ngôn ngữ tự nhiên (NLG)
Đó là quá trình tạo ra các cụm từ và câu có nghĩa dưới dạng ngôn ngữ tự nhiên từ một số biểu diễn bên trong. Nó liên quan đến -
Text planning - Điều này bao gồm việc truy xuất nội dung có liên quan từ cơ sở kiến thức.
Sentence planning - Điều này bao gồm việc lựa chọn các từ cần thiết, tạo thành các cụm từ có nghĩa, thiết lập giọng điệu của câu.
Text Realization - Đây là ánh xạ kế hoạch câu thành cấu trúc câu.
Những khó khăn trong trường ĐHNL
Trường ĐHNL rất phong phú về hình thức và cấu trúc; tuy nhiên, nó là mơ hồ. Có thể có nhiều mức độ mơ hồ khác nhau -
Sự mơ hồ về ngữ nghĩa
Nó ở cấp độ rất sơ khai chẳng hạn như cấp độ từ. Ví dụ, coi từ “board” là danh từ hay động từ?
Mức độ không rõ ràng về cú pháp
Một câu có thể được phân tích cú pháp theo nhiều cách khác nhau. Ví dụ: "Anh ta nâng con bọ có mũ màu đỏ." - Anh ta dùng nắp để nhấc con bọ lên hay anh ta nhấc một con bọ cánh cứng có nắp màu đỏ?
Tham chiếu không rõ ràng
Đề cập đến điều gì đó bằng cách sử dụng đại từ. Ví dụ, Rima đã đến Gauri. Cô ấy nói, "Tôi mệt mỏi." - Chính xác là ai đang mệt?
Thuật ngữ NLP
Bây giờ chúng ta hãy xem một vài thuật ngữ quan trọng trong thuật ngữ NLP.
Phonology - Đó là nghiên cứu về tổ chức âm thanh một cách hệ thống.
Morphology - Đó là nghiên cứu về cấu tạo của từ từ các đơn vị có nghĩa nguyên thủy.
Morpheme - Nó là một đơn vị nghĩa nguyên thủy trong ngôn ngữ.
Syntax- Nó đề cập đến việc sắp xếp các từ để tạo thành một câu. Nó cũng liên quan đến việc xác định vai trò cấu trúc của các từ trong câu và trong các cụm từ.
Semantics - Nó quan tâm đến nghĩa của từ và cách kết hợp các từ thành các cụm từ và câu có nghĩa.
Pragmatics - Nó đề cập đến việc sử dụng và hiểu các câu trong các tình huống khác nhau và cách giải thích câu bị ảnh hưởng.
Discourse - Nó đề cập đến việc câu ngay trước đó có thể ảnh hưởng như thế nào đến việc giải thích câu tiếp theo.
World Knowledge - Nó bao gồm những kiến thức chung về thế giới.
Các bước trong NLP
Phần này trình bày các bước khác nhau trong NLP.
Phân tích từ vựng
Nó liên quan đến việc xác định và phân tích cấu trúc của từ. Từ vựng của một ngôn ngữ có nghĩa là tập hợp các từ và cụm từ trong một ngôn ngữ. Phân tích từ vựng là phân chia toàn bộ đoạn văn bản thành các đoạn văn, câu và từ.
Phân tích cú pháp (Phân tích cú pháp)
Nó bao gồm việc phân tích các từ trong câu để tìm ngữ pháp và sắp xếp các từ theo cách thể hiện mối quan hệ giữa các từ. Câu như "The school go to boy" bị từ chối bởi bộ phân tích cú pháp tiếng Anh.
Phân tích ngữ nghĩa
Nó rút ra ý nghĩa chính xác hoặc nghĩa từ điển từ văn bản. Văn bản được kiểm tra xem có ý nghĩa hay không. Nó được thực hiện bằng cách ánh xạ các cấu trúc cú pháp và các đối tượng trong miền tác vụ. Bộ phân tích ngữ nghĩa bỏ qua câu chẳng hạn như "kem nóng".
Tích hợp bài giảng
Ý nghĩa của bất kỳ câu nào phụ thuộc vào nghĩa của câu ngay trước nó. Ngoài ra nó còn mang ý nghĩa câu thành công ngay lập tức.
Phân tích thực dụng
Trong lúc này, những gì đã nói sẽ được diễn giải lại dựa trên ý nghĩa thực sự của nó. Nó liên quan đến việc tạo ra những khía cạnh của ngôn ngữ đòi hỏi kiến thức thế giới thực.
Trong chương này, chúng ta sẽ học cách bắt đầu với Gói bộ công cụ ngôn ngữ tự nhiên.
Điều kiện tiên quyết
Nếu chúng ta muốn xây dựng các ứng dụng với xử lý Ngôn ngữ Tự nhiên thì việc thay đổi ngữ cảnh sẽ gây khó khăn nhất. Yếu tố ngữ cảnh ảnh hưởng đến cách máy hiểu một câu cụ thể. Do đó, chúng ta cần phát triển các ứng dụng Ngôn ngữ tự nhiên bằng cách sử dụng các phương pháp tiếp cận máy học để máy móc cũng có thể hiểu cách con người có thể hiểu ngữ cảnh.
Để xây dựng các ứng dụng như vậy, chúng tôi sẽ sử dụng gói Python có tên NLTK (Natural Language Toolkit Package).
Nhập NLTK
Chúng ta cần cài đặt NLTK trước khi sử dụng nó. Nó có thể được cài đặt với sự trợ giúp của lệnh sau:
pip install nltk
Để xây dựng một gói chung cư cho NLTK, hãy sử dụng lệnh sau:
conda install -c anaconda nltk
Bây giờ sau khi cài đặt gói NLTK, chúng ta cần nhập nó thông qua dấu nhắc lệnh python. Chúng ta có thể nhập nó bằng cách viết lệnh sau trên dấu nhắc lệnh Python:
>>> import nltk
Tải xuống dữ liệu của NLTK
Bây giờ sau khi nhập NLTK, chúng ta cần tải xuống dữ liệu cần thiết. Nó có thể được thực hiện với sự trợ giúp của lệnh sau trên dấu nhắc lệnh Python:
>>> nltk.download()
Cài đặt các gói cần thiết khác
Để xây dựng các ứng dụng xử lý ngôn ngữ tự nhiên bằng NLTK, chúng ta cần cài đặt các gói cần thiết. Các gói như sau:
gensim
Đây là một thư viện mô hình ngữ nghĩa mạnh mẽ hữu ích cho nhiều ứng dụng. Chúng ta có thể cài đặt nó bằng cách thực hiện lệnh sau:
pip install gensim
mẫu
Nó được sử dụng để làm gensimgói hoạt động đúng cách. Chúng ta có thể cài đặt nó bằng cách thực hiện lệnh sau
pip install pattern
Khái niệm Tokenization, Stemming và Lemmatization
Trong phần này, chúng ta sẽ hiểu thế nào là mã hóa, tạo gốc và bổ sung.
Mã hóa
Nó có thể được định nghĩa là quá trình phá vỡ văn bản đã cho tức là chuỗi ký tự thành các đơn vị nhỏ hơn được gọi là mã thông báo. Các mã có thể là các từ, số hoặc dấu chấm câu. Nó còn được gọi là phân đoạn từ. Sau đây là một ví dụ đơn giản về mã hóa -
Input - Xoài, chuối, dứa và táo đều là hoa quả.
Output -
Quá trình phá vỡ văn bản đã cho có thể được thực hiện với sự trợ giúp của việc xác định các ranh giới từ. Sự kết thúc của một từ và sự bắt đầu của một từ mới được gọi là ranh giới từ. Hệ thống chữ viết và cấu trúc kiểu chữ của các từ ảnh hưởng đến ranh giới.
Trong mô-đun Python NLTK, chúng tôi có các gói khác nhau liên quan đến mã hóa mà chúng tôi có thể sử dụng để chia văn bản thành các mã thông báo theo yêu cầu của chúng tôi. Một số gói như sau:
gói sent_tokenize
Như tên gợi ý, gói này sẽ chia văn bản đầu vào thành các câu. Chúng tôi có thể nhập gói này với sự trợ giúp của mã Python sau:
from nltk.tokenize import sent_tokenize
gói word_tokenize
Gói này chia văn bản đầu vào thành các từ. Chúng tôi có thể nhập gói này với sự trợ giúp của mã Python sau:
from nltk.tokenize import word_tokenize
Gói WordPunctTokenizer
Gói này chia văn bản đầu vào thành các từ cũng như các dấu câu. Chúng tôi có thể nhập gói này với sự trợ giúp của mã Python sau:
from nltk.tokenize import WordPuncttokenizer
Gốc
Trong khi làm việc với các từ, chúng ta bắt gặp rất nhiều biến thể do lý do ngữ pháp. Khái niệm về các biến thể ở đây có nghĩa là chúng ta phải xử lý các dạng khác nhau của cùng một từ nhưdemocracy, democratic, và democratization. Nó rất cần thiết để máy móc hiểu rằng những từ khác nhau này có cùng một dạng cơ sở. Bằng cách này, sẽ rất hữu ích khi trích xuất các dạng cơ bản của các từ trong khi chúng ta phân tích văn bản.
Chúng ta có thể đạt được điều này bằng cách xuất phát. Theo cách này, chúng ta có thể nói rằng tạo gốc là quá trình tự khám phá để rút ra các dạng cơ sở của từ bằng cách cắt bỏ các đầu của từ.
Trong mô-đun Python NLTK, chúng tôi có các gói khác nhau liên quan đến việc tạo gốc. Các gói này có thể được sử dụng để lấy các dạng cơ bản của từ. Các gói này sử dụng các thuật toán. Một số gói như sau:
Gói PorterStemmer
Gói Python này sử dụng thuật toán Porter để trích xuất biểu mẫu cơ sở. Chúng tôi có thể nhập gói này với sự trợ giúp của mã Python sau:
from nltk.stem.porter import PorterStemmer
Ví dụ, nếu chúng ta sẽ đưa ra từ ‘writing’ là đầu vào cho trình gốc này, chúng tôi sẽ nhận được từ ‘write’ sau khi chiết cành.
Gói LancasterStemmer
Gói Python này sẽ sử dụng thuật toán Lancaster để trích xuất biểu mẫu cơ sở. Chúng tôi có thể nhập gói này với sự trợ giúp của mã Python sau:
from nltk.stem.lancaster import LancasterStemmer
Ví dụ, nếu chúng ta sẽ đưa ra từ ‘writing’ là đầu vào cho trình gốc này, chúng tôi sẽ nhận được từ ‘write’ sau khi chiết cành.
Gói SnowballStemmer
Gói Python này sẽ sử dụng thuật toán của quả cầu tuyết để trích xuất dạng cơ sở. Chúng tôi có thể nhập gói này với sự trợ giúp của mã Python sau:
from nltk.stem.snowball import SnowballStemmer
Ví dụ, nếu chúng ta sẽ đưa ra từ ‘writing’ là đầu vào cho trình gốc này, chúng tôi sẽ nhận được từ ‘write’ sau khi chiết cành.
Tất cả các thuật toán này có mức độ nghiêm ngặt khác nhau. Nếu chúng ta so sánh ba loại máy cắt gốc này thì máy cắt gốc Porter là ít nghiêm ngặt nhất và Lancaster là nghiêm ngặt nhất. Snowball stemmer sử dụng tốt về tốc độ cũng như độ chặt chẽ.
Bổ sung
Chúng ta cũng có thể trích xuất dạng cơ sở của từ bằng cách bổ sung. Về cơ bản, nó thực hiện nhiệm vụ này với việc sử dụng phân tích từ vựng và hình thái của các từ, thông thường chỉ nhằm mục đích loại bỏ các kết thúc không theo chiều hướng. Dạng cơ sở này của bất kỳ từ nào được gọi là bổ đề.
Sự khác biệt chính giữa cách đặt gốc và bổ ngữ là việc sử dụng từ vựng và phân tích hình thái của các từ. Một điểm khác biệt nữa là bổ đề thường thu gọn các từ liên quan đến phái sinh trong khi bổ đề thường chỉ thu gọn các dạng vô hướng khác nhau của bổ đề. Ví dụ: nếu chúng ta cung cấp từ saw làm từ đầu vào thì việc đặt gốc có thể trả về từ 's' nhưng bổ sung sẽ cố gắng trả lại từ see hoặc saw tùy thuộc vào việc sử dụng mã thông báo là động từ hay danh từ.
Trong mô-đun Python NLTK, chúng tôi có gói sau liên quan đến quá trình lemmatization mà chúng tôi có thể sử dụng để lấy các dạng cơ bản của từ:
Gói WordNetLemmatizer
Gói Python này sẽ trích xuất dạng cơ sở của từ tùy thuộc vào việc nó được sử dụng như một danh từ hay một động từ. Chúng tôi có thể nhập gói này với sự trợ giúp của mã Python sau:
from nltk.stem import WordNetLemmatizer
Chunking: Chia dữ liệu thành các Chunks
Nó là một trong những quá trình quan trọng trong xử lý ngôn ngữ tự nhiên. Công việc chính của phân khúc là xác định các phần của lời nói và các cụm từ ngắn như cụm danh từ. Chúng tôi đã nghiên cứu quá trình mã hóa, việc tạo ra các mã thông báo. Chunking về cơ bản là ghi nhãn của những token đó. Nói cách khác, phân khúc sẽ cho chúng ta thấy cấu trúc của câu.
Trong phần sau, chúng ta sẽ tìm hiểu về các loại Chunking.
Các loại chunking
Có hai loại chunking. Các loại như sau:
Chunking lên
Trong quá trình phân chia này, đối tượng, sự vật, v.v ... sẽ trở nên tổng quát hơn và ngôn ngữ trở nên trừu tượng hơn. Có nhiều cơ hội thỏa thuận hơn. Trong quá trình này, chúng tôi thu nhỏ. Ví dụ, nếu chúng ta sắp đặt câu hỏi “ô tô dùng cho mục đích gì”? Chúng tôi có thể nhận được câu trả lời là "vận chuyển".
Chunking xuống
Trong quá trình phân tách này, đối tượng, sự vật, v.v. sẽ trở nên cụ thể hơn và ngôn ngữ được thâm nhập nhiều hơn. Cấu trúc sâu hơn sẽ được xem xét khi phân tích. Trong quá trình này, chúng tôi phóng to. Ví dụ: nếu chúng tôi rút ngắn câu hỏi "Kể cụ thể về một chiếc xe hơi"? Chúng tôi sẽ nhận được những thông tin nhỏ hơn về chiếc xe.
Example
Trong ví dụ này, chúng ta sẽ thực hiện phân đoạn Danh từ-Cụm từ, một thể loại phân loại sẽ tìm các cụm danh từ trong câu, bằng cách sử dụng mô-đun NLTK trong Python -
Follow these steps in python for implementing noun phrase chunking −
Step 1- Ở bước này, chúng ta cần xác định ngữ pháp cho chunking. Nó sẽ bao gồm các quy tắc mà chúng ta cần tuân theo.
Step 2- Ở bước này, chúng ta cần tạo một trình phân tích cú pháp chunk. Nó sẽ phân tích ngữ pháp và đưa ra kết quả.
Step 3 - Trong bước cuối cùng này, đầu ra được tạo ra ở dạng cây.
Hãy để chúng tôi nhập gói NLTK cần thiết như sau:
import nltk
Bây giờ, chúng ta cần xác định câu. Ở đây, DT nghĩa là định thức, VBP nghĩa là động từ, JJ nghĩa là tính từ, IN nghĩa là giới từ và NN nghĩa là danh từ.
sentence=[("a","DT"),("clever","JJ"),("fox","NN"),("was","VBP"),
("jumping","VBP"),("over","IN"),("the","DT"),("wall","NN")]
Bây giờ, chúng ta cần đưa ra ngữ pháp. Ở đây, chúng tôi sẽ đưa ra các ngữ pháp ở dạng biểu thức chính quy.
grammar = "NP:{<DT>?<JJ>*<NN>}"
Chúng ta cần xác định một trình phân tích cú pháp sẽ phân tích ngữ pháp.
parser_chunking = nltk.RegexpParser(grammar)
Trình phân tích cú pháp phân tích câu như sau:
parser_chunking.parse(sentence)
Tiếp theo, chúng ta cần lấy đầu ra. Đầu ra được tạo trong biến đơn giản được gọi làoutput_chunk.
Output_chunk = parser_chunking.parse(sentence)
Khi thực thi đoạn mã sau, chúng ta có thể vẽ đầu ra của mình dưới dạng cây.
output.draw()
Mô hình Bag of Word (BoW)
Bag of Word (BoW), một mô hình trong xử lý ngôn ngữ tự nhiên, về cơ bản được sử dụng để trích xuất các tính năng từ văn bản để văn bản có thể được sử dụng trong việc lập mô hình như trong các thuật toán học máy.
Bây giờ câu hỏi đặt ra là tại sao chúng ta cần trích xuất các tính năng từ văn bản. Đó là vì các thuật toán học máy không thể hoạt động với dữ liệu thô và chúng cần dữ liệu số để có thể trích xuất thông tin có ý nghĩa từ đó. Việc chuyển đổi dữ liệu văn bản thành dữ liệu số được gọi là trích xuất đối tượng hoặc mã hóa đối tượng.
Làm thế nào nó hoạt động
Đây là cách tiếp cận rất đơn giản để trích xuất các tính năng từ văn bản. Giả sử chúng ta có một tài liệu văn bản và chúng ta muốn chuyển nó thành dữ liệu số hoặc nói muốn trích xuất các tính năng của nó thì trước hết mô hình này trích xuất một từ vựng từ tất cả các từ trong tài liệu. Sau đó, bằng cách sử dụng ma trận thuật ngữ tài liệu, nó sẽ xây dựng một mô hình. Theo cách này, BoW chỉ biểu thị tài liệu như một túi từ. Mọi thông tin về thứ tự hoặc cấu trúc của các từ trong tài liệu sẽ bị loại bỏ.
Khái niệm về ma trận thuật ngữ tài liệu
Thuật toán BoW xây dựng mô hình bằng cách sử dụng ma trận thuật ngữ tài liệu. Như tên cho thấy, ma trận thuật ngữ tài liệu là ma trận của các số lượng từ khác nhau xuất hiện trong tài liệu. Với sự trợ giúp của ma trận này, tài liệu văn bản có thể được biểu diễn dưới dạng sự kết hợp có trọng số của nhiều từ khác nhau. Bằng cách đặt ngưỡng và chọn các từ có ý nghĩa hơn, chúng tôi có thể xây dựng biểu đồ của tất cả các từ trong tài liệu có thể được sử dụng làm vectơ đặc trưng. Sau đây là một ví dụ để hiểu khái niệm về ma trận thuật ngữ tài liệu:
Example
Giả sử chúng ta có hai câu sau:
Sentence 1 - Chúng tôi đang sử dụng mô hình Bag of Words.
Sentence 2 - Mô hình Bag of Words được sử dụng để trích xuất các tính năng.
Bây giờ, bằng cách xem xét hai câu này, chúng ta có 13 từ khác biệt sau:
- we
- are
- using
- the
- bag
- of
- words
- model
- is
- used
- for
- extracting
- features
Bây giờ, chúng ta cần xây dựng biểu đồ cho mỗi câu bằng cách sử dụng số từ trong mỗi câu -
Sentence 1 - [1,1,1,1,1,1,1,1,0,0,0,0,0]
Sentence 2 - [0,0,0,1,1,1,1,1,1,1,1,1,1]
Bằng cách này, chúng tôi có các vectơ đặc trưng đã được trích xuất. Mỗi vectơ đặc trưng là 13 chiều vì chúng ta có 13 từ riêng biệt.
Khái niệm về thống kê
Khái niệm thống kê được gọi là Tần suất tài liệu nghịch đảo-Thuật ngữ (tf-idf). Mỗi từ đều quan trọng trong tài liệu. Các số liệu thống kê giúp chúng tôi hiểu tầm quan trọng của mỗi từ.
Tần suất kỳ hạn (tf)
Nó là thước đo tần suất mỗi từ xuất hiện trong tài liệu. Nó có thể nhận được bằng cách chia số lượng của mỗi từ cho tổng số từ trong một tài liệu nhất định.
Tần suất tài liệu nghịch đảo (idf)
Nó là thước đo mức độ duy nhất của một từ đối với tài liệu này trong bộ tài liệu nhất định. Để tính toán idf và xây dựng một vectơ đặc trưng riêng biệt, chúng ta cần giảm trọng số của các từ thường xuất hiện như và và tăng trọng số của các từ hiếm.
Xây dựng Mô hình Túi từ trong NLTK
Trong phần này, chúng ta sẽ xác định một tập hợp các chuỗi bằng cách sử dụng CountVectorizer để tạo vectơ từ các câu này.
Hãy để chúng tôi nhập gói cần thiết -
from sklearn.feature_extraction.text import CountVectorizer
Bây giờ xác định tập hợp các câu.
Sentences = ['We are using the Bag of Word model', 'Bag of Word model is
used for extracting the features.']
vectorizer_count = CountVectorizer()
features_text = vectorizer.fit_transform(Sentences).todense()
print(vectorizer.vocabulary_)
Chương trình trên tạo ra kết quả như hình dưới đây. Nó cho thấy rằng chúng ta có 13 từ khác biệt trong hai câu trên -
{'we': 11, 'are': 0, 'using': 10, 'the': 8, 'bag': 1, 'of': 7,
'word': 12, 'model': 6, 'is': 5, 'used': 9, 'for': 4, 'extracting': 2, 'features': 3}
Đây là các vectơ đặc trưng (dạng văn bản thành số) có thể được sử dụng cho học máy.
Giải quyết những vấn đề
Trong phần này, chúng tôi sẽ giải quyết một vài vấn đề liên quan.
Dự đoán danh mục
Trong một bộ văn bản, không chỉ từ ngữ mà thể loại của từ ngữ cũng rất quan trọng; trong loại văn bản mà một từ cụ thể rơi vào. Ví dụ: chúng tôi muốn dự đoán xem một câu đã cho có thuộc danh mục email, tin tức, thể thao, máy tính, v.v. Trong ví dụ sau, chúng tôi sẽ sử dụng tf-idf để tạo một vectơ đặc trưng để tìm danh mục tài liệu. Chúng tôi sẽ sử dụng dữ liệu từ 20 tập dữ liệu nhóm tin của sklearn.
Chúng tôi cần nhập các gói cần thiết -
from sklearn.datasets import fetch_20newsgroups
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
Xác định bản đồ danh mục. Chúng tôi đang sử dụng năm danh mục khác nhau có tên là Tôn giáo, Ô tô, Thể thao, Điện tử và Không gian.
category_map = {'talk.religion.misc':'Religion','rec.autos''Autos',
'rec.sport.hockey':'Hockey','sci.electronics':'Electronics', 'sci.space': 'Space'}
Tạo tập huấn luyện -
training_data = fetch_20newsgroups(subset = 'train',
categories = category_map.keys(), shuffle = True, random_state = 5)
Xây dựng một vectơ đếm và trích xuất số lượng từ -
vectorizer_count = CountVectorizer()
train_tc = vectorizer_count.fit_transform(training_data.data)
print("\nDimensions of training data:", train_tc.shape)
Biến áp tf-idf được tạo như sau:
tfidf = TfidfTransformer()
train_tfidf = tfidf.fit_transform(train_tc)
Bây giờ, xác định dữ liệu thử nghiệm -
input_data = [
'Discovery was a space shuttle',
'Hindu, Christian, Sikh all are religions',
'We must have to drive safely',
'Puck is a disk made of rubber',
'Television, Microwave, Refrigrated all uses electricity'
]
Dữ liệu trên sẽ giúp chúng tôi đào tạo bộ phân loại Naive Bayes đa thức -
classifier = MultinomialNB().fit(train_tfidf, training_data.target)
Chuyển đổi dữ liệu đầu vào bằng cách sử dụng vector số đếm -
input_tc = vectorizer_count.transform(input_data)
Bây giờ, chúng ta sẽ chuyển đổi dữ liệu được vector hóa bằng cách sử dụng biến áp tfidf -
input_tfidf = tfidf.transform(input_tc)
Chúng tôi sẽ dự đoán các loại đầu ra -
predictions = classifier.predict(input_tfidf)
Đầu ra được tạo như sau:
for sent, category in zip(input_data, predictions):
print('\nInput Data:', sent, '\n Category:', \
category_map[training_data.target_names[category]])
Công cụ dự đoán danh mục tạo ra kết quả sau:
Dimensions of training data: (2755, 39297)
Input Data: Discovery was a space shuttle
Category: Space
Input Data: Hindu, Christian, Sikh all are religions
Category: Religion
Input Data: We must have to drive safely
Category: Autos
Input Data: Puck is a disk made of rubber
Category: Hockey
Input Data: Television, Microwave, Refrigrated all uses electricity
Category: Electronics
Tìm kiếm giới tính
Trong câu lệnh bài toán này, một bộ phân loại sẽ được đào tạo để tìm giới tính (nam hoặc nữ) bằng cách cung cấp tên. Chúng ta cần sử dụng phương pháp heuristic để xây dựng một vector đặc trưng và đào tạo bộ phân loại. Chúng tôi sẽ sử dụng dữ liệu được gắn nhãn từ gói scikit-learning. Sau đây là mã Python để xây dựng công cụ tìm giới tính:
Hãy để chúng tôi nhập các gói cần thiết -
import random
from nltk import NaiveBayesClassifier
from nltk.classify import accuracy as nltk_accuracy
from nltk.corpus import names
Bây giờ chúng ta cần trích xuất N ký tự cuối cùng từ đầu vào. Các chữ cái này sẽ hoạt động như các tính năng -
def extract_features(word, N = 2):
last_n_letters = word[-N:]
return {'feature': last_n_letters.lower()}
if __name__=='__main__':
Tạo dữ liệu đào tạo bằng cách sử dụng các tên được gắn nhãn (nam cũng như nữ) có sẵn trong NLTK -
male_list = [(name, 'male') for name in names.words('male.txt')]
female_list = [(name, 'female') for name in names.words('female.txt')]
data = (male_list + female_list)
random.seed(5)
random.shuffle(data)
Bây giờ, dữ liệu thử nghiệm sẽ được tạo như sau:
namesInput = ['Rajesh', 'Gaurav', 'Swati', 'Shubha']
Xác định số lượng mẫu được sử dụng để huấn luyện và thử nghiệm bằng mã sau
train_sample = int(0.8 * len(data))
Bây giờ, chúng ta cần lặp qua các độ dài khác nhau để có thể so sánh độ chính xác -
for i in range(1, 6):
print('\nNumber of end letters:', i)
features = [(extract_features(n, i), gender) for (n, gender) in data]
train_data, test_data = features[:train_sample],
features[train_sample:]
classifier = NaiveBayesClassifier.train(train_data)
Độ chính xác của bộ phân loại có thể được tính như sau:
accuracy_classifier = round(100 * nltk_accuracy(classifier, test_data), 2)
print('Accuracy = ' + str(accuracy_classifier) + '%')
Bây giờ, chúng ta có thể dự đoán đầu ra -
for name in namesInput:
print(name, '==>', classifier.classify(extract_features(name, i)))
Chương trình trên sẽ tạo ra kết quả sau:
Number of end letters: 1
Accuracy = 74.7%
Rajesh -> female
Gaurav -> male
Swati -> female
Shubha -> female
Number of end letters: 2
Accuracy = 78.79%
Rajesh -> male
Gaurav -> male
Swati -> female
Shubha -> female
Number of end letters: 3
Accuracy = 77.22%
Rajesh -> male
Gaurav -> female
Swati -> female
Shubha -> female
Number of end letters: 4
Accuracy = 69.98%
Rajesh -> female
Gaurav -> female
Swati -> female
Shubha -> female
Number of end letters: 5
Accuracy = 64.63%
Rajesh -> female
Gaurav -> female
Swati -> female
Shubha -> female
Trong đầu ra ở trên, chúng ta có thể thấy rằng độ chính xác về số lượng chữ cái cuối tối đa là hai và nó đang giảm khi số lượng chữ cái cuối ngày càng tăng.
Lập mô hình chủ đề: Xác định các mẫu trong dữ liệu văn bản
Chúng tôi biết rằng thông thường các tài liệu được nhóm thành các chủ đề. Đôi khi chúng ta cần xác định các mẫu trong văn bản tương ứng với một chủ đề cụ thể. Kỹ thuật thực hiện điều này được gọi là mô hình hóa chủ đề. Nói cách khác, chúng ta có thể nói rằng mô hình hóa chủ đề là một kỹ thuật để khám phá các chủ đề trừu tượng hoặc cấu trúc ẩn trong một bộ tài liệu nhất định.
Chúng ta có thể sử dụng kỹ thuật mô hình hóa chủ đề trong các tình huống sau:
Phân loại văn bản
Với sự trợ giúp của mô hình chủ đề, việc phân loại có thể được cải thiện bởi vì nó nhóm các từ tương tự lại với nhau thay vì sử dụng từng từ riêng biệt làm đặc điểm.
Hệ thống đề xuất
Với sự trợ giúp của mô hình chủ đề, chúng tôi có thể xây dựng hệ thống khuyến nghị bằng cách sử dụng các biện pháp tương tự.
Các thuật toán để lập mô hình chủ đề
Mô hình chủ đề có thể được thực hiện bằng cách sử dụng các thuật toán. Các thuật toán như sau:
Phân bổ Dirichlet tiềm ẩn (LDA)
Thuật toán này là phổ biến nhất cho mô hình chủ đề. Nó sử dụng các mô hình đồ họa xác suất để thực hiện mô hình hóa chủ đề. Chúng ta cần nhập gói gensim bằng Python để sử dụng thuật toán LDA.
Phân tích ngữ nghĩa tiềm ẩn (LDA) hoặc Lập chỉ mục ngữ nghĩa tiềm ẩn (LSI)
Thuật toán này dựa trên Đại số tuyến tính. Về cơ bản nó sử dụng khái niệm SVD (Phân hủy Giá trị Số ít) trên ma trận thuật ngữ tài liệu.
Hệ số hóa ma trận không âm (NMF)
Nó cũng dựa trên Đại số tuyến tính.
Tất cả các thuật toán được đề cập ở trên cho mô hình chủ đề sẽ có number of topics như một tham số, Document-Word Matrix như một đầu vào và WTM (Word Topic Matrix) & TDM (Topic Document Matrix) như đầu ra.
Dự đoán tiếp theo trong một chuỗi đầu vào nhất định là một khái niệm quan trọng khác trong học máy. Chương này cung cấp cho bạn lời giải thích chi tiết về phân tích dữ liệu chuỗi thời gian.
Giới thiệu
Dữ liệu chuỗi thời gian có nghĩa là dữ liệu nằm trong một chuỗi các khoảng thời gian cụ thể. Nếu chúng ta muốn xây dựng dự đoán trình tự trong học máy, thì chúng ta phải xử lý dữ liệu tuần tự và thời gian. Dữ liệu chuỗi là một bản tóm tắt của dữ liệu tuần tự. Thứ tự dữ liệu là một tính năng quan trọng của dữ liệu tuần tự.
Khái niệm cơ bản về phân tích chuỗi hoặc phân tích chuỗi thời gian
Phân tích trình tự hoặc phân tích chuỗi thời gian là dự đoán tiếp theo trong một trình tự đầu vào nhất định dựa trên những gì đã quan sát trước đó. Dự đoán có thể là bất cứ điều gì có thể xảy ra tiếp theo: một biểu tượng, một con số, thời tiết ngày hôm sau, kỳ tiếp theo trong bài phát biểu, v.v. Phân tích trình tự có thể rất hữu ích trong các ứng dụng như phân tích thị trường chứng khoán, dự báo thời tiết và đề xuất sản phẩm.
Example
Hãy xem xét ví dụ sau để hiểu dự đoán chuỗi. ĐâyA,B,C,D là các giá trị đã cho và bạn phải dự đoán giá trị E sử dụng Mô hình dự đoán trình tự.
Cài đặt các gói hữu ích
Để phân tích dữ liệu chuỗi thời gian bằng Python, chúng ta cần cài đặt các gói sau:
Gấu trúc
Pandas là một thư viện mã nguồn mở được cấp phép BSD cung cấp các công cụ phân tích dữ liệu và hiệu suất cao, dễ sử dụng cấu trúc dữ liệu cho Python. Bạn có thể cài đặt Pandas với sự trợ giúp của lệnh sau:
pip install pandas
Nếu bạn đang sử dụng Anaconda và muốn cài đặt bằng cách sử dụng conda trình quản lý gói, sau đó bạn có thể sử dụng lệnh sau:
conda install -c anaconda pandas
hmmlearn
Nó là một thư viện mã nguồn mở được cấp phép BSD bao gồm các thuật toán và mô hình đơn giản để học Mô hình Markov ẩn (HMM) trong Python. Bạn có thể cài đặt nó với sự trợ giúp của lệnh sau:
pip install hmmlearn
Nếu bạn đang sử dụng Anaconda và muốn cài đặt bằng cách sử dụng conda trình quản lý gói, sau đó bạn có thể sử dụng lệnh sau:
conda install -c omnia hmmlearn
PyStruct
Nó là một thư viện dự đoán và học tập có cấu trúc. Các thuật toán học tập được thực hiện trong PyStruct có các tên như trường ngẫu nhiên có điều kiện (CRF), Mạng ngẫu nhiên Markov biên tối đa (M3N) hoặc máy vectơ hỗ trợ cấu trúc. Bạn có thể cài đặt nó với sự trợ giúp của lệnh sau:
pip install pystruct
CVXOPT
Nó được sử dụng để tối ưu hóa lồi dựa trên ngôn ngữ lập trình Python. Nó cũng là một gói phần mềm miễn phí. Bạn có thể cài đặt nó với sự trợ giúp của lệnh sau:
pip install cvxopt
Nếu bạn đang sử dụng Anaconda và muốn cài đặt bằng cách sử dụng conda trình quản lý gói, sau đó bạn có thể sử dụng lệnh sau:
conda install -c anaconda cvdoxt
Gấu trúc: Xử lý, cắt và trích xuất thống kê từ dữ liệu chuỗi thời gian
Pandas là một công cụ rất hữu ích nếu bạn phải làm việc với dữ liệu chuỗi thời gian. Với sự trợ giúp của Pandas, bạn có thể thực hiện những việc sau:
Tạo một phạm vi ngày bằng cách sử dụng pd.date_range gói hàng
Lập chỉ mục gấu trúc với ngày tháng bằng cách sử dụng pd.Series gói hàng
Thực hiện lấy mẫu lại bằng cách sử dụng ts.resample gói hàng
Thay đổi tần số
Thí dụ
Ví dụ sau cho thấy bạn xử lý và cắt dữ liệu chuỗi thời gian bằng cách sử dụng Pandas. Lưu ý rằng ở đây chúng tôi đang sử dụng dữ liệu Dao động Bắc Cực hàng tháng, có thể được tải xuống từ month.ao.index.b50.current.ascii và có thể được chuyển đổi sang định dạng văn bản để chúng tôi sử dụng.
Xử lý dữ liệu chuỗi thời gian
Để xử lý dữ liệu chuỗi thời gian, bạn sẽ phải thực hiện các bước sau:
Bước đầu tiên liên quan đến việc nhập các gói sau:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
Tiếp theo, xác định một hàm sẽ đọc dữ liệu từ tệp đầu vào, như được hiển thị trong đoạn mã dưới đây -
def read_data(input_file):
input_data = np.loadtxt(input_file, delimiter = None)
Bây giờ, hãy chuyển đổi dữ liệu này thành chuỗi thời gian. Đối với điều này, hãy tạo phạm vi ngày trong chuỗi thời gian của chúng tôi. Trong ví dụ này, chúng tôi giữ một tháng làm tần suất dữ liệu. Tệp của chúng tôi có dữ liệu bắt đầu từ tháng 1 năm 1950.
dates = pd.date_range('1950-01', periods = input_data.shape[0], freq = 'M')
Trong bước này, chúng tôi tạo dữ liệu chuỗi thời gian với sự trợ giúp của Chuỗi Pandas, như được hiển thị bên dưới -
output = pd.Series(input_data[:, index], index = dates)
return output
if __name__=='__main__':
Nhập đường dẫn của tệp đầu vào như hình ở đây -
input_file = "/Users/admin/AO.txt"
Bây giờ, chuyển đổi cột sang định dạng thời gian, như được hiển thị ở đây -
timeseries = read_data(input_file)
Cuối cùng, vẽ và hình dung dữ liệu, sử dụng các lệnh được hiển thị:
plt.figure()
timeseries.plot()
plt.show()
Bạn sẽ quan sát các ô như thể hiện trong các hình ảnh sau:
Cắt dữ liệu chuỗi thời gian
Cắt chỉ liên quan đến việc truy xuất một số phần của dữ liệu chuỗi thời gian. Là một phần của ví dụ, chúng tôi chỉ cắt dữ liệu từ năm 1980 đến năm 1990. Hãy quan sát đoạn mã sau thực hiện tác vụ này:
timeseries['1980':'1990'].plot()
<matplotlib.axes._subplots.AxesSubplot at 0xa0e4b00>
plt.show()
Khi bạn chạy mã để cắt dữ liệu chuỗi thời gian, bạn có thể quan sát biểu đồ sau như được hiển thị trong hình ảnh ở đây:
Trích xuất thống kê từ dữ liệu chuỗi thời gian
Bạn sẽ phải trích xuất một số thống kê từ một dữ liệu nhất định, trong những trường hợp bạn cần rút ra một số kết luận quan trọng. Giá trị trung bình, phương sai, tương quan, giá trị lớn nhất và giá trị nhỏ nhất là một số thống kê như vậy. Bạn có thể sử dụng mã sau nếu muốn trích xuất các thống kê như vậy từ dữ liệu chuỗi thời gian nhất định:
Nghĩa là
Bạn có thể dùng mean() để tìm giá trị trung bình, như được hiển thị ở đây -
timeseries.mean()
Sau đó, kết quả mà bạn sẽ quan sát cho ví dụ được thảo luận là:
-0.11143128165238671
Tối đa
Bạn có thể dùng max() , để tìm giá trị tối đa, như được hiển thị ở đây -
timeseries.max()
Sau đó, kết quả mà bạn sẽ quan sát cho ví dụ được thảo luận là:
3.4952999999999999
Tối thiểu
Bạn có thể sử dụng hàm min () để tìm giá trị tối thiểu, như được hiển thị ở đây -
timeseries.min()
Sau đó, kết quả mà bạn sẽ quan sát cho ví dụ được thảo luận là:
-4.2656999999999998
Nhận mọi thứ cùng một lúc
Nếu bạn muốn tính toán tất cả các thống kê cùng một lúc, bạn có thể sử dụng describe() chức năng như được hiển thị ở đây -
timeseries.describe()
Sau đó, kết quả mà bạn sẽ quan sát cho ví dụ được thảo luận là:
count 817.000000
mean -0.111431
std 1.003151
min -4.265700
25% -0.649430
50% -0.042744
75% 0.475720
max 3.495300
dtype: float64
Lấy mẫu lại
Bạn có thể lấy mẫu lại dữ liệu theo một tần suất thời gian khác. Hai tham số để thực hiện lấy mẫu lại là:
- Khoảng thời gian
- Method
Lấy mẫu lại với giá trị trung bình ()
Bạn có thể sử dụng mã sau để lấy mẫu lại dữ liệu bằng phương thức mean (), là phương thức mặc định -
timeseries_mm = timeseries.resample("A").mean()
timeseries_mm.plot(style = 'g--')
plt.show()
Sau đó, bạn có thể quan sát biểu đồ sau như là kết quả của việc lấy mẫu lại bằng cách sử dụng mean () -
Lấy mẫu lại với trung vị ()
Bạn có thể sử dụng mã sau để lấy mẫu lại dữ liệu bằng cách sử dụng median()phương pháp -
timeseries_mm = timeseries.resample("A").median()
timeseries_mm.plot()
plt.show()
Sau đó, bạn có thể quan sát biểu đồ sau là đầu ra của lấy mẫu lại với trung vị () -
Rolling Mean
Bạn có thể sử dụng mã sau để tính toán trung bình lăn (di chuyển):
timeseries.rolling(window = 12, center = False).mean().plot(style = '-g')
plt.show()
Sau đó, bạn có thể quan sát biểu đồ sau khi đầu ra của giá trị trung bình lăn (di chuyển):
Phân tích dữ liệu tuần tự bằng mô hình Markov ẩn (HMM)
HMM là một mô hình thống kê được sử dụng rộng rãi cho dữ liệu có tính liên tục và khả năng mở rộng như phân tích thị trường chứng khoán theo chuỗi thời gian, kiểm tra sức khỏe và nhận dạng giọng nói. Phần này đề cập chi tiết đến việc phân tích dữ liệu tuần tự bằng Mô hình Markov ẩn (HMM).
Mô hình Markov ẩn (HMM)
HMM là một mô hình ngẫu nhiên được xây dựng dựa trên khái niệm về chuỗi Markov dựa trên giả định rằng xác suất của các thống kê trong tương lai chỉ phụ thuộc vào trạng thái quy trình hiện tại thay vì bất kỳ trạng thái nào trước đó. Ví dụ, khi tung một đồng xu, chúng ta không thể nói rằng kết quả của lần tung thứ năm sẽ là một cái đầu. Điều này là do một đồng xu không có bất kỳ bộ nhớ nào và kết quả tiếp theo không phụ thuộc vào kết quả trước đó.
Về mặt toán học, HMM bao gồm các biến sau:
Kỳ (S)
Nó là một tập hợp các trạng thái ẩn hoặc tiềm ẩn có trong HMM. Nó được ký hiệu là S.
Ký hiệu đầu ra (O)
Nó là một tập hợp các ký hiệu đầu ra có thể có trong HMM. Nó được ký hiệu là O.
Ma trận xác suất chuyển trạng thái (A)
Nó là xác suất thực hiện chuyển đổi từ trạng thái này sang từng trạng thái khác. Nó được ký hiệu là A.
Ma trận xác suất phát thải quan sát (B)
Nó là xác suất phát ra / quan sát một biểu tượng ở một trạng thái cụ thể. Nó được ký hiệu là B.
Ma trận xác suất trước (Π)
Nó là xác suất bắt đầu ở một trạng thái cụ thể từ các trạng thái khác nhau của hệ thống. Nó được ký hiệu là Π.
Do đó, HMM có thể được định nghĩa là = (S,O,A,B,),
Ở đâu,
- S = {s1,s2,…,sN} là một tập hợp N trạng thái khả dĩ,
- O = {o1,o2,…,oM} là tập hợp M ký hiệu quan sát có thể có,
- A là một NN ma trận xác suất chuyển đổi trạng thái (TPM),
- B là một NM quan sát hoặc Ma trận xác suất phát thải (EPM),
- π là một vectơ phân bố xác suất trạng thái ban đầu N chiều.
Ví dụ: Phân tích dữ liệu Thị trường chứng khoán
Trong ví dụ này, chúng ta sẽ phân tích từng bước dữ liệu của thị trường chứng khoán để có được ý tưởng về cách HMM hoạt động với dữ liệu tuần tự hoặc chuỗi thời gian. Xin lưu ý rằng chúng tôi đang triển khai ví dụ này bằng Python.
Nhập các gói cần thiết như hình dưới đây -
import datetime
import warnings
Bây giờ, hãy sử dụng dữ liệu thị trường chứng khoán từ matpotlib.finance gói, như được hiển thị ở đây -
import numpy as np
from matplotlib import cm, pyplot as plt
from matplotlib.dates import YearLocator, MonthLocator
try:
from matplotlib.finance import quotes_historical_yahoo_och1
except ImportError:
from matplotlib.finance import (
quotes_historical_yahoo as quotes_historical_yahoo_och1)
from hmmlearn.hmm import GaussianHMM
Tải dữ liệu từ ngày bắt đầu và ngày kết thúc, tức là giữa hai ngày cụ thể như được hiển thị ở đây -
start_date = datetime.date(1995, 10, 10)
end_date = datetime.date(2015, 4, 25)
quotes = quotes_historical_yahoo_och1('INTC', start_date, end_date)
Trong bước này, chúng tôi sẽ trích xuất các báo giá kết thúc mỗi ngày. Đối với điều này, hãy sử dụng lệnh sau:
closing_quotes = np.array([quote[2] for quote in quotes])
Bây giờ, chúng tôi sẽ trích xuất khối lượng cổ phiếu được giao dịch mỗi ngày. Đối với điều này, hãy sử dụng lệnh sau:
volumes = np.array([quote[5] for quote in quotes])[1:]
Ở đây, lấy phần trăm chênh lệch của giá cổ phiếu đóng cửa, sử dụng mã hiển thị bên dưới -
diff_percentages = 100.0 * np.diff(closing_quotes) / closing_quotes[:-]
dates = np.array([quote[0] for quote in quotes], dtype = np.int)[1:]
training_data = np.column_stack([diff_percentages, volumes])
Trong bước này, hãy tạo và đào tạo Gaussian HMM. Đối với điều này, hãy sử dụng mã sau:
hmm = GaussianHMM(n_components = 7, covariance_type = 'diag', n_iter = 1000)
with warnings.catch_warnings():
warnings.simplefilter('ignore')
hmm.fit(training_data)
Bây giờ, tạo dữ liệu bằng mô hình HMM, sử dụng các lệnh được hiển thị:
num_samples = 300
samples, _ = hmm.sample(num_samples)
Cuối cùng, trong bước này, chúng tôi vẽ và hình dung tỷ lệ phần trăm chênh lệch và khối lượng cổ phiếu được giao dịch dưới dạng sản lượng dưới dạng đồ thị.
Sử dụng mã sau để vẽ và hình dung tỷ lệ phần trăm khác biệt -
plt.figure()
plt.title('Difference percentages')
plt.plot(np.arange(num_samples), samples[:, 0], c = 'black')
Sử dụng đoạn mã sau để vẽ và hình dung khối lượng cổ phiếu được giao dịch -
plt.figure()
plt.title('Volume of shares')
plt.plot(np.arange(num_samples), samples[:, 1], c = 'black')
plt.ylim(ymin = 0)
plt.show()
Trong chương này, chúng ta sẽ tìm hiểu về nhận dạng giọng nói bằng AI với Python.
Lời nói là phương tiện giao tiếp cơ bản nhất của con người khi trưởng thành. Mục tiêu cơ bản của xử lý giọng nói là cung cấp sự tương tác giữa con người và máy móc.
Hệ thống xử lý giọng nói chủ yếu có ba tác vụ:
First, nhận dạng giọng nói cho phép máy bắt các từ, cụm từ và câu chúng ta nói
Second, xử lý ngôn ngữ tự nhiên để cho phép máy hiểu những gì chúng ta nói và
Third, tổng hợp giọng nói để cho phép máy nói.
Chương này tập trung vào speech recognition, quá trình hiểu những lời nói của con người. Hãy nhớ rằng các tín hiệu giọng nói được thu lại với sự trợ giúp của micrô và sau đó nó phải được hệ thống hiểu.
Xây dựng công cụ nhận dạng giọng nói
Nhận dạng giọng nói hoặc Nhận dạng giọng nói tự động (ASR) là trung tâm của sự chú ý đối với các dự án AI như robot. Không có ASR, không thể hình dung một robot nhận thức tương tác với con người. Tuy nhiên, việc xây dựng một công cụ nhận dạng giọng nói không phải là điều hoàn toàn dễ dàng.
Khó khăn khi phát triển hệ thống nhận dạng giọng nói
Phát triển một hệ thống nhận dạng giọng nói chất lượng cao thực sự là một bài toán khó. Khó khăn của công nghệ nhận dạng giọng nói có thể được mô tả rộng rãi theo một số khía cạnh như được thảo luận dưới đây:
Size of the vocabulary- Kích thước của từ vựng ảnh hưởng đến việc dễ dàng phát triển một ASR. Hãy xem xét các kích thước từ vựng sau để hiểu rõ hơn.
Ví dụ, một từ vựng kích thước nhỏ bao gồm 2-100 từ, như trong hệ thống menu giọng nói
Ví dụ, một từ vựng cỡ trung bình bao gồm một số từ 100 đến 1.000 từ, chẳng hạn như trong nhiệm vụ truy xuất cơ sở dữ liệu
Một từ vựng kích thước lớn bao gồm khoảng 10.000 từ, như trong một nhiệm vụ chính tả chung.
Channel characteristics- Chất lượng kênh cũng là một yếu tố quan trọng. Ví dụ, giọng nói của con người chứa băng thông cao với dải tần đầy đủ, trong khi giọng nói qua điện thoại bao gồm băng thông thấp với dải tần hạn chế. Lưu ý rằng nó khó hơn trong phần sau.
Speaking mode- Việc phát triển ASR dễ dàng cũng phụ thuộc vào chế độ nói, đó là liệu bài phát biểu đang ở chế độ từ tách biệt, hoặc chế độ từ được kết nối, hoặc ở chế độ nói liên tục. Lưu ý rằng một bài phát biểu liên tục khó nhận ra hơn.
Speaking style- Bài phát biểu được đọc có thể theo phong cách trang trọng, hoặc tự phát và đối thoại với phong cách bình thường. Cái sau khó nhận ra hơn.
Speaker dependency- Lời nói có thể phụ thuộc vào người nói, thích ứng với người nói hoặc độc lập với người nói. Một người nói độc lập là khó nhất để xây dựng.
Type of noise- Tiếng ồn là một yếu tố khác cần xem xét khi phát triển ASR. Tỷ lệ tín hiệu trên tiếng ồn có thể ở nhiều phạm vi khác nhau, tùy thuộc vào môi trường âm thanh quan sát ít hơn so với nhiều tiếng ồn xung quanh -
Nếu tỷ lệ tín hiệu trên nhiễu lớn hơn 30dB, nó được coi là dải cao
Nếu tỷ lệ tín hiệu trên nhiễu nằm trong khoảng từ 30dB đến 10db, nó được coi là SNR trung bình
Nếu tỷ lệ tín hiệu trên nhiễu nhỏ hơn 10dB, nó được coi là dải thấp
Microphone characteristics- Chất lượng của micro có thể tốt, trung bình hoặc dưới trung bình. Ngoài ra, khoảng cách giữa miệng và micro phone có thể khác nhau. Các yếu tố này cũng cần được xem xét đối với hệ thống công nhận.
Lưu ý rằng, kích thước từ vựng càng lớn thì việc nhận dạng càng khó.
Ví dụ, loại tiếng ồn xung quanh như tiếng ồn cố định, tiếng ồn không phải của con người, tiếng nói nền và nhiễu xuyên âm của những người nói khác cũng góp phần vào độ khó của bài toán.
Bất chấp những khó khăn này, các nhà nghiên cứu đã làm việc rất nhiều trên các khía cạnh khác nhau của lời nói như hiểu tín hiệu giọng nói, người nói và xác định các trọng âm.
Bạn sẽ phải làm theo các bước dưới đây để tạo một trình nhận dạng giọng nói -
Hình dung tín hiệu âm thanh - Đọc từ tệp và làm việc trên đó
Đây là bước đầu tiên trong việc xây dựng hệ thống nhận dạng giọng nói vì nó cung cấp hiểu biết về cách một tín hiệu âm thanh được cấu trúc. Một số bước phổ biến có thể được làm theo để làm việc với tín hiệu âm thanh như sau:
ghi âm
Đầu tiên, khi bạn phải đọc tín hiệu âm thanh từ một tệp, sau đó ghi lại bằng micrô.
Lấy mẫu
Khi ghi âm bằng micrô, các tín hiệu được lưu trữ dưới dạng số hóa. Nhưng để hoạt động, máy cần chúng ở dạng số rời rạc. Do đó, chúng ta nên thực hiện lấy mẫu ở một tần số nhất định và chuyển tín hiệu thành dạng số rời rạc. Việc chọn tần số cao để lấy mẫu ngụ ý rằng khi con người nghe tín hiệu, họ cảm thấy đó là tín hiệu âm thanh liên tục.
Thí dụ
Ví dụ sau đây cho thấy một cách tiếp cận từng bước để phân tích tín hiệu âm thanh, sử dụng Python, được lưu trữ trong một tệp. Tần số của tín hiệu âm thanh này là 44.100 HZ.
Nhập các gói cần thiết như được hiển thị ở đây -
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
Bây giờ, hãy đọc tệp âm thanh được lưu trữ. Nó sẽ trả về hai giá trị: tần số lấy mẫu và tín hiệu âm thanh. Cung cấp đường dẫn của tệp âm thanh nơi nó được lưu trữ, như được hiển thị ở đây -
frequency_sampling, audio_signal = wavfile.read("/Users/admin/audio_file.wav")
Hiển thị các tham số như tần số lấy mẫu của tín hiệu âm thanh, loại dữ liệu của tín hiệu và thời lượng của nó, sử dụng các lệnh được hiển thị:
print('\nSignal shape:', audio_signal.shape)
print('Signal Datatype:', audio_signal.dtype)
print('Signal duration:', round(audio_signal.shape[0] /
float(frequency_sampling), 2), 'seconds')
Bước này liên quan đến việc chuẩn hóa tín hiệu như hình dưới đây -
audio_signal = audio_signal / np.power(2, 15)
Trong bước này, chúng tôi sẽ trích xuất 100 giá trị đầu tiên từ tín hiệu này để hình dung. Sử dụng các lệnh sau cho mục đích này:
audio_signal = audio_signal [:100]
time_axis = 1000 * np.arange(0, len(signal), 1) / float(frequency_sampling)
Bây giờ, hãy hình dung tín hiệu bằng các lệnh dưới đây:
plt.plot(time_axis, signal, color='blue')
plt.xlabel('Time (milliseconds)')
plt.ylabel('Amplitude')
plt.title('Input audio signal')
plt.show()
Bạn sẽ có thể thấy đồ thị đầu ra và dữ liệu được trích xuất cho tín hiệu âm thanh ở trên như trong hình ảnh tại đây
Signal shape: (132300,)
Signal Datatype: int16
Signal duration: 3.0 seconds
Đặc trưng cho tín hiệu âm thanh: Chuyển đổi sang miền tần số
Đặc trưng một tín hiệu âm thanh bao gồm việc chuyển đổi tín hiệu miền thời gian thành miền tần số và hiểu các thành phần tần số của nó, bằng cách. Đây là bước quan trọng vì nó cho biết nhiều thông tin về tín hiệu. Bạn có thể sử dụng một công cụ toán học như Fourier Transform để thực hiện phép biến đổi này.
Thí dụ
Ví dụ sau đây cho thấy từng bước cách mô tả tín hiệu bằng Python, được lưu trữ trong một tệp. Lưu ý rằng ở đây chúng tôi đang sử dụng công cụ toán học Fourier Transform để chuyển đổi nó thành miền tần số.
Nhập các gói cần thiết, như được hiển thị ở đây -
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
Bây giờ, hãy đọc tệp âm thanh được lưu trữ. Nó sẽ trả về hai giá trị: tần số lấy mẫu và tín hiệu âm thanh. Cung cấp đường dẫn của tệp âm thanh nơi nó được lưu trữ như được hiển thị trong lệnh ở đây -
frequency_sampling, audio_signal = wavfile.read("/Users/admin/sample.wav")
Trong bước này, chúng tôi sẽ hiển thị các thông số như tần số lấy mẫu của tín hiệu âm thanh, loại dữ liệu của tín hiệu và thời lượng của nó, bằng cách sử dụng các lệnh được cung cấp bên dưới:
print('\nSignal shape:', audio_signal.shape)
print('Signal Datatype:', audio_signal.dtype)
print('Signal duration:', round(audio_signal.shape[0] /
float(frequency_sampling), 2), 'seconds')
Trong bước này, chúng ta cần chuẩn hóa tín hiệu, như được hiển thị trong lệnh sau:
audio_signal = audio_signal / np.power(2, 15)
Bước này liên quan đến việc trích xuất độ dài và nửa độ dài của tín hiệu. Sử dụng các lệnh sau cho mục đích này:
length_signal = len(audio_signal)
half_length = np.ceil((length_signal + 1) / 2.0).astype(np.int)
Bây giờ, chúng ta cần áp dụng các công cụ toán học để biến đổi thành miền tần số. Ở đây chúng tôi đang sử dụng Biến đổi Fourier.
signal_frequency = np.fft.fft(audio_signal)
Bây giờ, hãy chuẩn hóa tín hiệu miền tần số và bình phương nó -
signal_frequency = abs(signal_frequency[0:half_length]) / length_signal
signal_frequency **= 2
Tiếp theo, trích xuất độ dài và nửa độ dài của tín hiệu được biến đổi tần số -
len_fts = len(signal_frequency)
Lưu ý rằng tín hiệu biến đổi Fourier phải được điều chỉnh cho trường hợp chẵn cũng như lẻ.
if length_signal % 2:
signal_frequency[1:len_fts] *= 2
else:
signal_frequency[1:len_fts-1] *= 2
Bây giờ, trích xuất công suất bằng decibal (dB) -
signal_power = 10 * np.log10(signal_frequency)
Điều chỉnh tần số tính bằng kHz cho trục X -
x_axis = np.arange(0, len_half, 1) * (frequency_sampling / length_signal) / 1000.0
Bây giờ, hãy hình dung đặc tính của tín hiệu như sau:
plt.figure()
plt.plot(x_axis, signal_power, color='black')
plt.xlabel('Frequency (kHz)')
plt.ylabel('Signal power (dB)')
plt.show()
Bạn có thể quan sát đồ thị đầu ra của đoạn mã trên như trong hình bên dưới:
Tạo tín hiệu âm thanh đơn điệu
Hai bước mà bạn đã thấy cho đến bây giờ rất quan trọng để tìm hiểu về các tín hiệu. Bây giờ, bước này sẽ hữu ích nếu bạn muốn tạo tín hiệu âm thanh với một số thông số được xác định trước. Lưu ý rằng bước này sẽ lưu tín hiệu âm thanh trong một tệp đầu ra.
Thí dụ
Trong ví dụ sau, chúng ta sẽ tạo một tín hiệu đơn điệu, sử dụng Python, tín hiệu này sẽ được lưu trữ trong một tệp. Đối với điều này, bạn sẽ phải thực hiện các bước sau:
Nhập các gói cần thiết như được hiển thị -
import numpy as np
import matplotlib.pyplot as plt
from scipy.io.wavfile import write
Cung cấp tệp nơi tệp đầu ra sẽ được lưu
output_file = 'audio_signal_generated.wav'
Bây giờ, hãy chỉ định các tham số bạn chọn, như minh họa -
duration = 4 # in seconds
frequency_sampling = 44100 # in Hz
frequency_tone = 784
min_val = -4 * np.pi
max_val = 4 * np.pi
Trong bước này, chúng ta có thể tạo ra tín hiệu âm thanh, như hình minh họa -
t = np.linspace(min_val, max_val, duration * frequency_sampling)
audio_signal = np.sin(2 * np.pi * tone_freq * t)
Bây giờ, lưu tệp âm thanh trong tệp đầu ra -
write(output_file, frequency_sampling, signal_scaled)
Trích xuất 100 giá trị đầu tiên cho biểu đồ của chúng tôi, như được hiển thị:
audio_signal = audio_signal[:100]
time_axis = 1000 * np.arange(0, len(signal), 1) / float(sampling_freq)
Bây giờ, hãy hình dung tín hiệu âm thanh được tạo ra như sau:
plt.plot(time_axis, signal, color='blue')
plt.xlabel('Time in milliseconds')
plt.ylabel('Amplitude')
plt.title('Generated audio signal')
plt.show()
Bạn có thể quan sát cốt truyện như trong hình bên dưới:
Tính năng trích xuất từ giọng nói
Đây là bước quan trọng nhất trong việc xây dựng một bộ nhận dạng giọng nói vì sau khi chuyển đổi tín hiệu giọng nói sang miền tần số, chúng ta phải chuyển đổi nó thành dạng có thể sử dụng được của vector đặc trưng. Chúng tôi có thể sử dụng các kỹ thuật trích xuất tính năng khác nhau như MFCC, PLP, PLP-RASTA, v.v. cho mục đích này.
Thí dụ
Trong ví dụ sau, chúng tôi sẽ trích xuất các tính năng từ tín hiệu, từng bước, sử dụng Python, bằng cách sử dụng kỹ thuật MFCC.
Nhập các gói cần thiết, như được hiển thị ở đây -
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
from python_speech_features import mfcc, logfbank
Bây giờ, hãy đọc tệp âm thanh được lưu trữ. Nó sẽ trả về hai giá trị - tần số lấy mẫu và tín hiệu âm thanh. Cung cấp đường dẫn của tệp âm thanh nơi nó được lưu trữ.
frequency_sampling, audio_signal = wavfile.read("/Users/admin/audio_file.wav")
Lưu ý rằng ở đây chúng tôi đang lấy 15000 mẫu đầu tiên để phân tích.
audio_signal = audio_signal[:15000]
Sử dụng các kỹ thuật của MFCC và thực hiện lệnh sau để trích xuất các tính năng của MFCC -
features_mfcc = mfcc(audio_signal, frequency_sampling)
Bây giờ, in các thông số MFCC, như được hiển thị -
print('\nMFCC:\nNumber of windows =', features_mfcc.shape[0])
print('Length of each feature =', features_mfcc.shape[1])
Bây giờ, vẽ và hình dung các tính năng của MFCC bằng các lệnh dưới đây:
features_mfcc = features_mfcc.T
plt.matshow(features_mfcc)
plt.title('MFCC')
Trong bước này, chúng tôi làm việc với các tính năng của ngân hàng bộ lọc như minh họa -
Trích xuất các tính năng của ngân hàng bộ lọc -
filterbank_features = logfbank(audio_signal, frequency_sampling)
Bây giờ, in các thông số của ngân hàng lọc.
print('\nFilter bank:\nNumber of windows =', filterbank_features.shape[0])
print('Length of each feature =', filterbank_features.shape[1])
Bây giờ, vẽ và hình dung các tính năng của ngân hàng lọc.
filterbank_features = filterbank_features.T
plt.matshow(filterbank_features)
plt.title('Filter bank')
plt.show()
Theo kết quả của các bước trên, bạn có thể quan sát các kết quả đầu ra sau: Hình 1 cho MFCC và Hình 2 cho Ngân hàng bộ lọc
Nhận biết các từ đã nói
Nhận dạng giọng nói có nghĩa là khi con người đang nói, một cỗ máy sẽ hiểu nó. Ở đây, chúng tôi đang sử dụng Google Speech API bằng Python để biến điều đó thành hiện thực. Chúng tôi cần cài đặt các gói sau cho việc này -
Pyaudio - Nó có thể được cài đặt bằng cách sử dụng pip install Pyaudio chỉ huy.
SpeechRecognition - Gói này có thể được cài đặt bằng cách sử dụng pip install SpeechRecognition.
Google-Speech-API - Nó có thể được cài đặt bằng cách sử dụng lệnh pip install google-api-python-client.
Thí dụ
Quan sát ví dụ sau để hiểu về nhận dạng lời nói -
Nhập các gói cần thiết như được hiển thị -
import speech_recognition as sr
Tạo một đối tượng như hình dưới đây -
recording = sr.Recognizer()
Bây giờ, Microphone() mô-đun sẽ lấy giọng nói làm đầu vào -
with sr.Microphone() as source: recording.adjust_for_ambient_noise(source)
print("Please Say something:")
audio = recording.listen(source)
Bây giờ Google API sẽ nhận dạng giọng nói và đưa ra kết quả.
try:
print("You said: \n" + recording.recognize_google(audio))
except Exception as e:
print(e)
Bạn có thể xem kết quả sau:
Please Say Something:
You said:
Ví dụ, nếu bạn nói tutorialspoint.com, sau đó hệ thống nhận dạng nó một cách chính xác như sau:
tutorialspoint.com
Tìm kiếm heuristic đóng một vai trò quan trọng trong trí tuệ nhân tạo. Trong chương này, bạn sẽ tìm hiểu chi tiết về nó.
Khái niệm về Tìm kiếm Heuristic trong AI
Heuristic là một quy tắc ngón tay cái dẫn chúng ta đến giải pháp có thể xảy ra. Hầu hết các vấn đề trong trí tuệ nhân tạo đều có tính chất cấp số nhân và có nhiều giải pháp khả thi. Bạn không biết chính xác giải pháp nào là đúng và việc kiểm tra tất cả các giải pháp sẽ rất tốn kém.
Do đó, việc sử dụng heuristic thu hẹp việc tìm kiếm giải pháp và loại bỏ các tùy chọn sai. Phương pháp sử dụng heuristic để dẫn đầu tìm kiếm trong không gian tìm kiếm được gọi là Heuristic Search. Các kỹ thuật heuristic rất hữu ích vì có thể tăng cường tìm kiếm khi bạn sử dụng chúng.
Sự khác biệt giữa Tìm kiếm không được thông tin và Tìm kiếm được Thông tin
Có hai loại chiến lược kiểm soát hoặc kỹ thuật tìm kiếm: không được thông tin và được thông báo. Chúng được giải thích chi tiết như được đưa ra ở đây -
Tìm kiếm không được thông tin
Nó còn được gọi là chiến lược tìm kiếm mù hoặc kiểm soát mù. Nó được đặt tên như vậy vì chỉ có thông tin về định nghĩa vấn đề và không có thông tin bổ sung nào khác về các trạng thái. Loại kỹ thuật tìm kiếm này sẽ tìm kiếm toàn bộ không gian trạng thái để tìm giải pháp. Tìm kiếm đầu tiên theo chiều rộng (BFS) và Tìm kiếm đầu tiên theo chiều sâu (DFS) là những ví dụ về tìm kiếm không được thông tin.
Tìm kiếm thông tin
Nó còn được gọi là chiến lược tìm kiếm theo phương pháp heuristic hoặc chiến lược điều khiển heuristic. Nó được đặt tên như vậy vì có thêm một số thông tin về các tiểu bang. Thông tin bổ sung này rất hữu ích để tính toán tùy chọn giữa các nút con để khám phá và mở rộng. Sẽ có một hàm heuristic được liên kết với mỗi nút. Tìm kiếm đầu tiên tốt nhất (BFS), A *, Trung bình và Phân tích là những ví dụ về tìm kiếm thông tin.
Ràng buộc sự hài lòng (CSP)
Ràng buộc có nghĩa là hạn chế hoặc giới hạn. Trong AI, vấn đề thỏa mãn hạn chế là những vấn đề phải được giải quyết dưới một số ràng buộc. Trọng tâm phải là không vi phạm các ràng buộc trong khi giải quyết các vấn đề đó. Cuối cùng, khi chúng tôi đạt được giải pháp cuối cùng, CSP phải tuân theo các hạn chế.
Vấn đề thế giới thực được giải quyết bằng sự thỏa mãn ràng buộc
Các phần trước đã xử lý việc tạo ra các vấn đề về sự thỏa mãn hạn chế. Bây giờ, chúng ta hãy áp dụng điều này cho các vấn đề trong thế giới thực. Một số ví dụ về các vấn đề trong thế giới thực được giải quyết bằng cách thỏa mãn ràng buộc như sau:
Giải quan hệ đại số
Với sự trợ giúp của vấn đề thỏa mãn ràng buộc, chúng ta có thể giải quyết các quan hệ đại số. Trong ví dụ này, chúng tôi sẽ cố gắng giải một quan hệ đại số đơn giảna*2 = b. Nó sẽ trả về giá trị củaa và b trong phạm vi mà chúng tôi sẽ xác định.
Sau khi hoàn thành chương trình Python này, bạn sẽ có thể hiểu những điều cơ bản về cách giải quyết vấn đề với sự hài lòng về giới hạn.
Lưu ý rằng trước khi viết chương trình, chúng ta cần cài đặt gói Python có tên là python-binding. Bạn có thể cài đặt nó với sự trợ giúp của lệnh sau:
pip install python-constraint
Các bước sau đây cho bạn thấy một chương trình Python để giải quyết mối quan hệ đại số bằng cách sử dụng thỏa mãn ràng buộc:
Nhập constraint gói bằng lệnh sau:
from constraint import *
Bây giờ, hãy tạo một đối tượng của mô-đun có tên problem() như hình dưới đây -
problem = Problem()
Bây giờ, hãy xác định các biến. Lưu ý rằng ở đây chúng ta có hai biến a và b và chúng ta đang xác định 10 là phạm vi của chúng, có nghĩa là chúng ta đã nhận được giải pháp trong vòng 10 số đầu tiên.
problem.addVariable('a', range(10))
problem.addVariable('b', range(10))
Tiếp theo, xác định ràng buộc cụ thể mà chúng tôi muốn áp dụng cho vấn đề này. Hãy quan sát rằng ở đây chúng ta đang sử dụng ràng buộca*2 = b.
problem.addConstraint(lambda a, b: a * 2 == b)
Bây giờ, hãy tạo đối tượng của getSolution() mô-đun sử dụng lệnh sau:
solutions = problem.getSolutions()
Cuối cùng, in đầu ra bằng lệnh sau:
print (solutions)
Bạn có thể quan sát kết quả của chương trình trên như sau:
[{'a': 4, 'b': 8}, {'a': 3, 'b': 6}, {'a': 2, 'b': 4}, {'a': 1, 'b': 2}, {'a': 0, 'b': 0}]
Hình vuông ma thuật
Hình vuông ma thuật là sự sắp xếp các số riêng biệt, thường là số nguyên, trong một lưới vuông, trong đó các số trong mỗi hàng, trong mỗi cột và các số trong đường chéo, tất cả cộng lại thành một số được gọi là “hằng số ma thuật” .
Sau đây là cách thực thi từng bước mã Python đơn giản để tạo các ô vuông ma thuật:
Xác định một hàm có tên magic_square, như hình dưới đây -
def magic_square(matrix_ms):
iSize = len(matrix_ms[0])
sum_list = []
Đoạn mã sau đây hiển thị mã cho chiều dọc của hình vuông:
for col in range(iSize):
sum_list.append(sum(row[col] for row in matrix_ms))
Đoạn mã sau đây hiển thị mã cho chiều ngang của hình vuông:
sum_list.extend([sum (lines) for lines in matrix_ms])
Đoạn mã sau đây hiển thị mã cho chiều ngang của hình vuông:
dlResult = 0
for i in range(0,iSize):
dlResult +=matrix_ms[i][i]
sum_list.append(dlResult)
drResult = 0
for i in range(iSize-1,-1,-1):
drResult +=matrix_ms[i][i]
sum_list.append(drResult)
if len(set(sum_list))>1:
return False
return True
Bây giờ, hãy đưa ra giá trị của ma trận và kiểm tra kết quả -
print(magic_square([[1,2,3], [4,5,6], [7,8,9]]))
Bạn có thể quan sát rằng đầu ra sẽ là False vì tổng không lên đến cùng một số.
print(magic_square([[3,9,2], [3,5,7], [9,1,6]]))
Bạn có thể quan sát rằng đầu ra sẽ là True vì tổng là cùng một số, nghĩa là 15 đây.
Trò chơi được chơi với một chiến lược. Mỗi người chơi hoặc đội sẽ đưa ra chiến lược trước khi bắt đầu trò chơi và họ phải thay đổi hoặc xây dựng chiến lược mới theo (các) tình huống hiện tại trong trò chơi.
Thuật toán tìm kiếm
Bạn sẽ phải xem xét trò chơi máy tính cũng với chiến lược tương tự như trên. Lưu ý rằng Thuật toán tìm kiếm là thuật toán tìm ra chiến lược trong trò chơi máy tính.
Làm thế nào nó hoạt động
Mục tiêu của các thuật toán tìm kiếm là tìm ra tập hợp các bước di chuyển tối ưu để chúng có thể đến đích cuối cùng và giành chiến thắng. Các thuật toán này sử dụng tập hợp các điều kiện chiến thắng, khác nhau cho mọi trò chơi, để tìm ra nước đi tốt nhất.
Hình dung một trò chơi máy tính như một cái cây. Chúng ta biết rằng cây có các nút. Bắt đầu từ gốc, chúng ta có thể đi đến nút chiến thắng cuối cùng, nhưng với những nước đi tối ưu. Đó là công việc của các thuật toán tìm kiếm. Mỗi nút trong cây như vậy đại diện cho một trạng thái trong tương lai. Các thuật toán tìm kiếm tìm kiếm thông qua cây này để đưa ra quyết định ở mỗi bước hoặc nút của trò chơi.
Tìm kiếm kết hợp
Nhược điểm chính của việc sử dụng các thuật toán tìm kiếm là chúng có bản chất là toàn diện, đó là lý do tại sao chúng khám phá toàn bộ không gian tìm kiếm để tìm giải pháp dẫn đến lãng phí tài nguyên. Sẽ phức tạp hơn nếu các thuật toán này cần tìm kiếm toàn bộ không gian tìm kiếm để tìm ra giải pháp cuối cùng.
Để loại bỏ vấn đề như vậy, chúng ta có thể sử dụng tìm kiếm tổ hợp sử dụng phương pháp heuristic để khám phá không gian tìm kiếm và giảm kích thước của nó bằng cách loại bỏ các chuyển động sai có thể có. Do đó, các thuật toán như vậy có thể tiết kiệm tài nguyên. Một số thuật toán sử dụng heuristic để tìm kiếm không gian và tiết kiệm tài nguyên được thảo luận ở đây -
Thuật toán Minimax
Đây là chiến lược được sử dụng bởi tìm kiếm tổ hợp sử dụng phương pháp heuristic để tăng tốc chiến lược tìm kiếm. Khái niệm chiến lược Minimax có thể được hiểu với ví dụ về hai trò chơi người chơi, trong đó mỗi người chơi cố gắng dự đoán nước đi tiếp theo của đối thủ và cố gắng giảm thiểu chức năng đó. Ngoài ra, để giành chiến thắng, người chơi luôn cố gắng phát huy tối đa chức năng của bản thân dựa trên tình hình hiện tại.
Heuristic đóng một vai trò quan trọng trong các loại chiến lược như Minimax. Mỗi nút của cây sẽ có một hàm heuristic được liên kết với nó. Dựa trên kinh nghiệm đó, họ sẽ đưa ra quyết định di chuyển về phía nút có lợi nhất cho họ.
Alpha-Beta Pruning
Một vấn đề lớn với thuật toán Minimax là nó có thể khám phá những phần không liên quan của cây, dẫn đến lãng phí tài nguyên. Do đó phải có một chiến lược để quyết định phần nào của cây có liên quan và phần nào không liên quan và để phần không liên quan chưa được khám phá. Cắt tỉa Alpha-Beta là một trong những loại chiến lược như vậy.
Mục tiêu chính của thuật toán cắt tỉa Alpha-Beta là tránh việc tìm kiếm những phần của cây mà không có bất kỳ giải pháp nào. Khái niệm chính của việc cắt tỉa Alpha-Beta là sử dụng hai giới hạn có tênAlpha, giới hạn dưới tối đa, và Beta, giới hạn trên tối thiểu. Hai tham số này là giá trị hạn chế tập hợp các giải pháp khả thi. Nó so sánh giá trị của nút hiện tại với giá trị của các tham số alpha và beta, để nó có thể di chuyển đến phần của cây có lời giải và loại bỏ phần còn lại.
Thuật toán Negamax
Thuật toán này không khác với thuật toán Minimax, nhưng nó có cách triển khai thanh lịch hơn. Nhược điểm chính của việc sử dụng thuật toán Minimax là chúng ta cần xác định hai hàm heuristic khác nhau. Mối liên hệ giữa những khám phá này là ở chỗ, trạng thái của trò chơi càng tốt cho một người chơi, thì người chơi kia càng tệ hơn. Trong thuật toán Negamax, công việc giống nhau của hai hàm heuristic được thực hiện với sự trợ giúp của một hàm heuristic duy nhất.
Xây dựng Bots để chơi trò chơi
Để xây dựng bot để chơi hai trò chơi người chơi trong AI, chúng ta cần cài đặt easyAIthư viện. Nó là một khung trí tuệ nhân tạo cung cấp tất cả các chức năng để xây dựng trò chơi hai người chơi. Bạn có thể tải xuống với sự trợ giúp của lệnh sau:
pip install easyAI
Bot để chơi lần cuối cùng đứng
Trong trò chơi này, sẽ có một đống tiền xu. Mỗi người chơi phải lấy một số xu từ đống đó. Mục tiêu của trò chơi là tránh lấy đồng xu cuối cùng trong đống. Chúng tôi sẽ sử dụng lớp họcLastCoinStanding kế thừa từ TwoPlayersGame lớp của easyAIthư viện. Đoạn mã sau hiển thị mã Python cho trò chơi này:
Nhập các gói bắt buộc như được hiển thị -
from easyAI import TwoPlayersGame, id_solve, Human_Player, AI_Player
from easyAI.AI import TT
Bây giờ, kế thừa lớp từ TwoPlayerGame lớp để xử lý tất cả các hoạt động của trò chơi -
class LastCoin_game(TwoPlayersGame):
def __init__(self, players):
Bây giờ, xác định người chơi và người chơi sẽ bắt đầu trò chơi.
self.players = players
self.nplayer = 1
Bây giờ, xác định số lượng xu trong trò chơi, ở đây chúng tôi đang sử dụng 15 xu cho trò chơi.
self.num_coins = 15
Xác định số xu tối đa mà người chơi có thể nhận được trong một nước đi.
self.max_coins = 4
Bây giờ có một số điều nhất định cần xác định như được hiển thị trong đoạn mã sau. Xác định các bước di chuyển có thể.
def possible_moves(self):
return [str(a) for a in range(1, self.max_coins + 1)]
Xác định việc loại bỏ các đồng xu
def make_move(self, move):
self.num_coins -= int(move)
Xác định ai đã lấy đồng xu cuối cùng.
def win_game(self):
return self.num_coins <= 0
Xác định thời điểm dừng trò chơi, đó là khi ai đó thắng.
def is_over(self):
return self.win()
Xác định cách tính điểm.
def score(self):
return 100 if self.win_game() else 0
Xác định số lượng xu còn lại trong đống.
def show(self):
print(self.num_coins, 'coins left in the pile')
if __name__ == "__main__":
tt = TT()
LastCoin_game.ttentry = lambda self: self.num_coins
Giải quyết trò chơi với khối mã sau:
r, d, m = id_solve(LastCoin_game,
range(2, 20), win_score=100, tt=tt)
print(r, d, m)
Quyết định ai sẽ bắt đầu trò chơi
game = LastCoin_game([AI_Player(tt), Human_Player()])
game.play()
Bạn có thể tìm thấy kết quả sau và cách chơi đơn giản của trò chơi này -
d:2, a:0, m:1
d:3, a:0, m:1
d:4, a:0, m:1
d:5, a:0, m:1
d:6, a:100, m:4
1 6 4
15 coins left in the pile
Move #1: player 1 plays 4 :
11 coins left in the pile
Player 2 what do you play ? 2
Move #2: player 2 plays 2 :
9 coins left in the pile
Move #3: player 1 plays 3 :
6 coins left in the pile
Player 2 what do you play ? 1
Move #4: player 2 plays 1 :
5 coins left in the pile
Move #5: player 1 plays 4 :
1 coins left in the pile
Player 2 what do you play ? 1
Move #6: player 2 plays 1 :
0 coins left in the pile
Một Bot để chơi Tic Tac Toe
Tic-Tac-Toe rất quen thuộc và là một trong những trò chơi được nhiều người yêu thích. Hãy để chúng tôi tạo trò chơi này bằng cách sử dụngeasyAIthư viện bằng Python. Đoạn mã sau là mã Python của trò chơi này:
Nhập các gói như được hiển thị -
from easyAI import TwoPlayersGame, AI_Player, Negamax
from easyAI.Player import Human_Player
Kế thừa lớp từ TwoPlayerGame lớp để xử lý tất cả các hoạt động của trò chơi -
class TicTacToe_game(TwoPlayersGame):
def __init__(self, players):
Bây giờ, xác định người chơi và người chơi sẽ bắt đầu trò chơi -
self.players = players
self.nplayer = 1
Xác định loại bảng -
self.board = [0] * 9
Bây giờ có một số điều nhất định cần xác định như sau:
Xác định các bước di chuyển có thể
def possible_moves(self):
return [x + 1 for x, y in enumerate(self.board) if y == 0]
Xác định bước di chuyển của một người chơi -
def make_move(self, move):
self.board[int(move) - 1] = self.nplayer
Để tăng cường AI, hãy xác định thời điểm người chơi di chuyển -
def umake_move(self, move):
self.board[int(move) - 1] = 0
Xác định điều kiện thua mà đối thủ có ba người trên một hàng
def condition_for_lose(self):
possible_combinations = [[1,2,3], [4,5,6], [7,8,9],
[1,4,7], [2,5,8], [3,6,9], [1,5,9], [3,5,7]]
return any([all([(self.board[z-1] == self.nopponent)
for z in combination]) for combination in possible_combinations])
Xác định kiểm tra kết thúc trò chơi
def is_over(self):
return (self.possible_moves() == []) or self.condition_for_lose()
Hiển thị vị trí hiện tại của người chơi trong trò chơi
def show(self):
print('\n'+'\n'.join([' '.join([['.', 'O', 'X'][self.board[3*j + i]]
for i in range(3)]) for j in range(3)]))
Tính toán điểm số.
def scoring(self):
return -100 if self.condition_for_lose() else 0
Xác định phương pháp chính để xác định thuật toán và bắt đầu trò chơi -
if __name__ == "__main__":
algo = Negamax(7)
TicTacToe_game([Human_Player(), AI_Player(algo)]).play()
Bạn có thể xem kết quả sau và cách chơi đơn giản của trò chơi này -
. . .
. . .
. . .
Player 1 what do you play ? 1
Move #1: player 1 plays 1 :
O . .
. . .
. . .
Move #2: player 2 plays 5 :
O . .
. X .
121
. . .
Player 1 what do you play ? 3
Move #3: player 1 plays 3 :
O . O
. X .
. . .
Move #4: player 2 plays 2 :
O X O
. X .
. . .
Player 1 what do you play ? 4
Move #5: player 1 plays 4 :
O X O
O X .
. . .
Move #6: player 2 plays 8 :
O X O
O X .
. X .
Mạng nơ-ron là các thiết bị tính toán song song nhằm tạo ra một mô hình máy tính của bộ não. Mục tiêu chính đằng sau là phát triển một hệ thống để thực hiện các tác vụ tính toán khác nhau nhanh hơn các hệ thống truyền thống. Các nhiệm vụ này bao gồm Nhận dạng và Phân loại Mẫu, Ước tính, Tối ưu hóa và Phân cụm Dữ liệu.
Mạng thần kinh nhân tạo (ANN) là gì
Mạng nơron nhân tạo (ANN) là một hệ thống tính toán hiệu quả có chủ đề trung tâm được vay mượn từ sự tương tự của mạng nơron sinh học. ANN còn được đặt tên là Hệ thống thần kinh nhân tạo, Hệ thống xử lý phân tán song song và Hệ thống kết nối. ANN có được một bộ sưu tập lớn các đơn vị được kết nối với nhau theo một số kiểu để cho phép liên lạc giữa chúng. Các đơn vị này, còn được gọi lànodes hoặc là neurons, là những bộ xử lý đơn giản hoạt động song song.
Mọi nơron đều được kết nối với nơron khác thông qua một connection link. Mỗi liên kết kết nối được liên kết với một trọng số có thông tin về tín hiệu đầu vào. Đây là thông tin hữu ích nhất cho các tế bào thần kinh để giải quyết một vấn đề cụ thể vìweightthường kích thích hoặc ức chế tín hiệu được truyền đạt. Mỗi tế bào thần kinh đang có trạng thái bên trong của nó được gọi làactivation signal. Tín hiệu đầu ra, được tạo ra sau khi kết hợp tín hiệu đầu vào và quy tắc kích hoạt, có thể được gửi đến các đơn vị khác.
Nếu bạn muốn nghiên cứu chi tiết về mạng nơ-ron thì bạn có thể theo liên kết - Mạng nơ-ron nhân tạo .
Cài đặt các gói hữu ích
Để tạo mạng thần kinh bằng Python, chúng ta có thể sử dụng một gói mạnh mẽ cho mạng thần kinh có tên NeuroLab. Nó là một thư viện các thuật toán mạng nơ-ron cơ bản với các cấu hình mạng linh hoạt và các thuật toán học cho Python. Bạn có thể cài đặt gói này với sự trợ giúp của lệnh sau trên dấu nhắc lệnh:
pip install NeuroLab
Nếu bạn đang sử dụng môi trường Anaconda, hãy sử dụng lệnh sau để cài đặt NeuroLab:
conda install -c labfabulous neurolab
Xây dựng mạng thần kinh
Trong phần này, chúng ta hãy xây dựng một số mạng nơron trong Python bằng cách sử dụng gói NeuroLab.
Bộ phân loại dựa trên Perceptron
Perceptron là các khối xây dựng của ANN. Nếu bạn muốn biết thêm về Perceptron, bạn có thể theo liên kết - Artificial_neural_network
Sau đây là cách thực thi từng bước mã Python để xây dựng một bộ phân loại dựa trên perceptron mạng nơron đơn giản:
Nhập các gói cần thiết như được hiển thị -
import matplotlib.pyplot as plt
import neurolab as nl
Nhập các giá trị đầu vào. Lưu ý rằng đó là một ví dụ về học có giám sát, do đó bạn cũng sẽ phải cung cấp các giá trị mục tiêu.
input = [[0, 0], [0, 1], [1, 0], [1, 1]]
target = [[0], [0], [0], [1]]
Tạo mạng với 2 đầu vào và 1 nơron -
net = nl.net.newp([[0, 1],[0, 1]], 1)
Bây giờ, đào tạo mạng lưới. Ở đây, chúng tôi đang sử dụng quy tắc Delta để đào tạo.
error_progress = net.train(input, target, epochs=100, show=10, lr=0.1)
Bây giờ, hãy hình dung kết quả đầu ra và vẽ biểu đồ -
plt.figure()
plt.plot(error_progress)
plt.xlabel('Number of epochs')
plt.ylabel('Training error')
plt.grid()
plt.show()
Bạn có thể xem biểu đồ sau cho thấy tiến trình đào tạo bằng cách sử dụng số liệu lỗi:
Mạng nơ ron một lớp
Trong ví dụ này, chúng ta đang tạo một mạng nơ-ron một lớp bao gồm các nơ-ron độc lập hoạt động trên dữ liệu đầu vào để tạo ra đầu ra. Lưu ý rằng chúng tôi đang sử dụng tệp văn bản có tênneural_simple.txt như đầu vào của chúng tôi.
Nhập các gói hữu ích như được hiển thị -
import numpy as np
import matplotlib.pyplot as plt
import neurolab as nl
Tải tập dữ liệu như sau:
input_data = np.loadtxt(“/Users/admin/neural_simple.txt')
Sau đây là dữ liệu chúng tôi sẽ sử dụng. Lưu ý rằng trong dữ liệu này, hai cột đầu tiên là các tính năng và hai cột cuối cùng là nhãn.
array([[2. , 4. , 0. , 0. ],
[1.5, 3.9, 0. , 0. ],
[2.2, 4.1, 0. , 0. ],
[1.9, 4.7, 0. , 0. ],
[5.4, 2.2, 0. , 1. ],
[4.3, 7.1, 0. , 1. ],
[5.8, 4.9, 0. , 1. ],
[6.5, 3.2, 0. , 1. ],
[3. , 2. , 1. , 0. ],
[2.5, 0.5, 1. , 0. ],
[3.5, 2.1, 1. , 0. ],
[2.9, 0.3, 1. , 0. ],
[6.5, 8.3, 1. , 1. ],
[3.2, 6.2, 1. , 1. ],
[4.9, 7.8, 1. , 1. ],
[2.1, 4.8, 1. , 1. ]])
Bây giờ, hãy tách 4 cột này thành 2 cột dữ liệu và 2 nhãn -
data = input_data[:, 0:2]
labels = input_data[:, 2:]
Vẽ đồ thị dữ liệu đầu vào bằng các lệnh sau:
plt.figure()
plt.scatter(data[:,0], data[:,1])
plt.xlabel('Dimension 1')
plt.ylabel('Dimension 2')
plt.title('Input data')
Bây giờ, hãy xác định các giá trị tối thiểu và tối đa cho mỗi thứ nguyên như được hiển thị ở đây -
dim1_min, dim1_max = data[:,0].min(), data[:,0].max()
dim2_min, dim2_max = data[:,1].min(), data[:,1].max()
Tiếp theo, xác định số lượng tế bào thần kinh trong lớp đầu ra như sau:
nn_output_layer = labels.shape[1]
Bây giờ, hãy xác định một mạng nơ-ron một lớp -
dim1 = [dim1_min, dim1_max]
dim2 = [dim2_min, dim2_max]
neural_net = nl.net.newp([dim1, dim2], nn_output_layer)
Huấn luyện mạng nơ-ron với số kỷ nguyên và tốc độ học tập như minh họa -
error = neural_net.train(data, labels, epochs = 200, show = 20, lr = 0.01)
Bây giờ, hãy hình dung và vẽ biểu đồ tiến trình đào tạo bằng các lệnh sau:
plt.figure()
plt.plot(error)
plt.xlabel('Number of epochs')
plt.ylabel('Training error')
plt.title('Training error progress')
plt.grid()
plt.show()
Bây giờ, hãy sử dụng điểm dữ liệu thử nghiệm trong bộ phân loại ở trên -
print('\nTest Results:')
data_test = [[1.5, 3.2], [3.6, 1.7], [3.6, 5.7],[1.6, 3.9]] for item in data_test:
print(item, '-->', neural_net.sim([item])[0])
Bạn có thể tìm thấy kết quả kiểm tra như được hiển thị ở đây -
[1.5, 3.2] --> [1. 0.]
[3.6, 1.7] --> [1. 0.]
[3.6, 5.7] --> [1. 1.]
[1.6, 3.9] --> [1. 0.]
Bạn có thể thấy các đồ thị sau đây là đầu ra của mã được thảo luận cho đến bây giờ -
Mạng nơ ron nhiều lớp
Trong ví dụ này, chúng tôi đang tạo một mạng nơ-ron nhiều lớp bao gồm nhiều hơn một lớp để trích xuất các mẫu cơ bản trong dữ liệu huấn luyện. Mạng nơ-ron nhiều lớp này sẽ hoạt động giống như một bộ hồi quy. Chúng tôi sẽ tạo một số điểm dữ liệu dựa trên phương trình: y = 2x 2 +8.
Nhập các gói cần thiết như được hiển thị -
import numpy as np
import matplotlib.pyplot as plt
import neurolab as nl
Tạo một số điểm dữ liệu dựa trên phương trình đã đề cập ở trên -
min_val = -30
max_val = 30
num_points = 160
x = np.linspace(min_val, max_val, num_points)
y = 2 * np.square(x) + 8
y /= np.linalg.norm(y)
Bây giờ, hãy định hình lại tập dữ liệu này như sau:
data = x.reshape(num_points, 1)
labels = y.reshape(num_points, 1)
Hình dung và vẽ biểu đồ tập dữ liệu đầu vào bằng các lệnh sau:
plt.figure()
plt.scatter(data, labels)
plt.xlabel('Dimension 1')
plt.ylabel('Dimension 2')
plt.title('Data-points')
Bây giờ, hãy xây dựng mạng nơ-ron có hai lớp ẩn với neurolab với ten tế bào thần kinh trong lớp ẩn đầu tiên, six trong lớp ẩn thứ hai và one trong lớp đầu ra.
neural_net = nl.net.newff([[min_val, max_val]], [10, 6, 1])
Bây giờ hãy sử dụng thuật toán đào tạo gradient -
neural_net.trainf = nl.train.train_gd
Bây giờ, đào tạo mạng với mục tiêu học tập trên dữ liệu được tạo ở trên -
error = neural_net.train(data, labels, epochs = 1000, show = 100, goal = 0.01)
Bây giờ, hãy chạy mạng nơ-ron trên các điểm dữ liệu huấn luyện -
output = neural_net.sim(data)
y_pred = output.reshape(num_points)
Bây giờ, nhiệm vụ hình ảnh và âm mưu -
plt.figure()
plt.plot(error)
plt.xlabel('Number of epochs')
plt.ylabel('Error')
plt.title('Training error progress')
Bây giờ chúng ta sẽ vẽ biểu đồ sản lượng thực tế so với dự đoán -
x_dense = np.linspace(min_val, max_val, num_points * 2)
y_dense_pred = neural_net.sim(x_dense.reshape(x_dense.size,1)).reshape(x_dense.size)
plt.figure()
plt.plot(x_dense, y_dense_pred, '-', x, y, '.', x, y_pred, 'p')
plt.title('Actual vs predicted')
plt.show()
Theo kết quả của các lệnh trên, bạn có thể quan sát các biểu đồ như hình dưới đây:
Trong chương này, bạn sẽ tìm hiểu chi tiết về các khái niệm học củng cố trong AI với Python.
Kiến thức cơ bản về học tập củng cố
Loại hình học tập này được sử dụng để củng cố hoặc tăng cường mạng lưới dựa trên thông tin phê bình. Đó là, một mạng lưới đang được đào tạo theo phương pháp học tăng cường, nhận được một số phản hồi từ môi trường. Tuy nhiên, phản hồi chỉ mang tính đánh giá và không mang tính hướng dẫn như trong trường hợp học có giám sát. Dựa trên phản hồi này, mạng thực hiện các điều chỉnh trọng số để thu được thông tin phê bình tốt hơn trong tương lai.
Quá trình học tập này tương tự như học tập có giám sát nhưng chúng ta có thể có rất ít thông tin. Hình sau đưa ra sơ đồ khối của học củng cố -
Khối xây dựng: Môi trường và Tác nhân
Môi trường và Tác nhân là các khối xây dựng chính của việc học tăng cường trong AI. Phần này thảo luận chi tiết về chúng -
Đặc vụ
Tác nhân là bất cứ thứ gì có thể nhận biết môi trường của nó thông qua các cảm biến và tác động lên môi trường đó thông qua các tác nhân.
A human agent có các cơ quan cảm giác như mắt, tai, mũi, lưỡi và da song song với các cảm biến, và các cơ quan khác như tay, chân, miệng để tạo hiệu ứng.
A robotic agent thay thế máy ảnh và công cụ tìm phạm vi hồng ngoại cho các cảm biến, cũng như các động cơ và bộ truyền động khác nhau cho các hiệu ứng.
A software agent có các chuỗi bit được mã hóa làm chương trình và hành động của nó.
Thuật ngữ đại lý
Các thuật ngữ sau được sử dụng thường xuyên hơn trong học tập củng cố trong AI -
Performance Measure of Agent - Đó là tiêu chí, quyết định mức độ thành công của một đại lý.
Behavior of Agent - Là hành động mà tác nhân thực hiện sau bất kỳ chuỗi khái niệm nhất định nào.
Percept - Đó là đầu vào tri giác của tác nhân tại một trường hợp nhất định.
Percept Sequence - Đó là lịch sử của tất cả những gì mà một đặc vụ đã nhận ra cho đến nay.
Agent Function - Nó là một bản đồ từ trình tự giới luật đến một hành động.
Môi trường
Một số chương trình hoạt động hoàn toàn artificial environment được giới hạn trong đầu vào bàn phím, cơ sở dữ liệu, hệ thống tệp máy tính và đầu ra ký tự trên màn hình.
Ngược lại, một số tác nhân phần mềm, chẳng hạn như rô bốt phần mềm hoặc rô bốt phần mềm, tồn tại trong các miền softbot phong phú và không giới hạn. Trình mô phỏng cóvery detailedvà complex environment. Tác nhân phần mềm cần chọn từ một loạt các hành động trong thời gian thực.
Ví dụ: một softbot được thiết kế để quét các sở thích trực tuyến của khách hàng và hiển thị các mặt hàng thú vị cho khách hàng hoạt động trong real cũng như một artificial Môi trường.
Thuộc tính của môi trường
Môi trường có nhiều thuộc tính như được thảo luận bên dưới:
Discrete/Continuous- Nếu có một số hạn chế các trạng thái riêng biệt, xác định rõ ràng, thì môi trường là rời rạc, ngược lại thì liên tục. Ví dụ, cờ vua là một môi trường rời rạc và lái xe là một môi trường liên tục.
Observable/Partially Observable- Nếu có thể xác định được trạng thái hoàn chỉnh của môi trường tại từng thời điểm từ các khái niệm thì có thể quan sát được; nếu không thì nó chỉ có thể quan sát được một phần.
Static/Dynamic- Nếu môi trường không thay đổi trong khi một tác nhân đang hoạt động, thì nó là tĩnh; nếu không thì nó là động.
Single agent/Multiple agents - Môi trường có thể chứa các tác nhân khác có thể cùng loại hoặc khác loại với tác nhân.
Accessible/Inaccessible- Nếu bộ máy cảm quan của tác nhân có thể tiếp cận được trạng thái hoàn chỉnh của môi trường thì tác nhân đó có thể tiếp cận được môi trường; nếu không thì không thể truy cập được.
Deterministic/Non-deterministic- Nếu trạng thái tiếp theo của môi trường được xác định hoàn toàn bởi trạng thái hiện tại và các hành động của tác nhân thì môi trường là xác định; nếu không nó là không xác định.
Episodic/Non-episodic- Trong môi trường nhiều tập, mỗi tập bao gồm tác nhân nhận thức và sau đó hành động. Chất lượng của hành động phụ thuộc vào chính tập phim. Các tập tiếp theo không phụ thuộc vào các hành động trong các tập trước. Môi trường Episodic đơn giản hơn nhiều vì tác nhân không cần phải suy nghĩ trước.
Xây dựng môi trường với Python
Đối với tác nhân học tập củng cố xây dựng, chúng tôi sẽ sử dụng OpenAI Gym gói có thể được cài đặt với sự trợ giúp của lệnh sau:
pip install gym
Có nhiều môi trường khác nhau trong phòng tập thể dục OpenAI có thể được sử dụng cho các mục đích khác nhau. Một vài trong số họ làCartpole-v0, Hopper-v1và MsPacman-v0. Họ yêu cầu các động cơ khác nhau. Tài liệu chi tiết vềOpenAI Gym có thể được tìm thấy trên https://gym.openai.com/docs/#environments.
Đoạn mã sau đây cho thấy một ví dụ về mã Python cho môi trường cartpole-v0:
import gym
env = gym.make('CartPole-v0')
env.reset()
for _ in range(1000):
env.render()
env.step(env.action_space.sample())
Bạn có thể xây dựng các môi trường khác theo cách tương tự.
Xây dựng tác nhân học tập với Python
Đối với tác nhân học tập củng cố xây dựng, chúng tôi sẽ sử dụng OpenAI Gym gói như hình -
import gym
env = gym.make('CartPole-v0')
for _ in range(20):
observation = env.reset()
for i in range(100):
env.render()
print(observation)
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
if done:
print("Episode finished after {} timesteps".format(i+1))
break
Quan sát xem cartpole có thể tự cân bằng không.
Chương này thảo luận chi tiết về các thuật toán di truyền của AI.
Thuật toán di truyền là gì?
Thuật toán di truyền (GA) là thuật toán tìm kiếm dựa trên các khái niệm về chọn lọc tự nhiên và di truyền. GAs là một tập con của một nhánh tính toán lớn hơn nhiều được gọi là Tính toán tiến hóa.
GA được phát triển bởi John Holland và các sinh viên và đồng nghiệp của ông tại Đại học Michigan, nổi bật nhất là David E. Goldberg. Kể từ đó, nó đã được thử nghiệm trên các vấn đề tối ưu hóa khác nhau với mức độ thành công cao.
Trong GAs, chúng tôi có một nhóm các giải pháp khả thi cho vấn đề đã cho. Các giải pháp này sau đó trải qua quá trình tái tổ hợp và đột biến (giống như trong di truyền tự nhiên), tạo ra những đứa trẻ mới và quá trình này được lặp lại trong nhiều thế hệ khác nhau. Mỗi cá thể (hoặc giải pháp ứng viên) được chỉ định một giá trị phù hợp (dựa trên giá trị hàm mục tiêu của nó) và các cá thể phù hợp có cơ hội giao phối và sinh sản cao hơnfittercá nhân. Điều này phù hợp với Học thuyết Darwin vềSurvival of the Fittest.
Do đó, nó giữ evolving những cá nhân hoặc giải pháp tốt hơn qua nhiều thế hệ, cho đến khi nó đạt đến tiêu chí dừng.
Thuật toán di truyền về bản chất là đủ ngẫu nhiên, nhưng chúng hoạt động tốt hơn nhiều so với tìm kiếm cục bộ ngẫu nhiên (nơi chúng tôi chỉ thử các giải pháp ngẫu nhiên, theo dõi những gì tốt nhất cho đến nay), vì chúng cũng khai thác thông tin lịch sử.
Cách sử dụng GA cho các vấn đề về tối ưu hóa?
Tối ưu hóa là một hành động làm cho thiết kế, tình huống, tài nguyên và hệ thống trở nên hiệu quả nhất có thể. Sơ đồ khối sau đây cho thấy quá trình tối ưu hóa:
Các giai đoạn của cơ chế GA cho quá trình tối ưu hóa
Sau đây là trình tự các bước của cơ chế GA khi được sử dụng để tối ưu hóa các vấn đề.
Bước 1 - Tạo ngẫu nhiên quần thể ban đầu.
Bước 2 - Chọn giải pháp ban đầu với các giá trị phù hợp nhất.
Bước 3 - Tổng hợp lại các giải pháp đã chọn bằng cách sử dụng các toán tử đột biến và chéo.
Bước 4 - Đưa một con lai vào quần thể.
Bước 5 - Bây giờ, nếu điều kiện dừng được đáp ứng, hãy trả lại giải pháp với giá trị thể lực tốt nhất của chúng. Hãy chuyển sang bước 2.
Cài đặt các gói cần thiết
Để giải quyết vấn đề bằng cách sử dụng Thuật toán di truyền trong Python, chúng tôi sẽ sử dụng một gói mạnh mẽ cho GA được gọi là DEAP. Nó là một thư viện của khung tính toán tiến hóa mới để tạo mẫu nhanh và thử nghiệm các ý tưởng. Chúng tôi có thể cài đặt gói này với sự trợ giúp của lệnh sau trên dấu nhắc lệnh:
pip install deap
Nếu bạn đang sử dụng anaconda môi trường, sau đó lệnh sau có thể được sử dụng để cài đặt deap -
conda install -c conda-forge deap
Thực hiện các giải pháp sử dụng thuật toán di truyền
Phần này giải thích cho bạn việc triển khai các giải pháp sử dụng Thuật toán di truyền.
Tạo các mẫu bit
Ví dụ sau cho bạn thấy cách tạo một chuỗi bit chứa 15 chuỗi, dựa trên One Max vấn đề.
Nhập các gói cần thiết như được hiển thị -
import random
from deap import base, creator, tools
Xác định chức năng đánh giá. Đây là bước đầu tiên để tạo ra một thuật toán di truyền.
def eval_func(individual):
target_sum = 15
return len(individual) - abs(sum(individual) - target_sum),
Bây giờ, hãy tạo hộp công cụ với các thông số phù hợp -
def create_toolbox(num_bits):
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
Khởi tạo hộp công cụ
toolbox = base.Toolbox()
toolbox.register("attr_bool", random.randint, 0, 1)
toolbox.register("individual", tools.initRepeat, creator.Individual,
toolbox.attr_bool, num_bits)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
Đăng ký nhà điều hành đánh giá -
toolbox.register("evaluate", eval_func)
Bây giờ, hãy đăng ký nhà điều hành giao nhau -
toolbox.register("mate", tools.cxTwoPoint)
Đăng ký toán tử đột biến -
toolbox.register("mutate", tools.mutFlipBit, indpb = 0.05)
Xác định toán tử để nhân giống -
toolbox.register("select", tools.selTournament, tournsize = 3)
return toolbox
if __name__ == "__main__":
num_bits = 45
toolbox = create_toolbox(num_bits)
random.seed(7)
population = toolbox.population(n = 500)
probab_crossing, probab_mutating = 0.5, 0.2
num_generations = 10
print('\nEvolution process starts')
Đánh giá toàn bộ dân số -
fitnesses = list(map(toolbox.evaluate, population))
for ind, fit in zip(population, fitnesses):
ind.fitness.values = fit
print('\nEvaluated', len(population), 'individuals')
Tạo và lặp lại qua nhiều thế hệ -
for g in range(num_generations):
print("\n- Generation", g)
Lựa chọn các cá thể thế hệ tiếp theo -
offspring = toolbox.select(population, len(population))
Bây giờ, sao chép các cá thể đã chọn -
offspring = list(map(toolbox.clone, offspring))
Áp dụng trao đổi chéo và đột biến trên đời con -
for child1, child2 in zip(offspring[::2], offspring[1::2]):
if random.random() < probab_crossing:
toolbox.mate(child1, child2)
Xóa giá trị thể chất của trẻ
del child1.fitness.values
del child2.fitness.values
Bây giờ, hãy áp dụng đột biến -
for mutant in offspring:
if random.random() < probab_mutating:
toolbox.mutate(mutant)
del mutant.fitness.values
Đánh giá những cá nhân có thể lực không hợp lệ -
invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
fitnesses = map(toolbox.evaluate, invalid_ind)
for ind, fit in zip(invalid_ind, fitnesses):
ind.fitness.values = fit
print('Evaluated', len(invalid_ind), 'individuals')
Bây giờ, thay thế quần thể bằng cá thể thế hệ tiếp theo -
population[:] = offspring
In số liệu thống kê cho các thế hệ hiện tại -
fits = [ind.fitness.values[0] for ind in population]
length = len(population)
mean = sum(fits) / length
sum2 = sum(x*x for x in fits)
std = abs(sum2 / length - mean**2)**0.5
print('Min =', min(fits), ', Max =', max(fits))
print('Average =', round(mean, 2), ', Standard deviation =',
round(std, 2))
print("\n- Evolution ends")
In kết quả cuối cùng -
best_ind = tools.selBest(population, 1)[0]
print('\nBest individual:\n', best_ind)
print('\nNumber of ones:', sum(best_ind))
Following would be the output:
Evolution process starts
Evaluated 500 individuals
- Generation 0
Evaluated 295 individuals
Min = 32.0 , Max = 45.0
Average = 40.29 , Standard deviation = 2.61
- Generation 1
Evaluated 292 individuals
Min = 34.0 , Max = 45.0
Average = 42.35 , Standard deviation = 1.91
- Generation 2
Evaluated 277 individuals
Min = 37.0 , Max = 45.0
Average = 43.39 , Standard deviation = 1.46
… … … …
- Generation 9
Evaluated 299 individuals
Min = 40.0 , Max = 45.0
Average = 44.12 , Standard deviation = 1.11
- Evolution ends
Best individual:
[0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1,
1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0,
1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1]
Number of ones: 15
Vấn đề hồi quy ký hiệu
Đây là một trong những vấn đề được biết đến nhiều nhất trong lập trình di truyền. Tất cả các bài toán hồi quy ký hiệu đều sử dụng phân phối dữ liệu tùy ý và cố gắng khớp dữ liệu chính xác nhất với công thức ký hiệu. Thông thường, một thước đo như RMSE (Root Mean Square Error) được sử dụng để đo thể lực của một cá nhân. Đây là một bài toán hồi quy cổ điển và ở đây chúng ta đang sử dụng phương trình5x3-6x2+8x=1. Chúng ta cần làm theo tất cả các bước như sau trong ví dụ trên, nhưng phần chính sẽ là tạo các bộ nguyên thủy vì chúng là các khối xây dựng cho các cá nhân để việc đánh giá có thể bắt đầu. Ở đây chúng ta sẽ sử dụng tập hợp nguyên thủy cổ điển.
Đoạn mã Python sau giải thích chi tiết điều này:
import operator
import math
import random
import numpy as np
from deap import algorithms, base, creator, tools, gp
def division_operator(numerator, denominator):
if denominator == 0:
return 1
return numerator / denominator
def eval_func(individual, points):
func = toolbox.compile(expr=individual)
return math.fsum(mse) / len(points),
def create_toolbox():
pset = gp.PrimitiveSet("MAIN", 1)
pset.addPrimitive(operator.add, 2)
pset.addPrimitive(operator.sub, 2)
pset.addPrimitive(operator.mul, 2)
pset.addPrimitive(division_operator, 2)
pset.addPrimitive(operator.neg, 1)
pset.addPrimitive(math.cos, 1)
pset.addPrimitive(math.sin, 1)
pset.addEphemeralConstant("rand101", lambda: random.randint(-1,1))
pset.renameArguments(ARG0 = 'x')
creator.create("FitnessMin", base.Fitness, weights = (-1.0,))
creator.create("Individual",gp.PrimitiveTree,fitness=creator.FitnessMin)
toolbox = base.Toolbox()
toolbox.register("expr", gp.genHalfAndHalf, pset=pset, min_=1, max_=2)
toolbox.expr)
toolbox.register("population",tools.initRepeat,list, toolbox.individual)
toolbox.register("compile", gp.compile, pset = pset)
toolbox.register("evaluate", eval_func, points = [x/10. for x in range(-10,10)])
toolbox.register("select", tools.selTournament, tournsize = 3)
toolbox.register("mate", gp.cxOnePoint)
toolbox.register("expr_mut", gp.genFull, min_=0, max_=2)
toolbox.register("mutate", gp.mutUniform, expr = toolbox.expr_mut, pset = pset)
toolbox.decorate("mate", gp.staticLimit(key = operator.attrgetter("height"), max_value = 17))
toolbox.decorate("mutate", gp.staticLimit(key = operator.attrgetter("height"), max_value = 17))
return toolbox
if __name__ == "__main__":
random.seed(7)
toolbox = create_toolbox()
population = toolbox.population(n = 450)
hall_of_fame = tools.HallOfFame(1)
stats_fit = tools.Statistics(lambda x: x.fitness.values)
stats_size = tools.Statistics(len)
mstats = tools.MultiStatistics(fitness=stats_fit, size = stats_size)
mstats.register("avg", np.mean)
mstats.register("std", np.std)
mstats.register("min", np.min)
mstats.register("max", np.max)
probab_crossover = 0.4
probab_mutate = 0.2
number_gen = 10
population, log = algorithms.eaSimple(population, toolbox,
probab_crossover, probab_mutate, number_gen,
stats = mstats, halloffame = hall_of_fame, verbose = True)
Lưu ý rằng tất cả các bước cơ bản giống như được sử dụng trong khi tạo các mẫu bit. Chương trình này sẽ cung cấp cho chúng ta đầu ra là min, max, std (độ lệch chuẩn) sau 10 số thế hệ.
Thị giác máy tính liên quan đến việc mô hình hóa và tái tạo tầm nhìn của con người bằng phần mềm và phần cứng máy tính. Trong chương này, bạn sẽ tìm hiểu chi tiết về điều này.
Tầm nhìn máy tính
Thị giác máy tính là ngành học nghiên cứu cách tái tạo, ngắt và hiểu một cảnh 3D từ các hình ảnh 2D của nó, xét về các đặc tính của cấu trúc có trong cảnh đó.
Cấu trúc phân cấp thị giác máy tính
Thị giác máy tính được chia thành ba loại cơ bản như sau:
Low-level vision - Nó bao gồm hình ảnh quá trình để trích xuất tính năng.
Intermediate-level vision - Nó bao gồm nhận dạng đối tượng và giải thích cảnh 3D
High-level vision - Nó bao gồm mô tả khái niệm về một cảnh như hoạt động, ý định và hành vi.
Xử lý hình ảnh Computer Vision Vs
Xử lý ảnh nghiên cứu sự chuyển đổi ảnh sang ảnh. Đầu vào và đầu ra của quá trình xử lý hình ảnh đều là hình ảnh.
Thị giác máy tính là việc xây dựng các mô tả rõ ràng, có ý nghĩa về các đối tượng vật lý từ hình ảnh của chúng. Đầu ra của thị giác máy tính là mô tả hoặc diễn giải cấu trúc trong cảnh 3D.
Các ứng dụng
Thị giác máy tính tìm thấy các ứng dụng trong các lĩnh vực sau:
Robotics
Bản địa hóa-xác định vị trí rô bốt tự động
Navigation
Tránh chướng ngại vật
Lắp ráp (chốt trong lỗ, hàn, sơn)
Thao tác (ví dụ: người điều khiển robot PUMA)
Tương tác với người máy (HRI): Robot thông minh để tương tác và phục vụ con người
Medicine
Phân loại và phát hiện (ví dụ như phân loại tổn thương hoặc tế bào và phát hiện khối u)
Phân đoạn 2D / 3D
Tái tạo nội tạng người 3D (MRI hoặc siêu âm)
Phẫu thuật robot có hướng dẫn thị giác
Security
- Sinh trắc học (mống mắt, vân tay, nhận dạng khuôn mặt)
- Giám sát phát hiện một số hoạt động hoặc hành vi đáng ngờ
Transportation
- Xe tự hành
- An toàn, ví dụ, giám sát cảnh giác của người lái xe
Industrial Automation Application
- Kiểm tra công nghiệp (phát hiện khuyết tật)
- Assembly
- Đọc mã vạch và nhãn gói
- Phân loại đối tượng
- Hiểu tài liệu (ví dụ OCR)
Cài đặt các gói hữu ích
Đối với Thị giác máy tính với Python, bạn có thể sử dụng một thư viện phổ biến có tên OpenCV(Thị giác máy tính nguồn mở). Nó là một thư viện các chức năng lập trình chủ yếu nhắm vào thị giác máy tính thời gian thực. Nó được viết bằng C ++ và giao diện chính của nó là C ++. Bạn có thể cài đặt gói này với sự trợ giúp của lệnh sau:
pip install opencv_python-X.X-cp36-cp36m-winX.whl
Ở đây X đại diện cho phiên bản Python được cài đặt trên máy của bạn cũng như win32 hoặc 64 bit mà bạn đang có.
Nếu bạn đang sử dụng anaconda môi trường, sau đó sử dụng lệnh sau để cài đặt OpenCV -
conda install -c conda-forge opencv
Đọc, Viết và Hiển thị Hình ảnh
Hầu hết các ứng dụng CV cần lấy hình ảnh làm đầu vào và sản xuất hình ảnh làm đầu ra. Trong phần này, bạn sẽ học cách đọc và ghi tệp hình ảnh với sự trợ giúp của các chức năng do OpenCV cung cấp.
Các chức năng OpenCV để đọc, hiển thị, ghi tệp hình ảnh
OpenCV cung cấp các chức năng sau cho mục đích này:
imread() function- Đây là chức năng đọc ảnh. OpenCV imread () hỗ trợ nhiều định dạng hình ảnh khác nhau như PNG, JPEG, JPG, TIFF, v.v.
imshow() function- Đây là chức năng hiển thị hình ảnh trong cửa sổ. Cửa sổ tự động phù hợp với kích thước hình ảnh. OpenCV imshow () hỗ trợ nhiều định dạng hình ảnh khác nhau như PNG, JPEG, JPG, TIFF, v.v.
imwrite() function- Đây là chức năng viết ảnh. OpenCV imwrite () hỗ trợ nhiều định dạng hình ảnh khác nhau như PNG, JPEG, JPG, TIFF, v.v.
Thí dụ
Ví dụ này cho thấy mã Python để đọc một hình ảnh ở một định dạng - hiển thị nó trong một cửa sổ và viết cùng một hình ảnh ở định dạng khác. Hãy xem xét các bước được hiển thị bên dưới -
Nhập gói OpenCV như được hiển thị -
import cv2
Bây giờ, để đọc một hình ảnh cụ thể, hãy sử dụng hàm imread () -
image = cv2.imread('image_flower.jpg')
Để hiển thị hình ảnh, hãy sử dụng imshow()chức năng. Tên của cửa sổ mà bạn có thể thấy hình ảnh sẽ làimage_flower.
cv2.imshow('image_flower',image)
cv2.destroyAllwindows()
Bây giờ, chúng ta có thể viết cùng một hình ảnh sang định dạng khác, chẳng hạn .png bằng cách sử dụng hàm imwrite () -
cv2.imwrite('image_flower.png',image)
Kết quả True có nghĩa là hình ảnh đã được ghi thành công dưới dạng tệp .png cũng trong cùng một thư mục.
True
Lưu ý - Hàm DestallWindows () chỉ đơn giản là hủy tất cả các cửa sổ chúng ta đã tạo.
Chuyển đổi không gian màu
Trong OpenCV, hình ảnh không được lưu trữ bằng cách sử dụng màu RGB thông thường, mà chúng được lưu trữ theo thứ tự ngược lại tức là theo thứ tự BGR. Do đó, mã màu mặc định trong khi đọc ảnh là BGR. CáccvtColor() chức năng chuyển đổi màu để chuyển đổi hình ảnh từ mã màu này sang mã màu khác.
Thí dụ
Hãy xem xét ví dụ này để chuyển đổi hình ảnh từ BGR sang thang độ xám.
Nhập OpenCV gói như hình -
import cv2
Bây giờ, để đọc một hình ảnh cụ thể, hãy sử dụng hàm imread () -
image = cv2.imread('image_flower.jpg')
Bây giờ, nếu chúng ta thấy hình ảnh này bằng cách sử dụng imshow() thì chúng ta có thể thấy rằng hình ảnh này nằm trong BGR.
cv2.imshow('BGR_Penguins',image)
Bây giờ, sử dụng cvtColor() chức năng chuyển đổi hình ảnh này sang thang độ xám.
image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray_penguins',image)
Phát hiện cạnh
Con người, sau khi xem một bản phác thảo thô, có thể dễ dàng nhận ra nhiều loại vật thể và tư thế của chúng. Đó là lý do tại sao các cạnh đóng một vai trò quan trọng trong cuộc sống của con người cũng như trong các ứng dụng của thị giác máy tính. OpenCV cung cấp chức năng rất đơn giản và hữu ích được gọi làCanny()để phát hiện các cạnh.
Thí dụ
Ví dụ sau đây cho thấy sự xác định rõ ràng của các cạnh.
Nhập gói OpenCV như được hiển thị -
import cv2
import numpy as np
Bây giờ, để đọc một hình ảnh cụ thể, hãy sử dụng imread() chức năng.
image = cv2.imread('Penguins.jpg')
Bây giờ, hãy sử dụng Canny () chức năng phát hiện các cạnh của hình ảnh đã đọc.
cv2.imwrite(‘edges_Penguins.jpg’,cv2.Canny(image,200,300))
Bây giờ, để hiển thị hình ảnh với các cạnh, hãy sử dụng hàm imshow ().
cv2.imshow(‘edges’, cv2.imread(‘‘edges_Penguins.jpg’))
Chương trình Python này sẽ tạo một hình ảnh có tên edges_penguins.jpg với tính năng phát hiện cạnh.
Phát hiện khuôn mặt
Nhận diện khuôn mặt là một trong những ứng dụng hấp dẫn của thị giác máy tính giúp nó trở nên thực tế hơn cũng như tương lai hơn. OpenCV có một cơ sở tích hợp để thực hiện nhận diện khuôn mặt. Chúng tôi sẽ sử dụngHaar bộ phân loại thác để nhận diện khuôn mặt.
Dữ liệu tầng Haar
Chúng tôi cần dữ liệu để sử dụng bộ phân loại tầng Haar. Bạn có thể tìm thấy dữ liệu này trong gói OpenCV của chúng tôi. Sau khi cài đặt OpenCv, bạn có thể thấy tên thư mụchaarcascades. Sẽ có các tệp .xml cho các ứng dụng khác nhau. Bây giờ, sao chép tất cả chúng để sử dụng khác nhau và sau đó dán vào một thư mục mới trong dự án hiện tại.
Example
Sau đây là mã Python sử dụng Haar Cascade để phát hiện khuôn mặt của Amitabh Bachan được hiển thị trong hình ảnh sau:
Nhập OpenCV gói như hình -
import cv2
import numpy as np
Bây giờ, hãy sử dụng HaarCascadeClassifier để phát hiện khuôn mặt -
face_detection=
cv2.CascadeClassifier('D:/ProgramData/cascadeclassifier/
haarcascade_frontalface_default.xml')
Bây giờ, để đọc một hình ảnh cụ thể, hãy sử dụng imread() chức năng -
img = cv2.imread('AB.jpg')
Bây giờ, hãy chuyển nó thành thang độ xám vì nó sẽ chấp nhận hình ảnh màu xám -
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Bây giờ, sử dụng face_detection.detectMultiScale, thực hiện nhận diện khuôn mặt thực tế
faces = face_detection.detectMultiScale(gray, 1.3, 5)
Bây giờ, vẽ một hình chữ nhật xung quanh toàn bộ khuôn mặt -
for (x,y,w,h) in faces:
img = cv2.rectangle(img,(x,y),(x+w, y+h),(255,0,0),3)
cv2.imwrite('Face_AB.jpg',img)
Chương trình Python này sẽ tạo một hình ảnh có tên Face_AB.jpg với nhận diện khuôn mặt như hình
Phát hiện mắt
Phát hiện mắt là một ứng dụng hấp dẫn khác của thị giác máy tính giúp nó trở nên thực tế hơn cũng như tương lai. OpenCV có một cơ sở tích hợp để thực hiện phát hiện mắt. Chúng tôi sẽ sử dụngHaar cascade phân loại để phát hiện bằng mắt.
Thí dụ
Ví dụ sau cung cấp mã Python bằng cách sử dụng Haar Cascade để phát hiện khuôn mặt của Amitabh Bachan được đưa ra trong hình ảnh sau:
Nhập gói OpenCV như được hiển thị -
import cv2
import numpy as np
Bây giờ, hãy sử dụng HaarCascadeClassifier để phát hiện khuôn mặt -
eye_cascade = cv2.CascadeClassifier('D:/ProgramData/cascadeclassifier/haarcascade_eye.xml')
Bây giờ, để đọc một hình ảnh cụ thể, hãy sử dụng imread() chức năng
img = cv2.imread('AB_Eye.jpg')
Bây giờ, hãy chuyển nó thành thang độ xám vì nó sẽ chấp nhận hình ảnh màu xám -
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Bây giờ với sự giúp đỡ của eye_cascade.detectMultiScale, thực hiện nhận diện khuôn mặt thực tế
eyes = eye_cascade.detectMultiScale(gray, 1.03, 5)
Bây giờ, vẽ một hình chữ nhật xung quanh toàn bộ khuôn mặt -
for (ex,ey,ew,eh) in eyes:
img = cv2.rectangle(img,(ex,ey),(ex+ew, ey+eh),(0,255,0),2)
cv2.imwrite('Eye_AB.jpg',img)
Chương trình Python này sẽ tạo một hình ảnh có tên Eye_AB.jpg với khả năng phát hiện mắt như hình -
Mạng thần kinh nhân tạo (ANN) nó là một hệ thống tính toán hiệu quả, có chủ đề trung tâm được mượn từ sự tương tự của mạng thần kinh sinh học. Mạng nơ-ron là một loại mô hình cho việc học máy. Vào giữa những năm 1980 và đầu những năm 1990, nhiều tiến bộ quan trọng về kiến trúc đã được thực hiện trong mạng nơ-ron. Trong chương này, bạn sẽ tìm hiểu thêm về Học sâu, một cách tiếp cận của AI.
Học sâu xuất hiện từ sự phát triển bùng nổ về tính toán của một thập kỷ như một đối thủ nặng ký trong lĩnh vực này. Do đó, học sâu là một loại học máy cụ thể có các thuật toán được lấy cảm hứng từ cấu trúc và chức năng của não người.
Học máy v / s Học sâu
Học sâu là kỹ thuật học máy mạnh nhất hiện nay. Nó rất mạnh mẽ bởi vì họ học được cách tốt nhất để trình bày vấn đề trong khi học cách giải quyết vấn đề. Dưới đây là một so sánh giữa Học sâu và Học máy:
Sự phụ thuộc dữ liệu
Điểm khác biệt đầu tiên dựa trên hiệu suất của DL và ML khi quy mô dữ liệu tăng lên. Khi dữ liệu lớn, các thuật toán học sâu hoạt động rất tốt.
Phụ thuộc máy móc
Các thuật toán học sâu cần những cỗ máy cao cấp để hoạt động hoàn hảo. Mặt khác, các thuật toán học máy cũng có thể hoạt động trên các máy cấp thấp.
Khai thác tính năng
Các thuật toán học sâu có thể trích xuất các tính năng cấp cao và cố gắng học hỏi từ các tính năng tương tự. Mặt khác, cần có một chuyên gia để xác định hầu hết các tính năng được trích xuất bằng máy học.
Thời gian thực hiện
Thời gian thực thi phụ thuộc vào nhiều tham số được sử dụng trong một thuật toán. Học sâu có nhiều tham số hơn các thuật toán học máy. Do đó, thời gian thực thi của các thuật toán DL, đặc biệt là thời gian đào tạo, nhiều hơn các thuật toán ML. Nhưng thời gian thử nghiệm của thuật toán DL ít hơn so với thuật toán ML.
Phương pháp tiếp cận để giải quyết vấn đề
Học sâu giải quyết vấn đề từ đầu đến cuối trong khi học máy sử dụng cách truyền thống để giải quyết vấn đề, tức là bằng cách chia nhỏ nó thành các phần.
Mạng thần kinh hợp hiến (CNN)
Mạng nơ-ron chuyển đổi cũng giống như mạng nơ-ron thông thường vì chúng cũng được tạo thành từ các nơ-ron có trọng số và độ lệch có thể học được. Mạng nơ-ron thông thường bỏ qua cấu trúc của dữ liệu đầu vào và tất cả dữ liệu được chuyển đổi thành mảng 1-D trước khi đưa nó vào mạng. Quá trình này phù hợp với dữ liệu thông thường, tuy nhiên nếu dữ liệu có chứa hình ảnh, quá trình này có thể phức tạp.
CNN giải quyết vấn đề này một cách dễ dàng. Khi xử lý chúng phải tính đến cấu trúc 2D của hình ảnh, điều này cho phép chúng trích xuất các thuộc tính đặc trưng cho hình ảnh. Theo cách này, mục tiêu chính của CNN là đi từ dữ liệu hình ảnh thô trong lớp đầu vào đến lớp chính xác trong lớp đầu ra. Sự khác biệt duy nhất giữa NN thông thường và CNN là ở cách xử lý dữ liệu đầu vào và kiểu lớp.
Tổng quan về kiến trúc của CNN
Về mặt kiến trúc, các mạng nơ-ron thông thường nhận đầu vào và biến đổi nó thông qua một loạt các lớp ẩn. Mỗi lớp được kết nối với lớp kia với sự trợ giúp của các nơ-ron. Nhược điểm chính của mạng nơ-ron thông thường là chúng không chia tỷ lệ tốt đến hình ảnh đầy đủ.
Kiến trúc của CNNs có các nơ-ron được sắp xếp theo 3 chiều gọi là chiều rộng, chiều cao và chiều sâu. Mỗi nơ-ron trong lớp hiện tại được kết nối với một bản vá nhỏ của đầu ra từ lớp trước. Nó tương tự như việc phủ một×lọc trên hình ảnh đầu vào. Nó sử dụngMbộ lọc để chắc chắn về việc nhận được tất cả các chi tiết. NhữngM bộ lọc là trình trích xuất tính năng trích xuất các tính năng như cạnh, góc, v.v.
Các lớp được sử dụng để tạo CNN
Các lớp sau được sử dụng để xây dựng CNN:
Input Layer - Nó lấy dữ liệu hình ảnh thô như nó vốn có.
Convolutional Layer- Lớp này là khối xây dựng cốt lõi của CNNs thực hiện hầu hết các phép tính. Lớp này tính toán sự phức tạp giữa các tế bào thần kinh và các bản vá lỗi khác nhau trong đầu vào.
Rectified Linear Unit Layer- Nó áp dụng một chức năng kích hoạt cho đầu ra của lớp trước. Nó thêm tính phi tuyến tính vào mạng để nó có thể tổng quát hóa tốt cho bất kỳ loại chức năng nào.
Pooling Layer- Việc gộp chung giúp chúng tôi chỉ giữ lại những phần quan trọng khi chúng tôi phát triển trong mạng. Lớp gộp hoạt động độc lập trên mọi lát sâu của đầu vào và thay đổi kích thước của nó theo không gian. Nó sử dụng hàm MAX.
Fully Connected layer/Output layer - Lớp này tính toán điểm số đầu ra trong lớp cuối cùng. Kết quả đầu ra có kích thước×× , trong đó L là các lớp tập dữ liệu huấn luyện số.
Cài đặt các gói Python hữu ích
Bạn có thể dùng Keras, là một API mạng thần kinh cấp cao, được viết bằng Python và có khả năng chạy trên TensorFlow, CNTK hoặc Theno. Nó tương thích với Python 2.7-3.6. Bạn có thể tìm hiểu thêm về nó từhttps://keras.io/.
Sử dụng các lệnh sau để cài đặt keras:
pip install keras
Trên conda môi trường, bạn có thể sử dụng lệnh sau:
conda install –c conda-forge keras
Xây dựng bộ điều chỉnh tuyến tính bằng ANN
Trong phần này, bạn sẽ học cách xây dựng một bộ hồi quy tuyến tính bằng cách sử dụng mạng nơron nhân tạo. Bạn có thể dùngKerasRegressorđể đạt được điều này. Trong ví dụ này, chúng tôi đang sử dụng tập dữ liệu giá nhà ở Boston với số 13 cho các bất động sản ở Boston. Mã Python cho điều tương tự được hiển thị ở đây -
Nhập tất cả các gói cần thiết như được hiển thị -
import numpy
import pandas
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
Bây giờ, tải tập dữ liệu của chúng tôi được lưu trong thư mục cục bộ.
dataframe = pandas.read_csv("/Usrrs/admin/data.csv", delim_whitespace = True, header = None)
dataset = dataframe.values
Bây giờ, chia dữ liệu thành các biến đầu vào và đầu ra, tức là X và Y -
X = dataset[:,0:13]
Y = dataset[:,13]
Vì chúng tôi sử dụng mạng nơ ron cơ sở, hãy xác định mô hình -
def baseline_model():
Bây giờ, tạo mô hình như sau:
model_regressor = Sequential()
model_regressor.add(Dense(13, input_dim = 13, kernel_initializer = 'normal',
activation = 'relu'))
model_regressor.add(Dense(1, kernel_initializer = 'normal'))
Tiếp theo, biên dịch mô hình -
model_regressor.compile(loss='mean_squared_error', optimizer='adam')
return model_regressor
Bây giờ, hãy sửa hạt ngẫu nhiên để có khả năng tái tạo như sau:
seed = 7
numpy.random.seed(seed)
Đối tượng trình bao bọc Keras để sử dụng trong scikit-learn như một công cụ ước lượng hồi quy được gọi là KerasRegressor. Trong phần này, chúng tôi sẽ đánh giá mô hình này với bộ dữ liệu chuẩn hóa.
estimator = KerasRegressor(build_fn = baseline_model, nb_epoch = 100, batch_size = 5, verbose = 0)
kfold = KFold(n_splits = 10, random_state = seed)
baseline_result = cross_val_score(estimator, X, Y, cv = kfold)
print("Baseline: %.2f (%.2f) MSE" % (Baseline_result.mean(),Baseline_result.std()))
Đầu ra của đoạn mã được hiển thị ở trên sẽ là ước tính về hiệu suất của mô hình đối với vấn đề đối với dữ liệu không nhìn thấy. Nó sẽ là sai số bình phương trung bình, bao gồm trung bình và độ lệch chuẩn trên tất cả 10 lần đánh giá xác nhận chéo.
Bộ phân loại hình ảnh: Ứng dụng của Học sâu
Mạng Nơ-ron Hợp pháp (CNN) giải quyết một vấn đề phân loại hình ảnh, đó là hình ảnh đầu vào thuộc về lớp nào. Bạn có thể sử dụng thư viện học sâu Keras. Lưu ý rằng chúng tôi đang sử dụng tập dữ liệu đào tạo và thử nghiệm hình ảnh của chó và mèo từ liên kết sauhttps://www.kaggle.com/c/dogs-vs-cats/data.
Nhập các thư viện và gói keras quan trọng như được hiển thị -
Gói sau được gọi là tuần tự sẽ khởi tạo mạng nơ-ron dưới dạng mạng tuần tự.
from keras.models import Sequential
Gói sau được gọi là Conv2D được sử dụng để thực hiện phép toán tích chập, bước đầu tiên của CNN.
from keras.layers import Conv2D
Gói sau được gọi là MaxPoling2D được sử dụng để thực hiện thao tác gộp, bước thứ hai của CNN.
from keras.layers import MaxPooling2D
Gói sau được gọi là Flatten là quá trình chuyển đổi tất cả các mảng 2D kết quả thành một vectơ tuyến tính dài liên tục.
from keras.layers import Flatten
Gói sau được gọi là Dense được sử dụng để thực hiện kết nối đầy đủ của mạng nơ-ron, bước thứ tư của CNN.
from keras.layers import Dense
Bây giờ, hãy tạo một đối tượng của lớp tuần tự.
S_classifier = Sequential()
Bây giờ, bước tiếp theo là mã hóa phần tích chập.
S_classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
Đây relu là chức năng chỉnh lưu.
Bây giờ, bước tiếp theo của CNN là thao tác gộp trên các bản đồ đối tượng kết quả sau phần tích chập.
S-classifier.add(MaxPooling2D(pool_size = (2, 2)))
Bây giờ, hãy chuyển đổi tất cả các hình ảnh gộp thành một vector liên tục bằng cách sử dụng tính năng tâng bốc -
S_classifier.add(Flatten())
Tiếp theo, tạo một lớp được kết nối đầy đủ.
S_classifier.add(Dense(units = 128, activation = 'relu'))
Ở đây, 128 là số đơn vị ẩn. Một thực tế phổ biến là xác định số đơn vị ẩn là lũy thừa của 2.
Bây giờ, khởi tạo lớp đầu ra như sau:
S_classifier.add(Dense(units = 1, activation = 'sigmoid'))
Bây giờ, biên dịch CNN, chúng tôi đã xây dựng -
S_classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
Ở đây tham số trình tối ưu hóa là chọn thuật toán giảm độ dốc ngẫu nhiên, tham số tổn thất là chọn hàm tổn thất và tham số metrics là chọn chỉ số hiệu suất.
Bây giờ, hãy thực hiện tăng cường hình ảnh và sau đó điều chỉnh hình ảnh với mạng nơ-ron -
train_datagen = ImageDataGenerator(rescale = 1./255,shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set =
train_datagen.flow_from_directory(”/Users/admin/training_set”,target_size =
(64, 64),batch_size = 32,class_mode = 'binary')
test_set =
test_datagen.flow_from_directory('test_set',target_size =
(64, 64),batch_size = 32,class_mode = 'binary')
Bây giờ, điều chỉnh dữ liệu với mô hình chúng tôi đã tạo -
classifier.fit_generator(training_set,steps_per_epoch = 8000,epochs =
25,validation_data = test_set,validation_steps = 2000)
Ở đây step_per_epoch có số lượng hình ảnh đào tạo.
Bây giờ khi mô hình đã được đào tạo, chúng ta có thể sử dụng nó để dự đoán như sau:
from keras.preprocessing import image
test_image = image.load_img('dataset/single_prediction/cat_or_dog_1.jpg',
target_size = (64, 64))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)
result = classifier.predict(test_image)
training_set.class_indices
if result[0][0] == 1:
prediction = 'dog'
else:
prediction = 'cat'