You can subscribe to this list here.
2001 
_{Jan}

_{Feb}

_{Mar}

_{Apr}

_{May}

_{Jun}

_{Jul}
(10) 
_{Aug}
(5) 
_{Sep}
(3) 
_{Oct}
(41) 
_{Nov}
(41) 
_{Dec}
(33) 

2002 
_{Jan}
(75) 
_{Feb}
(10) 
_{Mar}
(170) 
_{Apr}
(174) 
_{May}
(66) 
_{Jun}
(11) 
_{Jul}
(10) 
_{Aug}
(44) 
_{Sep}
(73) 
_{Oct}
(28) 
_{Nov}
(139) 
_{Dec}
(52) 
2003 
_{Jan}
(35) 
_{Feb}
(93) 
_{Mar}
(62) 
_{Apr}
(10) 
_{May}
(55) 
_{Jun}
(70) 
_{Jul}
(37) 
_{Aug}
(16) 
_{Sep}
(56) 
_{Oct}
(31) 
_{Nov}
(57) 
_{Dec}
(83) 
2004 
_{Jan}
(85) 
_{Feb}
(67) 
_{Mar}
(27) 
_{Apr}
(37) 
_{May}
(75) 
_{Jun}
(85) 
_{Jul}
(160) 
_{Aug}
(68) 
_{Sep}
(104) 
_{Oct}
(25) 
_{Nov}
(39) 
_{Dec}
(23) 
2005 
_{Jan}
(10) 
_{Feb}
(45) 
_{Mar}
(43) 
_{Apr}
(19) 
_{May}
(108) 
_{Jun}
(31) 
_{Jul}
(41) 
_{Aug}
(23) 
_{Sep}
(65) 
_{Oct}
(58) 
_{Nov}
(44) 
_{Dec}
(54) 
2006 
_{Jan}
(96) 
_{Feb}
(27) 
_{Mar}
(69) 
_{Apr}
(59) 
_{May}
(67) 
_{Jun}
(35) 
_{Jul}
(13) 
_{Aug}
(461) 
_{Sep}
(160) 
_{Oct}
(399) 
_{Nov}
(32) 
_{Dec}
(72) 
2007 
_{Jan}
(316) 
_{Feb}
(305) 
_{Mar}
(318) 
_{Apr}
(54) 
_{May}
(194) 
_{Jun}
(173) 
_{Jul}
(282) 
_{Aug}
(91) 
_{Sep}
(227) 
_{Oct}
(365) 
_{Nov}
(168) 
_{Dec}
(18) 
2008 
_{Jan}
(71) 
_{Feb}
(111) 
_{Mar}
(155) 
_{Apr}
(173) 
_{May}
(70) 
_{Jun}
(67) 
_{Jul}
(55) 
_{Aug}
(83) 
_{Sep}
(32) 
_{Oct}
(68) 
_{Nov}
(80) 
_{Dec}
(29) 
2009 
_{Jan}
(46) 
_{Feb}
(18) 
_{Mar}
(95) 
_{Apr}
(76) 
_{May}
(140) 
_{Jun}
(98) 
_{Jul}
(84) 
_{Aug}
(123) 
_{Sep}
(94) 
_{Oct}
(131) 
_{Nov}
(142) 
_{Dec}
(125) 
2010 
_{Jan}
(128) 
_{Feb}
(158) 
_{Mar}
(172) 
_{Apr}
(134) 
_{May}
(94) 
_{Jun}
(84) 
_{Jul}
(32) 
_{Aug}
(127) 
_{Sep}
(167) 
_{Oct}
(109) 
_{Nov}
(69) 
_{Dec}
(78) 
2011 
_{Jan}
(39) 
_{Feb}
(58) 
_{Mar}
(52) 
_{Apr}
(47) 
_{May}
(56) 
_{Jun}
(76) 
_{Jul}
(55) 
_{Aug}
(54) 
_{Sep}
(165) 
_{Oct}
(255) 
_{Nov}
(328) 
_{Dec}
(263) 
2012 
_{Jan}
(82) 
_{Feb}
(147) 
_{Mar}
(400) 
_{Apr}
(216) 
_{May}
(209) 
_{Jun}
(160) 
_{Jul}
(86) 
_{Aug}
(141) 
_{Sep}
(156) 
_{Oct}
(6) 
_{Nov}

_{Dec}

2015 
_{Jan}

_{Feb}

_{Mar}

_{Apr}

_{May}

_{Jun}

_{Jul}
(1) 
_{Aug}

_{Sep}
(1) 
_{Oct}

_{Nov}
(1) 
_{Dec}
(2) 
2016 
_{Jan}

_{Feb}
(2) 
_{Mar}
(2) 
_{Apr}
(1) 
_{May}
(1) 
_{Jun}
(2) 
_{Jul}
(1) 
_{Aug}
(1) 
_{Sep}

_{Oct}

_{Nov}

_{Dec}

S  M  T  W  T  F  S 







1
(2) 
2

3
(1) 
4
(7) 
5
(1) 
6

7
(5) 
8

9
(8) 
10
(8) 
11
(1) 
12
(2) 
13
(4) 
14
(6) 
15

16
(1) 
17
(2) 
18
(3) 
19
(3) 
20
(2) 
21
(3) 
22
(5) 
23
(1) 
24
(3) 
25
(2) 
26
(1) 
27
(1) 
28

29
(2) 
30
(6) 






From: <fpoto@us...>  20081118 22:43:53

Revision: 5444 http://octave.svn.sourceforge.net/octave/?rev=5444&view=rev Author: fpoto Date: 20081118 22:43:46 +0000 (Tue, 18 Nov 2008) Log Message:  Implement "average" (UPGMA) method. Modified Paths:  trunk/octaveforge/main/statistics/inst/linkage.m Modified: trunk/octaveforge/main/statistics/inst/linkage.m ===================================================================  trunk/octaveforge/main/statistics/inst/linkage.m 20081118 17:45:18 UTC (rev 5443) +++ trunk/octaveforge/main/statistics/inst/linkage.m 20081118 22:43:46 UTC (rev 5444) @@ 47,7 +47,6 @@ ## Unweighted pair group method with averaging (UPGMA) ## The mean distance between all pair of elements each belonging to one ## cluster. ## NOT IMPLEMENTED ## ## @item "weighted" ## Weighted pair group method with averaging (WPGMA) @@ 91,20 +90,19 @@ error ("linkage: x must be a vector"); endif  quickmethods = { "single", "complete", "weighted", "centroid", "median" };  slowmethods = { "average", "ward" };  + methods = { "single", "complete", "average", "weighted", "centroid", "median" }; method = lower (method); switch (method)  ## These methods do not require to keep memory of merged clusters  case (quickmethods)  distfunction = {(@(x) min(x))  (@(x) max(x))  (@(x) mean(x))  (@(x,w) massdist(x,w))  (@(x) massdist(x))};  dist = distfunction {strcmp (method, quickmethods)}; + case (methods) + distfunction = ... + {(@(x) min(x)) # single + (@(x) max(x)) # complete + (@(x,q) sum(dmult(q,x)) / sum(q)) # average + (@(x) mean(x)) # weighted + (@(x,q) massdist(x,q)) # centroid + (@(x) massdist(x))}; # median + dist = distfunction {strcmp (method, methods)}; dissim = squareform (x, "tomatrix"); # dissimilarity NxN matrix n = rows (dissim); # the number of observations diagidx = sub2ind ([n,n], 1:n, 1:n); # indices of diagonal elements @@ 127,7 +125,7 @@ cname(r) = n + yidx; cname(c) = []; ## Compute the new distances  d = dist (dissim([r c], :), weight(r)/weight(c)); + d = dist (dissim([r c], :), weight([r c])); d(r) = Inf; # take care of the diagonal element ## Put distances in place of the first ones, remove the second ones dissim(r,:) = d; @@ 141,8 +139,7 @@ ## Sort the cluster numbers, as Matlab does y(:,1:2) = sort (y(:,1:2), 2);  ## These methods require a list of elements per merged clusters  case (slowmethods) + case "ward" error ("linkage: %s is not yet implemented", method); otherwise @@ 153,7 +150,7 @@ if (any (diff (y(:,3)) < 0)) warning ("clustering", "linkage: cluster distances do not monotonically increase\n\  you should maybe use a method different from \"%s\"", method); + you should probably use a method different from \"%s\"", method); endif endfunction @@ 162,12 +159,13 @@ ## and J from the others. Column J of second row contains Inf, column J ## of first row contains the distance between clusters I and J. The ## centroid of the new cluster is on the segment joining the old ones. W ## is the ratio between the weights of clusters I and J. Use the law of ## cosines to find the distances of the new cluster from all the others. function y = massdist (x, w = 1) +## are the weights of clusters I and J. Use the law of cosines to find +## the distances of the new cluster from all the others. +function y = massdist (x, w = [1 1]) c = x(1, x(2,:) == Inf); # distance between component clusters  q = 1 / (1 + w); # ratio of distance position  y = sqrt ((1q)*x(1,:).^2 + q*x(2,:).^2 + (q^2q)*c^2); + w /= sum (w); # ratio of distance position + q2 = w(2); + y = sqrt (w(1)*x(1,:).^2 + q2*(x(2,:).^2 + (q21)*c^2)); endfunction @@ 180,6 +178,8 @@ %!assert (cond (linkage (pdist (y))), 34.119045, t); %!assert (cond (linkage (pdist (x), "complete")), 27.506710, t); %!assert (cond (linkage (pdist (y), "complete")), 21.793345, t); +%!assert (cond (linkage (pdist (x), "average")), 35.766804, t); +%!assert (cond (linkage (pdist (y), "average")), 27.045012, t); %!assert (cond (linkage (pdist (x), "weighted")), 36.257913, t); %!assert (cond (linkage (pdist (y), "weighted")), 27.412889, t); %!assert (cond (linkage (pdist (x), "centroid")), 39.104461, t); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. 
From: <fpoto@us...>  20081118 17:45:58

Revision: 5443 http://octave.svn.sourceforge.net/octave/?rev=5443&view=rev Author: fpoto Date: 20081118 17:45:18 +0000 (Tue, 18 Nov 2008) Log Message:  Added the WPGMA ("weighted") test. Removed Bill Denney's copyright notice, as only a couple of lines remain that originate from his code. Modified Paths:  trunk/octaveforge/main/statistics/inst/linkage.m Modified: trunk/octaveforge/main/statistics/inst/linkage.m ===================================================================  trunk/octaveforge/main/statistics/inst/linkage.m 20081118 12:18:48 UTC (rev 5442) +++ trunk/octaveforge/main/statistics/inst/linkage.m 20081118 17:45:18 UTC (rev 5443) @@ 1,4 +1,3 @@ ## Copyright (C) 2006, 2008 Bill Denney <bill@...> ## Copyright (C) 2008 Francesco Potort\xEC <pot@...> ## ## This software is free software; you can redistribute it and/or modify @@ 19,8 +18,8 @@ ## @deftypefn {Function File} {@var{y} =} linkage (@var{x}) ## @deftypefnx {Function File} {@var{y} =} linkage (@var{x}, @var{method}) ## ## Return clusters generated from a distance vector created by the pdist ## function. +## Produce a hierarchical clustering dendrogram from a distance vector +## created by the @code{pdist} function. ## ## @var{x} is the dissimilarity matrix relative to @var{n} observations, ## formatted as a @math{(n1)*n/2}x1 vector as produced by @code{pdist}. @@ 52,7 +51,8 @@ ## ## @item "weighted" ## Weighted pair group method with averaging (WPGMA) ## NOT IMPLEMENTED +## When two clusters A and B are joined together, the new distance to a +## cluster C is the mean between distances AC and BC. ## ## @item "centroid" ## Unweighted PairGroup Method using Centroids (UPGMC) @@ 91,43 +91,42 @@ error ("linkage: x must be a vector"); endif  quickmethods = { "single", "complete", "centroid", "median" };  slowmethods = { "weighted", "average", "ward" }; + quickmethods = { "single", "complete", "weighted", "centroid", "median" }; + slowmethods = { "average", "ward" }; method = lower (method); switch (method) ## These methods do not require to keep memory of merged clusters case (quickmethods)  distfunction = {(@(x,w) min(x)); (@(x,w) max(x))  (@(x,w) massdist(x,w)); (@(x,w) massdist(x,1))}; + distfunction = {(@(x) min(x)) + (@(x) max(x)) + (@(x) mean(x)) + (@(x,w) massdist(x,w)) + (@(x) massdist(x))}; dist = distfunction {strcmp (method, quickmethods)}; dissim = squareform (x, "tomatrix"); # dissimilarity NxN matrix n = rows (dissim); # the number of observations diagidx = sub2ind ([n,n], 1:n, 1:n); # indices of diagonal elements dissim(diagidx) = Inf; # consider a cluster as far from itself  cname = 1:n; # cluster names in dissim + ## For equaldistance nodes, the order in which clusters are + ## merged is arbitrary, but some methods can produce different + ## clusterings depending on it. Rotating the initial matrix + ## produces an ordering more similar to Matlab's. + dissim = rot90 (dissim, 2); + cname = n:1:1; # cluster names in dissim weight = ones (1, n); # cluster weights y = zeros (n1, 3); # clusters from n+1 to 2*n1 for yidx = 1:n1 ## Find the two nearest clusters  ## For equaldistance nodes, the order in which nodes are added  ## to clusters is arbitrary. The two commented lines of code  ## are simplest, but the two uncommented ones choose the nodes  ## so to get an ordering closer to Matlab's. Note that the  ## weighted methods can produce different clusterings depending  ## on the order in which elements are added to clusters.  ###[m midx] = min (dissim(:));  ###[r, c] = ind2sub (size (dissim), midx);  [r c] = find (dissim == min (dissim(:)), 1, "last");  if (cname(r) > cname(c)) [r c] = swap (r, c); endif + [m midx] = min (dissim(:)); + [r, c] = ind2sub (size (dissim), midx); ## Here is the new cluster y(yidx, :) = [cname(r) cname(c) dissim(r, c)]; ## Put it in place of the first one and remove the second  cname(r) = yidx + n; + cname(r) = n + yidx; cname(c) = [];  ## Compute the new distances. The dist function must return a  ## scalar from a vector and a row from a matrix. + ## Compute the new distances d = dist (dissim([r c], :), weight(r)/weight(c)); d(r) = Inf; # take care of the diagonal element ## Put distances in place of the first ones, remove the second ones @@ 139,6 +138,8 @@ weight(r) += weight(c); weight(c) = []; endfor + ## Sort the cluster numbers, as Matlab does + y(:,1:2) = sort (y(:,1:2), 2); ## These methods require a list of elements per merged clusters case (slowmethods) @@ 163,7 +164,7 @@ ## centroid of the new cluster is on the segment joining the old ones. W ## is the ratio between the weights of clusters I and J. Use the law of ## cosines to find the distances of the new cluster from all the others. function y = massdist (x, w) +function y = massdist (x, w = 1) c = x(1, x(2,:) == Inf); # distance between component clusters q = 1 / (1 + w); # ratio of distance position y = sqrt ((1q)*x(1,:).^2 + q*x(2,:).^2 + (q^2q)*c^2); @@ 179,6 +180,8 @@ %!assert (cond (linkage (pdist (y))), 34.119045, t); %!assert (cond (linkage (pdist (x), "complete")), 27.506710, t); %!assert (cond (linkage (pdist (y), "complete")), 21.793345, t); +%!assert (cond (linkage (pdist (x), "weighted")), 36.257913, t); +%!assert (cond (linkage (pdist (y), "weighted")), 27.412889, t); %!assert (cond (linkage (pdist (x), "centroid")), 39.104461, t); %!assert (cond (linkage (pdist (y), "centroid")), 27.457477, t); %!assert (cond (linkage (pdist (x), "median")), 39.671458, t); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. 
From: <fpoto@us...>  20081118 12:19:30

Revision: 5442 http://octave.svn.sourceforge.net/octave/?rev=5442&view=rev Author: fpoto Date: 20081118 12:18:48 +0000 (Tue, 18 Nov 2008) Log Message:  For those orders where different possible results are equally legitimate, try to stay nearest to Matlab (even if not completely the same). Implement Unweighted PairGroup Method using Centroids (UPGMC), that is, the "centroid" method. Modified Paths:  trunk/octaveforge/main/statistics/inst/linkage.m Modified: trunk/octaveforge/main/statistics/inst/linkage.m ===================================================================  trunk/octaveforge/main/statistics/inst/linkage.m 20081117 17:25:48 UTC (rev 5441) +++ trunk/octaveforge/main/statistics/inst/linkage.m 20081118 12:18:48 UTC (rev 5442) @@ 48,9 +48,11 @@ ## Unweighted pair group method with averaging (UPGMA) ## The mean distance between all pair of elements each belonging to one ## cluster. +## NOT IMPLEMENTED ## ## @item "weighted" ## Weighted pair group method with averaging (WPGMA) +## NOT IMPLEMENTED ## ## @item "centroid" ## Unweighted PairGroup Method using Centroids (UPGMC) @@ 65,6 +67,7 @@ ## ## @item "ward" ## Inner squared distance (minimum variance) +## NOT IMPLEMENTED ## ## @end table ## @@ 88,51 +91,63 @@ error ("linkage: x must be a vector"); endif  ## Function distance must return a scalar from a vector and a row from  ## a matrix. + quickmethods = { "single", "complete", "centroid", "median" }; + slowmethods = { "weighted", "average", "ward" }; method = lower (method); switch (method)  case "single"  dist = @min;  case "complete"  dist = @max;  case "median"  dist = @mediandist; # see below  case { "weighted", "average", "centroid", "ward" } + + ## These methods do not require to keep memory of merged clusters + case (quickmethods) + distfunction = {(@(x,w) min(x)); (@(x,w) max(x)) + (@(x,w) massdist(x,w)); (@(x,w) massdist(x,1))}; + dist = distfunction {strcmp (method, quickmethods)}; + dissim = squareform (x, "tomatrix"); # dissimilarity NxN matrix + n = rows (dissim); # the number of observations + diagidx = sub2ind ([n,n], 1:n, 1:n); # indices of diagonal elements + dissim(diagidx) = Inf; # consider a cluster as far from itself + cname = 1:n; # cluster names in dissim + weight = ones (1, n); # cluster weights + y = zeros (n1, 3); # clusters from n+1 to 2*n1 + for yidx = 1:n1 + ## Find the two nearest clusters + ## For equaldistance nodes, the order in which nodes are added + ## to clusters is arbitrary. The two commented lines of code + ## are simplest, but the two uncommented ones choose the nodes + ## so to get an ordering closer to Matlab's. Note that the + ## weighted methods can produce different clusterings depending + ## on the order in which elements are added to clusters. + ###[m midx] = min (dissim(:)); + ###[r, c] = ind2sub (size (dissim), midx); + [r c] = find (dissim == min (dissim(:)), 1, "last"); + if (cname(r) > cname(c)) [r c] = swap (r, c); endif + ## Here is the new cluster + y(yidx, :) = [cname(r) cname(c) dissim(r, c)]; + ## Put it in place of the first one and remove the second + cname(r) = yidx + n; + cname(c) = []; + ## Compute the new distances. The dist function must return a + ## scalar from a vector and a row from a matrix. + d = dist (dissim([r c], :), weight(r)/weight(c)); + d(r) = Inf; # take care of the diagonal element + ## Put distances in place of the first ones, remove the second ones + dissim(r,:) = d; + dissim(:,r) = d'; + dissim(c,:) = []; + dissim(:,c) = []; + ## The new weight is the sum of the components' weights + weight(r) += weight(c); + weight(c) = []; + endfor + + ## These methods require a list of elements per merged clusters + case (slowmethods) error ("linkage: %s is not yet implemented", method); + otherwise error ("linkage: %s: unknown method", method); endswitch  dissim = squareform (x, "tomatrix"); # dissimilarity matrix in square format  n = rows (dissim); # the number of observations  diagidx = sub2ind ([n,n], 1:n, 1:n); # indices of diagonal elements  dissim(diagidx) = Inf; # consider a cluster as far from itself  cname = 1:n; # cluster names in dissim  y = zeros (n1, 3); # clusters from n+1 to 2*n1  for yidx = 1:n1  ## Find the two nearest clusters  ## For equaldistance nodes, the order in which nodes are added to  ## clusters is arbitrary. The following code chooses the nodes so  ## to mostly get the same ordering as in Matlab. Note that the  ## weighted methods can produce different clusterings depending on  ## the order in which elements are added to clusters.  [r c] = find (dissim == min (dissim(:)), 1, "last");  ## Here is the new cluster  y(yidx, :) = [cname(r) cname(c) dissim(r, c)];  ## Put it in place of the first one and remove the second  cname(r) = yidx + n;  cname(c) = [];  ## Same for the dissimilarities, take care of the diagonal element  d = dist (dissim([r c], :));  d(r) = Inf;  dissim(r,:) = d;  dissim(:,r) = d';  dissim(c,:) = [];  dissim(:,c) = [];  endfor  ## Check that distances are monotonically increasing if (any (diff (y(:,3)) < 0)) warning ("clustering", @@ 142,25 +157,29 @@ endfunction ## Take two row vectors, which are the distances of clusters I and J ## from the others. Column J of second row contains Inf, column J of ## first row contains distance between clusters I and J. The centroid ## of the new cluster is midway between the old ones. Use the law of ## cosines to find distances of the new ones from all the others. function y = mediandist (x)  interdist = x(1, x(2,:) == Inf); # distance between component clusters  y = sqrt (sumsq (x) / 2  interdist^2 / 4); +## Take two row vectors, which are the Euclidean distances of clusters I +## and J from the others. Column J of second row contains Inf, column J +## of first row contains the distance between clusters I and J. The +## centroid of the new cluster is on the segment joining the old ones. W +## is the ratio between the weights of clusters I and J. Use the law of +## cosines to find the distances of the new cluster from all the others. +function y = massdist (x, w) + c = x(1, x(2,:) == Inf); # distance between component clusters + q = 1 / (1 + w); # ratio of distance position + y = sqrt ((1q)*x(1,:).^2 + q*x(2,:).^2 + (q^2q)*c^2); endfunction + %!shared x, y, t %! x = [3 1.7; 1 1; 2 3; 2 2.5; 1.2 1; 1.1 1.5; 3 1]; %! y = reshape(mod(magic(6),5),[],3); %! t = 1e6; %!assert (cond (linkage (pdist (x))), 56.981591, t); %!assert (cond (linkage (pdist (y))), 27.771542, t); %!assert (cond (linkage (pdist (x), "single")), 56.981591, t); %!assert (cond (linkage (pdist (y), "single")), 27.771542, t); %!assert (cond (linkage (pdist (x), "complete")), 26.681691, t); %!assert (cond (linkage (pdist (y), "complete")), 21.726318, t); %!assert (cond (linkage (pdist (x), "median")), 39.032841, t); %!assert (cond (linkage (pdist (y), "median")), 26.159331, t); +%! disp ("linkage: should emit 4 warnings\n\t about the \"centroid\" and \"median\" methods"); +%!assert (cond (linkage (pdist (x))), 55.787151, t); +%!assert (cond (linkage (pdist (y))), 34.119045, t); +%!assert (cond (linkage (pdist (x), "complete")), 27.506710, t); +%!assert (cond (linkage (pdist (y), "complete")), 21.793345, t); +%!assert (cond (linkage (pdist (x), "centroid")), 39.104461, t); +%!assert (cond (linkage (pdist (y), "centroid")), 27.457477, t); +%!assert (cond (linkage (pdist (x), "median")), 39.671458, t); +%!assert (cond (linkage (pdist (y), "median")), 27.683325, t); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. 