Wednesday, April 6, 2011

Speeding up R computations

The past few days I've been going through some R code that I wrote last year, when I was preparing a massive simulation-based power study for some tests for multivariate normality that I've been working on. My goal was to reduce the time needed to run the simulation. I wasn't expecting great improvement, since I've always believed that the most common R functions are properly vectorized and optimized for speed. Turns out I was wrong. Very wrong.


The first thing that I did was that I replaced all parentheses ( ) by curly brackets { }. I was inspired to do so by this post (and this, via Xi'Ans Og) over at Radford Neal's blog. As he pointed out, code that uses parentheses is actually slower than the same code with curly brackets:

> system.time( for(i in 1:1000000) { 1*(1+1) } )
   user  system elapsed 
  1.337   0.005   1.349 
> system.time( for(i in 1:1000000) { 1*{1+1} } )
   user  system elapsed 
  1.072   0.003   1.076 

Similarly, you can compare a*a and a^2:

> system.time( for(i in 1:10000000) 3^2 )
   user  system elapsed 
  5.048   0.028   5.088 
> system.time( for(i in 1:10000000) 3*3 )
   user  system elapsed 
  4.721   0.024   4.748 

So, a^2 is slower than a*a. This made me wonder, are there other built-in R functions that are slower than they ought to be?

One thing that I found very surprising, and frankly rather disturbing, is that mean(x) takes ten times as long to calculate the mean value of the 50 real numbers in the vector x as the "manual" function sum(x)/50:


> x<-rnorm(50)
> system.time(for(i in 1:100000){mean(x)})
   user  system elapsed 
  1.522   0.000   1.523 
> system.time(for(i in 1:100000){sum(x)/length(x)})
   user  system elapsed 
  0.200   0.000   0.200 
> system.time(for(i in 1:100000){sum(x)/50})
   user  system elapsed 
  0.167   0.000   0.167 
> system.time(for(i in 1:100000){ overn<-rep(1/50,50); x%*%overn })
   user  system elapsed 
  0.678   0.000   0.677 
> overn<-rep(1/50,50); system.time(for(i in 1:100000){ x%*%overn })
   user  system elapsed 
  0.164   0.000   0.164 

I guess that the R development core team have been focusing on making R an easy-to-use high level programming language rather than optimizing all functions, but the poor performance of mean is just embarrassing.

Similarly, the var function can be greatly improved upon. Here are some of the many possibilites:


> x <- rnorm(50)
> system.time( for(i in 1:100000) { var(x) } )
   user  system elapsed 
  4.921   0.000   4.925 
> system.time( for(i in 1:100000) { sum((x-mean(x))^2)/{length(x)-1} } )
   user  system elapsed 
  2.322   0.000   2.325 
> system.time( for(i in 1:100000) { {sum(x*x)-sum(x)*sum(x)/length(x)}/{length(x)-1} } )
   user  system elapsed 
  0.736   0.000   0.737 
> system.time( for(i in 1:100000) { {sum(x*x)-sum(x)*sum(x)/50}/49 } )
   user  system elapsed 
  0.618   0.000   0.618 

> system.time( for(i in 1:100000) { sx<-sum(x); {sum(x*x)-sx*sx/50}/49 } )
   user  system elapsed 
  0.567   0.000   0.568

I changed all the uses of mean in my code to "sum/n" instead (and avoided using var entirely) and found that this sped things up quite a bit.

Another trick to speed up your computations is to create the vectors that you wish to change within a loop with the right number of elements. While

a<-NA
for(j in 1:100) a[j]<-j 

works just fine, it is actually quite a bit slower than

a<-rep(NA,100)
for(j in 1:100) a[j]<-j

You could create a in other ways as well of course, for instance by a<-vector(length=100). Here are the numbers:


> system.time( for(i in 1:100000) { a<-NA; for(j in 1:100) a[j]<-j })
   user  system elapsed 
 37.383   0.092  37.482 
> system.time( for(i in 1:100000) { a<-rep(NA,100); for(j in 1:100) a[j]<-j })
   user  system elapsed 
 25.866   0.065  25.936 
> system.time( for(i in 1:100000) { a<-vector(length=100); for(j in 1:100) a[j]<-j })
   user  system elapsed 
 25.517   0.022  25.548

In my case, I'd been a bit sloppy with creating the vectors in my loops in the proper way, so I changed this in my code as well.

In my simulation study, I simulate multivariate random variables, compute some test statistics and use these to estimate the powers of the normality tests against various alternatives. After doing the changes mentioned above, I compared the performance of my old code to that of the new code, for 1000 iterations of the procedure:

> system.time( source("oldCode.R") )
   user  system elapsed 
548.045   0.273 548.622 
> system.time( source("newCode.R") )
   user  system elapsed 
 93.138   0.002  93.194

The improved code is almost 6 times faster than the old code. When you do ten million or so iterations, that matters. A lot.

In conclusion, it's definitely possible to speed up your code significantly if you know of the pitfalls of R. I suspect that I'll be obsessed with finding more pitfalls in the next few weeks, so I'd be thankful for any hints about other weaknesses that R has.

It should probably be mentioned that R is really fast when things are properly vectorized. Last year, a coworker that uses Matlab challenged me to perform a number of matrix computations faster in R than in Matlab. To his great surprise, R won.

As a final remark, I'm now facing a bit of a dilemma. Should I write readable code; a^6; or fast code; a*a*a*a*a*a?

Update: looking to speed up your R computations even more? See my posts on compiling your code and parallelization.

202 comments:

  1. Wow, thats really interesting (to me, at least). Thanks for the post.

    That being said, i suspect a reason for the poor performance of mean and var is coming from both their need to check the length of the vector and the checks they presumably run for NA's.

    Then again, I think mean fails when you supply it with NA's without specifying the action to take (unless you change the default options).

    It does seem somewhat surprising that the call to length can make that much difference though.

    ReplyDelete
  2. be careful with numerical instabilities that arise, e.g. when calculating variances http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance

    ReplyDelete
  3. I noticed the slowness of the built in functions when i had to count a large number of jackknife correlations in a bigish gene expression data set.

    looping cor() was incredibly slow and the jackknife function of the bootstrap (?) package was a disaster.

    I managed to work around it, though my solution is probably far from optimal (biologist!!), by McGyvering my own cor-function the quite fast rowSums/rowMeans functions. In the end I got my processing time down speeded up by a ton and the analysis done over night in stead of in a week

    /Cheers from Lund

    ReplyDelete
  4. try mean.default() instead of just plain old mean(). That'll get you from 1/20th the speed to 1/2 the speed from mean. Then look at the code of mean.default to see where the rest of the slowdown comes from.

    When you do that you'll see the simplest call to mean(); the one most comparable to the much simpler function sum(). If you try .Internal(mean(x)) you'll be twice as fast as sum(x)/length(x).

    ReplyDelete
  5. Your dilemma is easily solved with regards to easy to write code and your specific example. x^6 is faster than x*x*x*x*x*x. x*x is a special case and one of only two where multiply beats exponent (x*x*x works as well).

    ReplyDelete
  6. OK, now I'm up to 3 comments but I really meant to suggest generalizing my method for mean. You can calculate variance really fast if you know the data going in with the function .Internal(cov(x, NULL, 1, FALSE)). It's 20x faster than var().

    ReplyDelete
  7. The slow down is not "embarassing". It's expected because mean() does a lot more than sum(x)/length(x), and it should. For example, it ensures arguments are numeric and gives a warning when they aren't, and it removes NA values if na.rm=TRUE. Also, your length() denominator won't work when x contains NA's.

    As others have said, calling .Internal(mean(x)) is much faster than any of your alternatives, and that's because it's calling direcly to the C code. In fact, it's calling the SAME function that does sum() (do_summary), but with different flags.

    Since R makes it easy to view the source code, you could have done so and determined in your code that whatever you're passing has no possibility of being non-numeric, and doesn't require na.rm or trim features of the mean() function. Then you should be using .Internal(mean()) rather than mean().

    ReplyDelete
  8. The .Internal method is really quite striking. See the following:

    a<-rnorm(100000000)

    > system.time(for(a in 1:100000) mean(a))
    user system elapsed
    1.319 0.019 1.338
    > system.time(for(a in 1:100000) mean.default(a))
    user system elapsed
    0.478 0.001 0.480
    > system.time(for(a in 1:100000) .Internal(mean(a)))
    user system elapsed
    0.030 0.001 0.031

    ReplyDelete
  9. Thanks for the great comments, people!

    And thanks for the tips about .Internal. I've never used that before, but it really seems to be the way to go here. I'm a bit surprised that the documentation for mean() fails to mention it.

    eduardo: Thanks, that was interesting to read!

    jc: That a^6 thing is funny; before publishing the blog post I thought to myself that I ought to check whether the exponent still was slower for higher products. Clearly I forgot to. :)

    Sean X: Right, you certainly have a number of valid points. Since mean() is a high level function I expected it to be a bit slower, but not THAT much slower, which was what I was trying to say. Sorry if "embarrassing" came off sounding too strong - that's always a danger for someone like me, who's not a native speaker. I tried to look at the source code for mean() in R (by simply typing the function's name), but that only says "UseMethod("mean")" and I didn't know where to go from there. I guess that I have to go directly to the C source to find out how mean() works?

    ReplyDelete
  10. My results: > x <- rnorm(50)
    > y <- sum(x)
    > z <- length(x)
    > Mean <- function(x){Mean = sum(x)/length(x)}
    > system.time(for(i in 1:100000){mean(x)})
    User System verstrichen
    2.61 0.05 2.74
    > system.time(for(i in 1:100000){Mean(x)})
    User System verstrichen
    0.52 0.00 0.52
    > system.time(for(i in 1:100000){sum(x)/50})
    User System verstrichen
    0.25 0.00 0.25
    > system.time(for(i in 1:100000){y/z})
    User System verstrichen
    0.15 0.02 0.17

    So, defining your own simple function saves about 80% of time, and you can trim that by two thirds by calculating the components beforehand. But nice one about the .internal command.

    ReplyDelete
  11. I received a notification about a comment that I can't see in the above list, but it had an interesting link that I thought I'd share: http://www.johndcook.com/blog/2008/11/05/how-to-calculate-pearson-correlation-accurately/

    Also, it was pointed out in that comment that my post mainly concerns known pitfalls. So just to be clear, I'm not trying to claim that I've discovered new caveats, but rather wanted to comment on some things that were new to me.

    ReplyDelete
  12. Another way for speeding up R code is to interface C code within it, is quite easy, see here for a simple example: http://statisfaction.wordpress.com/2011/02/04/speed-up-your-r-code-with-c/

    ReplyDelete
  13. Great link, Julyan. Looks like I may have to brush up on my C skills :)

    ReplyDelete
  14. Using the .Internal method, my improved code is now 7 times faster than it was before I started to look into this. Nice!

    ReplyDelete
  15. Måns, generic functions, like mean(), may not have much code revealed by typing 'mean' at the command line. However, you can get an idea of what you do need to type by checking methods(mean). This will list all of the various mean methods that you currently have, one of which will be mean.default(). That's the one you check the code of.

    This is true for other generic functions as well.

    ReplyDelete
  16. Thanks jc, that was really helpful. Now I have lots of functions that I want to investigate more closely :)

    ReplyDelete
  17. Also, regarding your exponential findings... I was wrong that x^2 and x^3 were special cases when it's slower.... at least I was wrong in implying that this is always true

    I believe it's machine dependent upon implementation of the pow() function in C (which it relies on).

    On my laptop I discovered that x^2 is just as fast as x*x for pretty much any array. Then, after that, while x^n was a fixed speed (no difference for fairly high n's to 20), x*x... was of course slower for every added x. The jump from x^2 to x^3 was very large so x^3 you wouldn't want to use the exponent, but if the exponent could vary to a large number then you most definitely would.

    ReplyDelete
  18. When the computational power goes up the will to optimize usualy fades, resulting in blocking of clusters and ridicoulus amounts of unnecessary data. So keep up the optimization! =)

    ReplyDelete
  19. Using mean.default instead of generic mean will save you time too. So choosing the right method takes some time - but if you think about it, you don't really need to choose the right method for 100000 times if you know the data are of the same type. the rest of the difference comes from processing the extra arguments (na.rm and trim)

    > x <- rnorm(100)
    > system.time(for(i in 1:100000){mean(x)})
    user system elapsed
    2.59 0.00 2.59
    > system.time(for(i in 1:100000){sum(x)/length(x)})
    user system elapsed
    0.39 0.00 0.39
    > system.time(for(i in 1:100000){mean.default(x)})
    user system elapsed
    0.6 0.0 0.6

    But then, look at the code for mean.default and there's a good hint at the very end:

    > system.time(for(i in 1:100000){.Internal(mean(x))})
    user system elapsed
    0.19 0.00 0.19

    Which is about two times faster than your custom function.

    ReplyDelete
  20. This comment has been removed by the author.

    ReplyDelete
  21. This comment has been removed by the author.

    ReplyDelete
  22. In order to notice the difference well you need to increase the size of the vector.

    x<-rnorm(500000)

    system.time(for(i in 1:100000){mean(x)})
    and
    system.time(for(i in 1:100000){.Internal(mean(x))})

    In my computer they need almost the same time. 97.42s vs 95.96s.

    I've also tried with data.table and it's slower.

    DT <- data.table(xx=rnorm(500000))
    system.time(for(i in 1:100000){DT[,mean(xx)]})
    320s
    What's the problem?. Isn't it supposed to be faster?

    Unless I move the loop inside, but still almost the same than the first one.

    now somebody should also compare it to dlpyr, and with versions with snow, foreach, Rcpp, cmpfun ,... my computer doesn't allow me to install the compiler package.

    ReplyDelete
  23. Such a great post!! really superb keep update new things on data science Data Science online Course Bangalore

    ReplyDelete
  24. Thank you for sharing your article. Great efforts put it to find the list of articles which is very useful to know, Definitely will share the same to other forums.
    Data Science Training in chennai at Credo Systemz | data science course fees in chennai | data science course in chennai quora | data science with python training in chennai

    ReplyDelete
  25. Rất vui và hạnh phúc khi đọc được bài viết của bạn. Cảm ơn bạn đã chia sẻ.

    cửa lưới chống muỗi

    lưới chống chuột

    cửa lưới dạng xếp

    cửa lưới tự cuốn

    ReplyDelete
  26. Vanskeligheter( van bi ) vil passere. På samme måte som( van điện từ ) regnet utenfor( van giảm áp ) vinduet, hvor nostalgisk( van xả khí ) er det som til slutt( van cửa ) vil fjerne( van công nghiệp ) himmelen.

    ReplyDelete
  27. Si el agua cae al lago, desaparecerá( phụ kiện tủ bếp ). Pero si cae a la hoja de( phụ kiện tủ áo ) loto, brillará como una joya. Caer igual pero( thùng gạo thông minh ) estar con alguien es importante.

    ReplyDelete
  28. Class College Education training Beauty teaching university academy lesson  teacher master student  spa manager  skin care learn eyelash extensions tattoo spray

    ReplyDelete
  29. Such a very useful article. Very interesting to read this article.I would like to thank you for the efforts you had made for writing this awesome article.
    data analytics cours mumbai

    data science interview questions

    business analytics course

    ReplyDelete
  30. I finally found great post here.I will get back here. I just added your blog to my bookmark sites. thanks.Quality posts is the crucial to invite the visitors to visit the web page, that's what this web page is providing.
    data science course Mumbai
    data analytics courses Mumbai
    data science interview questions

    ReplyDelete
  31. This is a wonderful article, Given so much info in it, Thanks for sharing. CodeGnan offers courses in new technologies and makes sure students understand the flow of work from each and every perspective in a Real-Time environmen python training in vijayawada. , data scince training in vijayawada . , java training in vijayawada. ,

    ReplyDelete
  32. Really awesome blog!!! I finally found great post here.I really enjoyed reading this article. Thanks for sharing valuable information.
    Data Science Course
    Data Science Course in Marathahalli
    Data Science Course Training in Bangalore

    ReplyDelete
  33. This comment has been removed by the author.

    ReplyDelete
  34. I have to search sites with relevant information on given topic and provide them to teacher our opinion and the article.

    ExcelR data analytics courses

    ReplyDelete
  35. I just got to this amazing site not long ago. I was actually captured with the piece of resources you have got here. Big thumbs up for making such wonderful blog page!
    artificial intelligence courses in mumbai

    ReplyDelete
  36. keep up the good work. this is an Ossam post. This is to helpful, i have read here all post. i am impressed. thank you. this is our courses of pmp certifications
    pmp certifications | https://www.excelr.com/pmp-training-in-mumbai

    ReplyDelete
  37. wonderful article. Very interesting to read this article.I would like to thank you for the efforts you had made for writing this awesome article. This article resolved my all queries.
    Data science Interview Questions
    Data Science Course

    ReplyDelete
  38. Thanks for sharing this informations. It's useful for us
    python course in coimbatore

    data science course in coimbatore

    android training institutes in coimbatore

    amazon web services training in coimbatore

    big data training in coimbatore

    RPA Course in coimbatore

    artificial intelligence training in coimbatore

    ReplyDelete
  39. I have to agree with the valid points you make in your article because I see things like you. Additionally, your content is interesting and really good reading material. Thank you for sharing your talent.
    Best Data Science training in Mumbai

    Data Science training in Mumbai

    ReplyDelete
  40. You are so interesting! I don't believe I've truly read through anything like that before. So wonderful to discover another person with a few unique technology thoughts on this issue. Seriously.. many thanks for starting this up. This website is something that is required on the internet, someone with a bit of originality!

    ReplyDelete
  41. Thanks for sharing this nice informations.
    artificial intelligence training in coimbatore

    Blue prism training in coimbatore

    RPA Course in coimbatore

    C and C++ training in coimbatore

    big data training in coimbatore

    hadoop training in coimbatore

    aws training in coimbatore

    ReplyDelete
  42. wonderful article. Very interesting to read this article.I would like to thank you for the efforts you had made for writing this awesome article. This article resolved my all queries. keep it up.
    data analytics course in Bangalore

    ReplyDelete
  43. wonderful article. Very interesting to read this article.I would like to thank you for the efforts you had made for writing this awesome article. This article resolved my all queries.
    Data Science Course

    ReplyDelete
  44. I like viewing web sites which comprehend the price of delivering the excellent useful resource free of charge. I truly adored reading your posting. Thank you!...artificial intelligence course in bangalore

    ReplyDelete
  45. Hey, i liked reading your article. You may go through few of my creative works here
    Route29auto
    Mthfrsupport

    ReplyDelete
  46. After reading your article I was amazed. I know that you explain it very well. And I hope that other readers will also experience how I feel after reading your article.

    Correlation vs Covariance

    ReplyDelete
  47. Very interesting to read this article.I would like to thank you for the efforts you had made for writing this awesome article. This article inspired me to read more. keep it up.
    Correlation vs Covariance

    ReplyDelete
  48. Very interesting blog. Many blogs I see these days do not really provide anything that attracts others, but believe me the way you interact is literally awesome.You can also check my articles as well.

    Data Science In Banglore With Placements
    Data Science Course In Bangalore
    Data Science Training In Bangalore
    Best Data Science Courses In Bangalore
    Data Science Institute In Bangalore

    Thank you..

    ReplyDelete
  49. Very interesting to read this article.I would like to thank you for the efforts you had made for writing this awesome article. This article inspired me to read more. keep it up.
    Correlation vs Covariance
    Simple linear regression

    ReplyDelete
  50. I was just browsing through the internet looking for some information and came across your blog. I am impressed by the information that you have on this blog. It shows how well you understand this subject. Bookmarked this page, will come back for more....artificial intelligence course in bangalore

    ReplyDelete
  51. After reading your article I was amazed. I know that you explain it very well. And I hope that other readers will also experience how I feel after reading your article.
    Data Analyst Course

    ReplyDelete
  52. After reading your article I was amazed. I know that you explain it very well. And I hope that other readers will also experience how I feel after reading your article.
    Data Analyst Course

    ReplyDelete
  53. Such a very useful article. Very interesting to read this article. I would like to thank you for the efforts you had made for writing this awesome article.
    Data Science Course in Pune
    Data Science Training in Pune

    ReplyDelete
  54. Nice blog. I finally found great post here Very interesting to read this article and very pleased to find this site. Great work!
    Data Science Training in Pune
    Data Science Course in Pune

    ReplyDelete
  55. After reading your article I was amazed. I know that you explain it very well. And I hope that other readers will also experience how I feel after reading your article.
    Ethical Hacking Course in Bangalore
    Certified Ethical Hacker Course

    ReplyDelete
  56. Wow! Such an amazing and helpful post this is. I really really love it. I hope that you continue to do your work like this in the future also.
    Ethical Hacking Training in Bangalore
    Ethical Hacking Training

    ReplyDelete
  57. Lockdown is running in the whole country due to coronavirus, in such an environment we are committed to provide the best solutions for QuickBooks Support Phone Number.
    Contact QuickBooks technical Support Phone Number to get in touch.
    Dial QuickBooks Toll free Number : 1-844-908-0801

    ReplyDelete
  58. Nice Blog !
    Dealing with QuickBooks Payroll SSL Error or QuickBooks Error code. Make a call to our QB experts at 1-855-6OO-4O6O. Users may encounter Errors when he/she tries to update, install or download the QuickBooks Payroll.

    ReplyDelete
  59. Nice Blog !
    Dealing with QuickBooks Payroll SSL Error or QuickBooks Error code. Make a call to our QB experts at 1-855-6OO-4O6O. Users may encounter Errors when he/she tries to update, install or download the QuickBooks Payroll.

    ReplyDelete
  60. Nice Blog !
    While using QuickBooks Payroll is if the user has entered an Incorrect pin in the Payroll, they may come across QuickBooks Payroll Error 2002 1-855-6OO-4O6O.

    ReplyDelete
  61. Thumbs up guys your doing a really good job. It is the intent to provide valuable information and best practices, including an understanding of the regulatory process.
    Cyber Security Course in Bangalore

    ReplyDelete
  62. Very interesting to read this article.I would like to thank you for the efforts you had made for writing this awesome article. This article inspired me to read more. keep it up.
    Correlation vs Covariance
    Simple linear regression
    data science interview questions

    ReplyDelete
  63. Very nice blog and articles. I am really very happy to visit your blog. Now I am found which I actually want. I check your blog everyday and try to learn something from your blog. Thank you and waiting for your new post.
    Cyber Security Training in Bangalore

    ReplyDelete
  64. This is a wonderful article, Given so much info in it, These type of articles keeps the users interest in the website, and keep on sharing more ... good luck.

    data science interview questions

    ReplyDelete
  65. After reading your article I was amazed. I know that you explain it very well. And I hope that other readers will also experience how I feel after reading your article.
    Ethical Hacking Course in Bangalore

    ReplyDelete
  66. Wow! Such an amazing and helpful post this is. I really really love it. I hope that you continue to do your work like this in the future also.
    Ethical Hacking Training in Bangalore

    ReplyDelete
  67. Randomly found your blog. You have share helpful information Data science course in Pune

    ReplyDelete
  68. I am impressed by the information that you have on this blog. Thanks for Sharing
    Ethical Hacking in Bangalore

    ReplyDelete
  69. I am looking for and I love to post a comment that "The content of your post is awesome" Great work!

    data science interview questions

    ReplyDelete
  70. Amazing Article ! I would like to thank you for the efforts you had made for writing this awesome article. This article inspired me to read more. keep it up.
    Simple Linear Regression
    Correlation vs covariance
    data science interview questions
    KNN Algorithm
    Logistic Regression explained

    ReplyDelete
  71. I am looking for and I love to post a comment that "The content of your post is awesome" Great work!

    Simple Linear Regression

    Correlation vs covariance

    KNN Algorithm

    Logistic Regression explained

    ReplyDelete
  72. Amazing Article ! I would like to thank you for the efforts you had made for writing this awesome article. This article inspired me to read more. keep it up.
    Simple Linear Regression
    Correlation vs covariance
    data science interview questions
    KNN Algorithm
    Logistic Regression explained

    ReplyDelete
  73. Awesome, I’m really thankful to you for this amazing blog. Visit Ogen Infosystem for creative website designing and development services in Delhi, India.
    Website Designing Company in Delhi

    ReplyDelete
  74. Amazing Article ! I would like to thank you for the efforts you had made for writing this awesome article. This article inspired me to read more. keep it up.
    Correlation vs Covariance
    Simple Linear Regression
    data science interview questions
    KNN Algorithm
    Logistic Regression explained

    ReplyDelete
  75. I would like to thank you for getting my neurons conspicuous with this brilliant article that you have written which contains every potential points which needs to considered on the given topic. Thanks for chipping in such a brilliant writing!
    SAP training in Kolkata
    SAP course in Kolkata
    SAP training institute in Kolkata


    ReplyDelete
  76. very well explained. I would like to thank you for the efforts you had made for writing this awesome article. This article inspired me to read more. keep it up.
    Correlation vs Covariance
    Simple Linear Regression
    data science interview questions
    KNN Algorithm
    Logistic Regression explained

    ReplyDelete
  77. Really impressed! Everything is very open and very clear clarification of issues. It contains truly facts. Your website is very valuable. Thanks for sharing.
    artificial intelligence course in bangalore

    ReplyDelete
  78. very well explained. I would like to thank you for the efforts you had made for writing this awesome article. This article inspired me to read more. keep it up.
    Logistic Regression explained
    Correlation vs Covariance
    Simple Linear Regression
    KNN Algorithm
    data science interview questions

    ReplyDelete
  79. Water bodies are the main source of transportation for international freight forwarding. Due to this, sea freight company in Delhi,
    visit
    Freight Forwarder in Vietnam
    Shipping Company In India

    ReplyDelete

  80. Excellent Blog! I would like to thank for the efforts you have made in writing this post. I am hoping the same best work from you in the future as well. I wanted to thank you for this websites! Thanks for sharing. Great websites!


    Data Scientist Course in pune

    ReplyDelete
  81. Feeling good to read such a informative blog, mostly i eagerly search for this kind of blog. I really found your blog informative and unique, waiting for your new blog to read. We offers multipl digital marketing service:
    Digital marketing Service in Delhi
    SMM Services
    PPC Services in Delhi
    Website Design & Development Packages
    SEO Services PackagesLocal SEO services
    E-mail marketing services
    YouTube plans

    ReplyDelete
  82. I have been searching to find a comfort or effective procedure to complete this process and I think this is the most suitable way to do it effectively.
    Best Institutes For Digital Marketing in Hyderabad


    ReplyDelete
  83. Hi there, I found your blog via Google while searching for such kinda informative post and your post looks very interesting for me ExcelR Data Analytics Courses

    ReplyDelete
  84. Very awesome!!! When I seek for this I found this website at the top of all blogs in search engine.
    Best Data Science Courses in Hyderabad

    ReplyDelete
  85. Did you know that you can easily view the contents of your phone on your TV without a cable? With a screen mirror app you can easily do the screen mirroring from Android to TV. Check out www.screenmirroring.me to find out more.

    ReplyDelete
  86. I want to say thanks to you. I have bookmark your site for future updates. ExcelR Data Analyst Course

    ReplyDelete
  87. Actually I read it yesterday I looked at most of your posts but I had some ideas about it . This article is probably where I got the most useful information for my research and today I wanted to read it again because it is so well written.
    Data Science Course in Bangalore

    ReplyDelete
  88. This is very educational content and written well for a change. It's nice to see that some people still understand how to write a quality post!
    Best Digital Marketing Courses in Hyderabad

    ReplyDelete
  89. ExcelR provides data analytics course. It is a great platform for those who want to learn and become a data analytics Courses. Students are tutored by professionals who have a degree in a particular topic. It is a great opportunity to learn and grow.

    data analytics course
    data analytics courses

    ReplyDelete

  90. Impressive. Your story always brings hope and new energy. Keep up the good work.
    Best Data Science Courses in Hyderabad

    ReplyDelete
  91. Through this post, I realize that your great information in playing with all the pieces was useful. I inform that this is the primary spot where I discover issues I've been looking for. You have a cunning yet alluring method of composing.
    data scientists training

    ReplyDelete
  92. Thanks for posting the best information and the blog is very informative.data science interview questions and answers

    ReplyDelete
  93. Thanks for posting the best information and the blog is very informative.Data science course in Faridabad

    ReplyDelete
  94. Fantastic blog extremely good well enjoyed with the incredible informative content which surely activates the learners to gain the enough knowledge. Which in turn makes the readers to explore themselves and involve deeply in to the subject. Wish you to dispatch the similar content successively in future as well.

    Data Science Course in Raipur

    ReplyDelete
  95. This is an excellent post I saw thanks to sharing it. It is really what I wanted to see. I hope in the future you will continue to share such an excellent post.

    Best Institutes For Digital Marketing in Hyderabad

    ReplyDelete
  96. Thanks for posting the best information and the blog is very helpful.data science courses in Bangalore

    ReplyDelete
  97. Excellent Blog! I would like to thank for the efforts you have made in writing this post. I am hoping the same best work from you in the future as well. I wanted to thank you for this websites! Thanks for sharing. Great websites!
    Data Science Training in Bangalore

    ReplyDelete
  98. I am a new user of this site, so here I saw several articles and posts published on this site, I am more interested in some of them, hope you will provide more information on these topics in your next articles.
    data analytics training in bangalore

    ReplyDelete
  99. Thanks for posting the best information and the blog is very helpful.artificial intelligence course in hyderabad

    ReplyDelete
  100. I just got to this amazing site not long ago. I was actually captured with the piece of resources you have got here. Big thumbs up for making such wonderful blog page!
    data analytics course in bangalore

    ReplyDelete
  101. We are used to the fact that we know only religious and public holidays and celebrate only them.Iamlinkfeeder Iamlinkfeeder Iamlinkfeeder

    ReplyDelete
  102. I want to leave a little comment to support and wish you the best of luck.we wish you the best of luck in all your blogging endeavours.
    data science certification in bangalore

    ReplyDelete
  103. Great post i must say and thanks for the information. Education is definitely a sticky subject. However, is still among the leading topics of our time. I appreciate your post and look forward to more.
    Data Science Course in Bangalore

    ReplyDelete
  104. Highly appreciable regarding the uniqueness of the content. This perhaps makes the readers feels excited to get stick to the subject. Certainly, the learners would thank the blogger to come up with the innovative content which keeps the readers to be up to date to stand by the competition. Once again nice blog keep it up and keep sharing the content as always.

    data analytics courses in bangalore with placement

    ReplyDelete
  105. Great post i must say and thanks for the information. Education is definitely a sticky subject. However, is still among the leading topics of our time. I appreciate your post and look forward to more.
    Data Science Course in Bangalore

    ReplyDelete
  106. Thanks for posting the best information and the blog is very helpful.digital marketing institute in hyderabad

    ReplyDelete
  107. 10 years later and I wonder if these performance tips still count or if R has addressed them. However, I can understand mean() being slower if it is using a numerically stabler algorithm than just sum()/length().

    Also just wanted to be the first comment in several years that wasn't just spam!

    ReplyDelete
  108. Thanks for posting the best information and the blog is very helpful.data science institutes in hyderabad

    ReplyDelete
  109. This was not just great in fact this was really perfect your talent in writing was great.
    data scientist training and placement

    ReplyDelete
  110. Very awesome!!! When I searched for this I found this website at the top of all blogs in search engines.
    business analytics course

    ReplyDelete
  111. Great post i must say and thanks for the information. Education is definitely a sticky subject. However, is still among the leading topics of our time. I appreciate your post and look forward to more.
    Data Science Course in Bangalore

    ReplyDelete
  112. This is an excellent post . thanks for sharing it. It is really what I wanted to see. I hope in the future you will continue to share such an excellent post.

    business analytics course

    ReplyDelete
  113. I am a new user of this site, so here I saw several articles and posts published on this site, I am more interested in some of them, hope you will provide more information on these topics in your next articles.
    data analytics training in bangalore

    ReplyDelete
  114. Thanks for posting the best information and the blog is very important.artificial intelligence course in hyderabad

    ReplyDelete
  115. Great post i must say and thanks for the information. Education is definitely a sticky subject. However, is still among the leading topics of our time. I appreciate your post and look forward to more.
    Data Science Course in Bangalore

    ReplyDelete
  116. Great post i must say and thanks for the information. Education is definitely a sticky subject. However, is still among the leading topics of our time. I appreciate your post and look forward to more.
    Data Science Course in Bangalore

    ReplyDelete
  117. https://360digitmg.com/india/data-science-using-python-and-r-programming-bangalore
    Excellent Blog! I would like to thank for the efforts you have made in writing this post. I am hoping the same best work from you in the future as well. I wanted to thank you for this websites! Thanks for sharing. Great websites!
    Data Science Training in Bangalore

    ReplyDelete
  118. I feel very grateful that I read this. It is very helpful and very informative and I really learned a lot from it.
    best data science institute in hyderabad

    ReplyDelete
  119. I feel so lucky when I come to your site. I would love to share something here and that is about the Fungible data center. The Fungible Data Center (FDC) comprises pools of computing, capacity, and organizing equipment overseen by the Fungible Data Center Composer program.

    ReplyDelete
  120. Thanks for posting the best information and the blog is very important.artificial intelligence course in hyderabad

    ReplyDelete
  121. The writer is enthusiastic about purchasing wooden furniture on the web and his exploration about the best wooden furniture has brought about the arrangement of this article.
    data scientist course in hyderabad

    ReplyDelete
  122. Wonderful blog found to be very impressive to come across such an awesome blog. I should really appreciate the blogger for the efforts they have put in to develop such an amazing content for all the curious readers who are very keen of being updated across every corner. Ultimately, this is an awesome experience for the readers. Anyways, thanks a lot and keep sharing the content in future too.

    data science institute in bangalore

    ReplyDelete

  123. I was basically inspecting through the web filtering for certain data and ran over your blog. I am flabbergasted by the data that you have on this blog. It shows how well you welcome this subject. Bookmarked this page, will return for extra. data science course in jaipur

    ReplyDelete
  124. Thanks for posting the best information and the blog is very important.digital marketing institute in hyderabad

    ReplyDelete
  125. Fantastic article I ought to say and thanks to the info. Instruction is absolutely a sticky topic. But remains one of the top issues of the time. I love your article and look forward to more.
    Data Science Course in Bangalore

    ReplyDelete
  126. Great tips and very easy to understand. This will definitely be very useful for me when I get a chance to start my blog.
    digital marketing courses in hyderabad with placement

    ReplyDelete
  127. We are a top rated economics assignment help Online service here with experts specializing in a wide range of disciplines ensuring you get the assignments that score maximum grades.

    ReplyDelete
  128. Sankey diagram is a very useful visualization to show the flow of data. ChartExpo provides you a better and easiest way to create the Sankey Diagram in no time without coding only on few clicks. Read more here : https://ppcexpo.com/blog/sankey-diagram-for-google-sheets .

    ReplyDelete
  129. Terrific post thoroughly enjoyed reading the blog and more over found to be the tremendous one. In fact, educating the participants with it's amazing content. Hope you share the similar content consecutively.

    data science course in varanasi

    ReplyDelete
  130. Very wonderful informative article. I appreciated looking at your article. Very wonderful reveal. I would like to twit this on my followers. Many thanks! .
    Data Analytics training in Bangalore

    ReplyDelete
  131. Thanks for posting the best information and the blog is very important.data science institutes in hyderabad

    ReplyDelete
  132. It is most knowledgeable information like this. I will read this article it is very easy to learn this blog.
    DevOps Training in Hyderabad
    DevOps Course in Hyderabad

    ReplyDelete
  133. Nice to be seeing your site once again, it's been weeks for me. This article which ive been waited for so long. I need this guide to complete my mission inside the school, and it's same issue together along with your essay. Thanks, pleasant share.
    Data Science training in Bangalore

    ReplyDelete
  134. Just pure brilliance from you here. I have never expected something less than this from you and you have not disappointed me at all. I suppose you will keep the quality work going on.
    data scientist training in hyderabad

    ReplyDelete
  135. Just saying thanks will not just be sufficient, for the fantastic lucidity in your writing. I will instantly grab your feed to stay informed of any updates.
    Best Data Science courses in Hyderabad

    ReplyDelete
  136. Thanks for posting the best information and the blog is very important.data science course in Lucknow

    ReplyDelete
  137. Extremely overall quite fascinating post. I was searching for this sort of data and delighted in perusing this one. Continue posting. A debt of gratitude is in order for sharing. data analytics course in delhi

    ReplyDelete
  138. Truly overall quite fascinating post. I was searching for this sort of data and delighted in perusing this one. Continue posting. Much obliged for sharing.artificial intelligence course in chennai

    ReplyDelete
  139. Thanks for bringing such innovative content which truly attracts the readers towards you. Certainly, your blog competes with your co-bloggers to come up with the newly updated info. Finally, kudos to you.

    Data Science Course in Varanasi

    ReplyDelete
  140. In this chapter we will talk about SEO Basics, SEO is search engine optimization where we try to rank our website at the top of the search results for a particular set of keywords.

    ReplyDelete
  141. This comment has been removed by the author.

    ReplyDelete
  142. Coding is not a necessary skill in data visualization and analysis in this article, we will show you the Best no code tools that are easy to use, have great graphic designs and contain more features to make your visualization sophisticated.

    ReplyDelete
  143. Allegiant Air Tickets fares are very low, which is affordable to all. It starts operation in 1998 and the head office is located in Summerlin, Nevada, US. We are here to provide you with the best deal for your sweet journey. For more details call +1-888-978-0366 or visit allegianthighfly.com.


    Allegiant Change Flight

    How Do I Talk To A Person At Allegiant Air?

    ReplyDelete
  144. Thanks for the informative and helpful post, obviously in your blog everything is good..
    data science training in malaysia

    ReplyDelete
  145. Hi, I log on to your new stuff like every week. Your humoristic style is witty, keep it up
    data scientist training and placement

    ReplyDelete
  146. Took me time to understand all of the comments, but I seriously enjoyed the write-up. It proved being really helpful to me and Im positive to all of the commenters right here! Its constantly nice when you can not only be informed, but also entertained! I am certain you had enjoyable writing this write-up.
    data scientist training and placement

    ReplyDelete
  147. I am a new user of this site, so here I saw several articles and posts published on this site, I am more interested in some of them, will provide more information on these topics in future articles.
    data science course in london

    ReplyDelete
  148. I was actually browsing the internet for certain information, accidentally came across your blog found it to be very impressive. I am elated to go with the information you have provided on this blog, eventually, it helps the readers whoever goes through this blog. Hoping you continue the spirit to inspire the readers and amaze them with your fabulous content.

    Data Science Course in Faridabad

    ReplyDelete
  149. I have express a few of the articles on your website now, and I really like your style of blogging. I added it to my favorite’s blog site list and will be checking back soon…
    data scientist training and placement in hyderabad

    ReplyDelete
  150. I want to say thanks to you. I have bookmark your site for future updates.
    data scientist course

    ReplyDelete