Khoa học dữ liệu bằng C (hoặc C ++)


40

Tôi là một Rlập trình viên ngôn ngữ. Tôi cũng thuộc nhóm những người được coi là Nhà khoa học dữ liệu nhưng đến từ các ngành học thuật khác ngoài CS.

Điều này thể hiện rất tốt vai trò của tôi với tư cách là Nhà khoa học dữ liệu, tuy nhiên, bằng cách bắt đầu sự nghiệp của mình Rvà chỉ có kiến ​​thức cơ bản về các ngôn ngữ kịch bản / web khác, tôi cảm thấy hơi bất cập trong 2 lĩnh vực chính:

  1. Thiếu kiến ​​thức vững chắc về lý thuyết lập trình.
  2. Thiếu trình độ kỹ năng cạnh tranh trong các ngôn ngữ nhanh hơn và được sử dụng rộng rãi hơn C, C++Java, có thể được sử dụng để tăng tốc độ của đường ống và tính toán Dữ liệu lớn cũng như tạo ra các sản phẩm DS / dữ liệu có thể dễ dàng phát triển thành nhanh hơn kịch bản back-end hoặc các ứng dụng độc lập.

Tất nhiên, giải pháp rất đơn giản - hãy tìm hiểu về lập trình, đó là những gì tôi đã làm bằng cách đăng ký vào một số lớp (hiện đang lập trình C).

Tuy nhiên, bây giờ khi tôi bắt đầu giải quyết các vấn đề # 1 và # 2 ở trên, tôi sẽ tự hỏi mình " Ngôn ngữ như thế nào Cvà khả thi C++đối với Khoa học dữ liệu? ".

Chẳng hạn, tôi có thể di chuyển dữ liệu rất nhanh và tương tác tốt với người dùng, nhưng còn về hồi quy nâng cao, Machine Learning, khai thác văn bản và các hoạt động thống kê nâng cao khác thì sao?

Vì thế. có thể Cthực hiện công việc - công cụ nào có sẵn cho thống kê nâng cao, ML, AI và các lĩnh vực khác của Khoa học dữ liệu? Hoặc tôi phải mất phần lớn hiệu quả đạt được bằng cách lập trình Cbằng cách gọi Rcác tập lệnh hoặc ngôn ngữ khác?

Tài nguyên tốt nhất tôi tìm thấy từ trước đến nay trong C là một thư viện có tên Shark , cung cấp C/ C++khả năng sử dụng Support Vector Machines, hồi quy tuyến tính (không phải phi tuyến tính và hồi quy nâng cao khác như probit đa phương, v.v.) và một danh sách rút gọn khác (tuyệt vời nhưng) chức năng thống kê.


5
Câu hỏi này dường như chủ yếu dựa trên ý kiến. Hãy xem xét lại. Có thể hỏi loại công cụ khoa học dữ liệu nào có sẵn cho C / C ++ hoặc loại ứng dụng nào sử dụng các ngôn ngữ này.
sheldonkreger 20/03/2015

1
@sheldonkreger Đó là những gì tôi đang hỏi, tôi sẽ nói rõ hơn, cảm ơn
Hack-R

1
Tôi đã sử dụng bánh quế (C ++) để kết hợp học máy vào các công cụ C ++ hiện có.
Pete

@Pete nếu bạn có thể kết hợp câu trả lời đó vào câu trả lời tôi có thể đánh dấu nó là giải pháp
Hack-R

1
Bộ công cụ meta có sẵn trong C ++: meta-toolkit.github.io/meta . Có một khóa học về Coursera sử dụng nó, nó vẫn ở tuần 1, vì vậy bạn có thể muốn xem qua. Khóa học được gọi là "Công cụ tìm kiếm và tìm kiếm văn bản".
LauriK

Câu trả lời:


35

Hoặc tôi phải mất phần lớn hiệu quả đạt được bằng cách lập trình bằng C bằng cách gọi các tập lệnh R hoặc các ngôn ngữ khác?

Làm ngược lại: học C / C ++ để viết phần mở rộng R. Chỉ sử dụng C / C ++ cho các phần quan trọng về hiệu suất của các thuật toán mới của bạn, sử dụng R để xây dựng phân tích, nhập dữ liệu, tạo sơ đồ, v.v.

Nếu bạn muốn vượt ra ngoài R, tôi khuyên bạn nên học python. Có rất nhiều thư viện có sẵn như scikit-learn cho các thuật toán học máy hoặc PyBrain để xây dựng Mạng thần kinh, v.v. (và sử dụng pylab / matplotlib để vẽ sơ đồ và sổ ghi chép iPython để phát triển các phân tích của bạn). Một lần nữa, C / C ++ rất hữu ích để thực hiện các thuật toán quan trọng về thời gian như các phần mở rộng python.


1
Cảm ơn, Andre. Tôi sử dụng Pybrain rất nhiều; Đối với tôi Python là một trung gian ở giữa R và C, nhưng tôi vẫn muốn học C cho cả ứng dụng mã tốc độ và rộng hơn. Tôi đã chọn đây là giải pháp vì tôi đã không nghĩ đến việc sử dụng C / C ++ để viết các phần mở rộng R, đó là một ý tưởng thực sự tuyệt vời mà tôi hoàn toàn sẽ làm. Cảm ơn!!
Hack-R

1
Tôi thứ hai khái niệm học Python. Tôi làm việc với các bộ dữ liệu lớn và nhà khoa học dữ liệu sử dụng R để phân tích các bộ dữ liệu đó. Mặc dù tôi đã học C từ khi còn rất nhỏ, Python là ngôn ngữ thực sự mang lại cho tôi giá trị như một lập trình viên và hỗ trợ các nhà khoa học dữ liệu này. Do đó, hãy nhìn để khen đội chứ không phải mình.
Glen Swan

1
tương tự python được tăng tốc bằng cách viết bằng cython (một lần nữa về cơ bản là C). Tôi phải nói rằng tôi chưa sử dụng nó cho mình. Có rất ít điều không thể thực hiện được bằng cách sử dụng các thư viện hiện có (ví dụ: scikit-learn, pandas in python [được viết bằng cython để bạn không phải!]).
seanv507

Một số thư viện python hữu ích khác bao gồm: gấu trúc, numpy, scipy vv Thêm này để ủng hộ học python :)
Shagun Sodhani

Đây là vị trí trên. Tôi sẽ lưu ý rằng nếu bạn không có nền tảng CS, khả năng bạn viết mã hiệu quả hơn các hàm cơ bản cho python hoặc các gói cho R là khá xa. Tôi đã lập trình trong C ++ trong 13 năm và vẫn nghĩ rằng có những khía cạnh của quản lý bộ nhớ và tối ưu hóa hiệu suất mà tôi đã không làm tốt. Ngoài ra, python & R có các nhà khoa học máy tính rất thông minh tối ưu hóa các vấn đề phân phối, vì vậy ngôn ngữ C sẽ thực sự được chuyển sang các hệ thống có độ trễ cực thấp.
jagartner

10

Như Andre Holzner đã nói, mở rộng R bằng phần mở rộng C / C ++ là một cách rất tốt để tận dụng lợi thế tốt nhất của cả hai bên. Ngoài ra, bạn có thể thử nghịch đảo, làm việc với C ++ và chức năng gọi theo chiều dọc của R với gói RInside o R. Tại đây bạn có thể tìm thấy cách

http://cran.r-project.org/web/packages/RInside/index.html http://dirk.eddelbuettel.com/code/rinside.html

Khi bạn đang làm việc trong C ++, bạn có nhiều thư viện, nhiều thư viện được xây dựng cho các vấn đề cụ thể, khác chung hơn

http://www.shogun-toolbox.org/page/features/ http://image.diku.dk/shark/sphinx_pages/build/html/index.html

http://mlpack.org/


9

Tôi đồng ý rằng xu hướng hiện tại là sử dụng Python / R và liên kết nó với một số phần mở rộng C / C ++ cho các tác vụ tính toán đắt tiền.

Tuy nhiên, nếu bạn muốn ở lại C / C ++, bạn có thể muốn xem Dlib :

Dlib là một thư viện C ++ đa nền tảng đa năng được thiết kế bằng cách sử dụng lập trình hợp đồng và các kỹ thuật C ++ hiện đại. Nó là phần mềm nguồn mở và được cấp phép theo Giấy phép phần mềm Boost.

nhập mô tả hình ảnh ở đây


Một câu trả lời rất hữu ích. Bạn có biết nếu chúng tôi được phép tự do tái tạo hình ảnh đó (trong trường hợp tôi muốn đưa nó vào một bài thuyết trình hoặc blog, v.v.) không? Ngoài ra, khi nó nói những thứ như "> 20k mẫu" Tôi tự hỏi liệu nó thực sự có nghĩa là "mẫu" hay "quan sát trong mẫu của bạn"?
Hack-R

2
Tôi là tác giả dlib. Hãy đăng hình ảnh đó bất cứ nơi nào bạn muốn :). Ngoài ra,> 20k mẫu có nghĩa là bạn có vectơ 20k hoặc bất cứ điều gì. Có bao nhiêu biến trong mỗi mẫu là một vấn đề riêng biệt.
Davis King

@ Hack-R "Mẫu" là một trong những thuật ngữ quá tải trong thống kê / học máy, đôi khi nó có nghĩa là một tập hợp các trường hợp được rút ra từ dân số (như trong "cỡ mẫu", "nghĩa của mẫu", v.v.), và đôi khi nó nghĩa là các trường hợp riêng lẻ (như trong "đã phân loại một bộ phân loại trên các mẫu 10K").
Tim Goodman

6

Theo tôi, lý tưởng, là một nhiều nổi tròn chuyên nghiệp, nó sẽ được tốt đẹp để biết ít nhất một ngôn ngữ lập trình cho phổ biến nhất mô hình lập trình ( thủ tục , hướng đối tượng , chức năng ). Chắc chắn, tôi coi RPython là hai ngôn ngữ và môi trường lập trình phổ biến nhất cho khoa học dữ liệu và do đó, công cụ khoa học dữ liệu chính .

Julia rất ấn tượng ở một số khía cạnh nhất định, nhưng nó cố gắng bắt kịp hai thứ đó và biến nó thành một công cụ khoa học dữ liệu chính. Tuy nhiên, tôi không thấy điều này xảy ra bất cứ lúc nào sớm, đơn giản là do sự phổ biến của R / Python , cộng đồng rất lớn cũng như hệ sinh thái khổng lồ của các gói / thư viện hiện có và mới được phát triển , bao gồm rất nhiều lĩnh vực / lĩnh vực học.

Phải nói rằng, nhiều gói và thư viện, tập trung vào khoa học dữ liệu, khu vực ML và AI, được triển khai và / hoặc cung cấp API bằng các ngôn ngữ khác ngoài R hoặc Python (để chứng minh, hãy xem danh sách được quản lý nàydanh sách được quản lý này , cả hai là tuyệt vời và đưa ra một quan điểm vững chắc về sự đa dạng trong lĩnh vực này). Điều này đặc biệt đúng đối với phần mềm định hướng hiệu suất hoặc chuyên dụng. Đối với phần mềm đó, tôi đã thấy các dự án triển khai và / hoặc API chủ yếu bằng Java, C và C ++ (Java đặc biệt phổ biến trong phân khúc dữ liệu lớn của khoa học dữ liệu - do sự gần gũi với Hadoop và hệ sinh thái của nó - và trong NLPphân khúc), nhưng các tùy chọn khác có sẵn, mặc dù ở phạm vi hạn chế hơn, dựa trên tên miền. Cả hai ngôn ngữ này đều không lãng phí thời gian, tuy nhiên bạn phải ưu tiên thành thạo bất kỳ hoặc tất cả chúng với tình hình công việc, dự án và sở thích hiện tại của bạn. Vì vậy, để trả lời câu hỏi của bạn về khả năng tồn tại của C / C ++ (và Java), tôi sẽ nói rằng tất cả chúng đều khả thi , tuy nhiên không phải là công cụ khoa học dữ liệu chính , mà là công cụ thứ cấp .

Trả lời câu hỏi của bạn về 1) C là một công cụ khoa học dữ liệu tiềm năng và 2) hiệu quả của nó , tôi sẽ nói rằng: 1) trong khi có thể sử dụng C cho khoa học dữ liệu, tôi khuyên bạn không nên làm điều đó, bởi vì bạn có rất nhiều khó khăn trong việc tìm kiếm các thư viện tương ứng hoặc, thậm chí nhiều hơn, cố gắng tự mình thực hiện các thuật toán tương ứng; 2) bạn không nên lo lắng về hiệu quả, vì nhiều phân đoạn mã quan trọng về hiệu năng được triển khai bằng các ngôn ngữ cấp thấp như C, ngoài ra, có các tùy chọn để giao diện các ngôn ngữ khoa học dữ liệu phổ biến với, ví dụ: C (ví dụ: Rcppgói cho tích hợp R với C / C ++: http://dirk.eddelbuettel.com/code/rcpp.html). Đây là cách tiếp cận đơn giản hơn, nhưng thường khá hiệu quả, đối với hiệu suất, chẳng hạn như sử dụng vector hóa nhất quán trong R cũng như sử dụng các khung, gói và thư viện lập trình song song khác nhau. Để biết ví dụ về hệ sinh thái R, hãy xem CRAN Nhiệm vụ xem "Hiệu suất cao và tính toán song song với R" .

Nói về khoa học dữ liệu , tôi nghĩ rằng sẽ rất có ý nghĩa khi đề cập đến tầm quan trọng của phương pháp nghiên cứu tái sản xuất cũng như sự sẵn có của các công cụ khác nhau , hỗ trợ khái niệm này (để biết thêm chi tiết, vui lòng xem câu trả lời có liên quan của tôi ). Tôi hy vọng rằng câu trả lời của tôi là hữu ích.


5

R là một trong những công cụ chính cho nhà khoa học dữ liệu, những gì bạn chưa từng ngừng sử dụng.

Bây giờ nói về C, C ++ hoặc thậm chí Java. Họ là những ngôn ngữ phổ biến tốt. Bạn cần chúng hay sẽ cần chúng tùy thuộc vào loại công việc hoặc dự án bạn có. Từ kinh nghiệm cá nhân, có rất nhiều công cụ dành cho nhà khoa học dữ liệu mà bạn sẽ luôn cảm thấy như bạn cần phải học hỏi.

Bạn có thể thêm Python hoặc Matlab vào những thứ cần học nếu muốn và tiếp tục thêm. Cách tốt nhất để học là tham gia một dự án công việc bằng các công cụ khác mà bạn không cảm thấy thoải mái. Nếu tôi là bạn, tôi sẽ học Python trước C. Nó được sử dụng trong cộng đồng nhiều hơn C. Nhưng học C không lãng phí thời gian của bạn.


Tôi biết ý của bạn về số lượng công cụ áp đảo! Tôi nói với thực tập sinh của tôi không bị phân tâm và chỉ tập trung vào 1 hoặc 2 điều, nhưng thật khó để có lời khuyên của riêng tôi.
Hack-R

5

Là một nhà khoa học dữ liệu, các ngôn ngữ khác (C ++ / Java) trở nên hữu ích khi bạn cần kết hợp học máy vào một công cụ sản xuất hiện có.

Waffles vừa là thư viện lớp C ++ được bảo trì tốt và gói phân tích dòng lệnh. Nó được giám sát và học tập không giám sát, hàng tấn công cụ xử lý dữ liệu, công cụ dữ liệu thưa thớt và những thứ khác như xử lý âm thanh. Vì nó cũng là một thư viện lớp, bạn có thể mở rộng nó khi bạn cần. Ngay cả khi bạn không phải là người phát triển công cụ C ++ (rất có thể bạn sẽ không như vậy), điều này sẽ cho phép bạn tạo nguyên mẫu, thử nghiệm và giao một cái gì đó cho các nhà phát triển.

Quan trọng nhất, tôi tin rằng kiến ​​thức về C ++ và Java của tôi thực sự giúp tôi hiểu cách Python và R hoạt động. Bất kỳ ngôn ngữ nào chỉ được sử dụng đúng cách khi bạn hiểu một chút về những gì đang diễn ra bên dưới. Bằng cách tìm hiểu sự khác biệt giữa các ngôn ngữ, bạn có thể học cách khai thác điểm mạnh của ngôn ngữ chính của mình.

Cập nhật

Đối với các ứng dụng thương mại có tập dữ liệu lớn, Apache Spark - MLLib rất quan trọng. Tại đây bạn có thể sử dụng Scala, Java hoặc Python.


2

Tôi rất muốn hiểu lý do tại sao bạn cần một ngôn ngữ khác (ngoài dạng Python) nếu mục tiêu của bạn là "nhưng về hồi quy nâng cao, Machine Learning, khai thác văn bản và các hoạt động thống kê nâng cao khác".
Đối với loại điều đó, C là một sự lãng phí thời gian. Đó là một công cụ tốt để có nhưng trong khoảng 20 năm kể từ khi Java ra đời, tôi hiếm khi được mã hóa C.
Nếu bạn thích khía cạnh lập trình chức năng hơn của R, hãy tìm hiểu Scala trước khi bạn có quá nhiều thói quen xấu về thủ tục mã hóa với C .
Cuối cùng học cách sử dụng thư viện Hadley Wickham - họ sẽ giúp bạn tiết kiệm rất nhiều thời gian làm thao tác dữ liệu.


Bởi vì các ngôn ngữ như R và Python rất chậm / kém hiệu quả so với các ngôn ngữ như C. Do đó, khi xử lý nhiều dữ liệu và tính toán, nếu bạn có thể làm gì đó trong C thì nhanh hơn nếu bạn có thể làm điều đó trong R. Tôi yêu thích và sử dụng Gói của Hadley tho!
Hack-R


1

Không chắc liệu nó đã được đề cập chưa, nhưng cũng có wow vowpal nhưng nó có thể chỉ dành riêng cho một số loại vấn đề nhất định.


1
Trông có vẻ thú vị. Tôi chỉ liếc qua liên kết, nhưng các loại mô hình được đề cập sẽ rất hữu ích. Đây có phải là một thư viện C thông thường mà bạn có thể sử dụng trong một chương trình không? Tôi sẽ phải điều tra thêm.
Hack-R

0

Hãy xem Intel DAAL đang được tiến hành. Nó được tối ưu hóa cao cho kiến ​​trúc CPU Intel và hỗ trợ tính toán phân tán.


0

Giải pháp học máy có thể mở rộng cho dữ liệu lớn:

Tôi sẽ thêm $ 0,02 của mình vì có một lĩnh vực chính dường như chưa được giải quyết trong tất cả các bài viết trước - học máy trên dữ liệu lớn !

Đối với dữ liệu lớn, khả năng mở rộng là chính và R là không đủ. Hơn nữa, các ngôn ngữ như Python và R chỉ hữu ích trong việc giao tiếp với các giải pháp có thể mở rộng thường được viết bằng các ngôn ngữ khác. Tôi tạo ra sự khác biệt này không phải vì tôi muốn chê bai những người sử dụng chúng, mà chỉ vì nó rất quan trọng đối với các thành viên của cộng đồng khoa học dữ liệu để hiểu các giải pháp máy học thực sự có thể mở rộng trông như thế nào.

Tôi làm hầu hết công việc của mình với dữ liệu lớn trên các cụm bộ nhớ phân tán . Đó là, tôi không chỉ sử dụng một máy 16 lõi (4 bộ xử lý lõi tứ trên một bo mạch chủ duy nhất chia sẻ bộ nhớ của bo mạch chủ đó), tôi sử dụng một cụm nhỏ gồm 64 máy 16 lõi. Các yêu cầu rất khác nhau đối với các cụm bộ nhớ phân tán này so với các môi trường bộ nhớ dùng chung và học máy dữ liệu lớn đòi hỏi các giải pháp mở rộng trong môi trường bộ nhớ phân tán trong nhiều trường hợp.

Chúng tôi cũng sử dụng C và C ++ ở mọi nơi trong một sản phẩm cơ sở dữ liệu độc quyền. Tất cả các công cụ cấp cao của chúng tôi đều được xử lý trong C ++ và MPI, nhưng công cụ cấp thấp chạm vào dữ liệu là tất cả các mảng ký tự kiểu C dài và dài để giữ cho sản phẩm rất nhanh. Sự tiện lợi của chuỗi std đơn giản là không xứng đáng với chi phí tính toán.

Không có nhiều thư viện C ++ có sẵn cung cấp các khả năng học máy phân tán, có thể mở rộng - MLPACK .

Tuy nhiên, có các giải pháp mở rộng khác với API:

Apache Spark có một thư viện máy học có thể mở rộng được gọi là MLib mà bạn có thể giao tiếp.

Ngoài ra, Tensorflow hiện đã phân phối tenorflow và có api C ++ .

Hi vọng điêu nay co ich!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.