Beer Data Sets

Homebrew Talk - Beer, Wine, Mead, & Cider Brewing Discussion Forum

Help Support Homebrew Talk - Beer, Wine, Mead, & Cider Brewing Discussion Forum:

This site may earn a commission from merchant affiliate links, including eBay, Amazon, and others.

K_Squared

Member
Joined
Dec 16, 2012
Messages
8
Reaction score
0
Location
South Bend (Mishawaka)
Hi,
I'm a statistician and I would like to find some interesting data sets involving beer, in part so I can illustrate various statistical techniques in class. Mentioning beer usually perks up (graduate) students and I want to use such data to motivate some statistical techniques. So, I'm wondering if anyone knows where I can get some interesting data sets involving beer. For example, does data (not anecdotes) exist for the bootle vs. can debate with regards to freshness? What about preference data by demographics? What about predicting ratings of quality based on a set of predictors? I'm sure some big beer companies would have such data are part of their research, but I'm looking for something I could actually get and then use in class for examples.
Thanks for any suggestions!
Ken
 
You could get the typical malt analysis of barley from several different maltsters and do something with that (relate the fermentability of a wort to it's color???).

You could get a list of styles brewed by different micros and do something with that.

Readily available data in an excel spreadsheet, CSV file, or other data format... You may be hard pressed to find that.

Weather data, on the other hand, is generally available in readily accessible formats...
 
Hi PupThePup,
Thanks for your thoughts. On the malt analysis, that is really already in summary form. As it says "Typical analysis data is subject to standard analytical deviations. They represent average values, not to be considered as guarantees, expressed or implied, nor as a condition of sale." For my purposes, I would need the raw data in which the summary was formed. But, that would be an actual data set, which as you note (e.g., in Excel) may be hard to come by easily. I'm not so interested in weather data, beer is more interesting!
Ken
 
On the malt analysis, that is really already in summary form. As it says "Typical analysis data is subject to standard analytical deviations. They represent average values, not to be considered as guarantees, expressed or implied, nor as a condition of sale." For my purposes, I would need the raw data in which the summary was formed.

Yup, try emailing Briess or Weyermann and see what they can give you (if anything).
 
I used PCA to come up with an improved way of specifying beer color (SRM plus a couple of PC's). If you think you might be interested in that PM me with your e-mail address and I'll send you a .pdf of the paper.
 
I used PCA to come up with an improved way of specifying beer color

How did you determine that your PCA improved the specification of beer color? What test did you perform?
 
There's probably some interesting data for hops too. Stuff like AA/oil content vs. summer temp/rain/harvest date/latitude, etc. I would contact some of the professional organizations to see if they'll share data with you.

I would be very interested in whatever you find.
 
I've sent an email to the Brewers Association explaining what I'm looking for. I'm not expecting a useful response, but hopefully I'm wrong. The temp/rain/harvest etc. information for hops would be great. This is very similar to what Orley Ashenfelter did for wine (in particular, predicting what would be come good wine):
http://www.nytimes.com/1990/03/04/us/wine-equation-puts-some-noses-out-of-joint.html
I'd love to do something similar for beer, but that data just doesn't seem available without a Herculean effort.
Thanks for the thoughts.
 
How did you determine that your PCA improved the specification of beer color? What test did you perform?

We could start a whole new thread on this.

Basically the SRM is a measure of the spectral absorbtion of 5" of beer at 430 nm. Doesn't tell you much about the actual visible color of the beer, does it? Well, actually it does tell you a great deal but clearly a 10 SRM Kriek doesn't look the same as a 10 SRM mild. This is because the absorption spectra are different shapes.

What I did was collect a whole bunch of spectra, normalize them by the absorption at 780, convert to transmission, find the average spectrum over the ensemble and then do PCA on the deviations from the average. It usually only takes a couple of principal components to come up with a correction to the average which models the original spectrum quite well. Thus the 81 point absorption spectrum required for visible color determination using ASTM E-308 can be regenerated from the SRM and 2 or 3 spectral deviation coefficients.

SRM: One number. General idea as to how dark or light a beer appears

ASBC Tristimulus: 3 numbers. Visible color under one limited (and ridiculous) set of viewing conditions.

Augmented SRM: 3-5 numbers. Visible color under any viewing conditions.

The beauty of the augmented system is that it requires the same data as the ASBC tristimulus method and processes it in much the same way.

Same offer here: if you want a copy of the paper PM me and it's yours.
 
We could start a whole new thread on this.

Basically the SRM is a measure of the spectral absorbtion of 5" of beer at 430 nm. Doesn't tell you much about the actual visible color of the beer, does it? Well, actually it does tell you a great deal but clearly a 10 SRM Kriek doesn't look the same as a 10 SRM mild. This is because the absorption spectra are different shapes.

What I did was collect a whole bunch of spectra, normalize them by the absorption at 780, convert to transmission, find the average spectrum over the ensemble and then do PCA on the deviations from the average. It usually only takes a couple of principal components to come up with a correction to the average which models the original spectrum quite well. Thus the 81 point absorption spectrum required for visible color determination using ASTM E-308 can be regenerated from the SRM and 2 or 3 spectral deviation coefficients.

SRM: One number. General idea as to how dark or light a beer appears

ASBC Tristimulus: 3 numbers. Visible color under one limited (and ridiculous) set of viewing conditions.

Augmented SRM: 3-5 numbers. Visible color under any viewing conditions.

The beauty of the augmented system is that it requires the same data as the ASBC tristimulus method and processes it in much the same way.

Same offer here: if you want a copy of the paper PM me and it's yours.

True. These equations, when integrated over the wavelength range, provide the tristimulus values which can then be converted to LAB or an RGB color space. 5" of beer... Hrmm... I believe it's 1 cm^3 of beer? Why would you normalize to 780nm? Most normalize to yellow about 530nm... My question is, How did you prove your findings? What are you comparing? How did you "collect a whole bunch of spectra"? Where did these spectra come from? Also, the equipment to do this sort of thing isn't exactly cheap.

Sorry shouldn't be hijacking this thread with so many questions.
 
True. These equations, when integrated over the wavelength range, provide the tristimulus values which can then be converted to LAB...
...with respect to any white point...
... or an RGB color space.
or Luv or any colorspace connected to XYZ.

5" of beer... Hrmm... I believe it's 1 cm^3 of beer?
The measurement is, with modern instruments, made in 1 cm and multiplied by 12.7. It was originally specified that the measurement be made in 1/2" and multiplied by 10. Either of those, by Lambert's law, gives the absorption in 5".


Why would you normalize to 780nm? Most normalize to yellow about 530nm...
You wouldn't. That was a typo and you responded before I noticed it. The normalization is done to the absorption at 430 nm, the wavelength at which the SRM is measured. This allows us to calculate an average transmission spectrum for an ensemble of beers from their individual transmission spectra in 1 cm after normalization to the 430 nm reading which means each normalized spectrum and thus the average has SRM 12.7. Given the specs for a beer one takes that average spectrum and adds a couple of eigenspectra to it each weighted by a spectral deviation coefficient. The result is an approximation to the normalized spectrum of the actual beer (all the eigenspectra are 0 at 430 nm) and you obtain the actual spectrum by converting back to absorption and multiplying by SRM/12.7. This can be scaled by Lambert's law to any path of interest and modified by any illumination function to yield, when inserted into E-308, Lab or any other color description. Thus 430 is chosen because it is the wavelength at which SRM is measured and Stone and Miller chose that wavelength because spectra normalized by that wavelength are very similar in shape which means that few PC's are needed to model them (Stone and Miller didn't know what they were on to). SRM by itself conveys 92% of the variation between beer transmission spectra.


My question is, How did you prove your findings? What are you comparing?
The thesis was that one could accurately describe visible beer color under any reasonable set of viewing conditions with the SRM and handful of spectral deviation coefficients (SDC's). The method was to compute actual beer color under several sets of viewing conditions (using the full 81 point spectrum required by E-308) and compare (Euclidian distance in Lab space) those colors to colors computed from the SRM and a few SDC's.


How did you "collect a whole bunch of spectra"?

Well, it involved drinking a bunch of beer as only a few mL are required to fill a 1 cm cuvet and I couldn't just pour the rest of the bottles down the drain. The final paper was based on an ensemble of 99 beers.

Where did these spectra come from?
Hach spectrophotometer hooked up to a Mac.

Also, the equipment to do this sort of thing isn't exactly cheap.

True.
 
The thesis was that one could accurately describe visible beer color under any reasonable set of viewing conditions with the SRM and handful of spectral deviation coefficients (SDC's). The method was to compute actual beer color under several sets of viewing conditions (using the full 81 point spectrum required by E-308) and compare (Euclidian distance in Lab space) those colors to colors computed from the SRM and a few SDC's.

So what was your min/max DeltaE? (Assuming you were using DE 1976)...
 
So what was your min/max DeltaE? (Assuming you were using DE 1976)...

That depends on the path, the illuminant, the observer and the beer. The eigenspectra came from the ensemble of 99 beers. Looking at those beers 12% can be represented to DeltaE(1976) < 3 with just the SRM; 50% to < 3 with one SDC, 98% of them to < 3 with 2 SDC's and all with 3. For DeltaE < 1 8% can be represented by just the SRM, about 25% with 1 SDC, 57% with 2 95% with 3 and all with 4. When I measure a new beer I pick the amount of spectral deviation I want to tolerate, let the spreadsheet figure out how many SDC's I need, and compute the colors for that many SDC's for a chosen path, illuminant and observer. If I think the DeltaE is to big I just compute more SDC's. It is incredibly robust in this sense. It usually takes 2 SDC's for a 'normal' beer and 3 for a fruit beer to get better than 3 DeltaE. But the scheme could do orange soda or blue jello though it looses its appeal as the number of required SDCs increases beyond a few.

I can easily send you a pdf of the paper if you want. And the spreadsheet and a strawman Beer 10D MOA too.
 
For MOA Beer 10C (the ASBC's Tristimulus method) the viewing conditions are 10 ° Observer, 1 cm path, Illuminant C. Remember that Illuminant C was developed by the women's magazine industry as supposedly representative of the mix of tungsten and daylight that would fall on the house wives' kitchen tables as they turned the glossy pages of Ladies Home Mycologist or whatever. It would seem to me that one of the D illuminants would be a more reasonable choice and I almost never hold my beer close enough to my face (except when actually drinking it) to subtend 10 ° and I never drink it in a 1 cm wide glass. That's why I said in an earlier post that the Beer 10C conditions were, IMO, ridiculous. So, again, IMO, one of the advantages of the augmented SRM is that you aren't restricted to someone else's choice of viewing conditions. You can, equipped with the SRM and SDC's compute visible color for any illuminant, glass width or either observer. The D illuminants are particularly nice to work with because they are put together exactly the way I do the beer absorption spectrum i.e. by adding together three eigenspectra with the weights being easily calculated from the correlated color temperature of interest.
 
Agreed. I prefer D50 2Deg. I have a rather large list of labeled Illuminants as well as any CCT in my beer software. Kinda neat, but maybe not so practical IMO.
 
Well since this thread now seems to be steering off topic....

Out of curiosity, how many of the 99 spectra in the data set came from highly available commercial beers? If there were enough examples from beers that one could go out and buy then you could construct the spectrum of a target beer by mixing calculated amounts of commercial beers. Of course you don't want to have to mix tiny amounts of 99 different beers together, so when you calculate the mixing components you'd want to regulate the reconstruction to promote solutions which use a small number of beers in the mix, which (to steer this back on topic ... ish) could be a possible in-class demonstration for L1-regularized/Lasso style techniques if the class covers that (of course mixing a dark beer with a few light beers to make an amber beer may not be all that impressive). Alternatively, you could try using spectra PCA weightings and/or L1-reconstruction weightings to predict recipe formulation for various beers.
 
85% of them were commercial beers.

One could conceivably do what you suggest and as an academic excercise you wouldn't need to have access to any of the beers. Just the spectra. In fact this could be an excellent illustration as to how to pick a basis set. Obviously you need a set of beers whose eigencharacterization spans the space of beers you wish to model/emulate and if it doesn't you can only strive to match a projection onto that space.

To come up with an arbitrary spectrum by blending beers not only must the spectrum you wish to simulate lie in the hyperplane spanned by the set of eigenspectra you choose but these eigenspectra would have to be absorption spectra, not transmission spectra as I used. I chose transmission spectra because absorption spectra vary a lot from one another in regions that don't contribute much to their colors. I can get an accurate color description with fewer SDC's by using transmission eigenspectra. For the synthesis problem one needs absorption spectra because Beers law works on absorption spectra. A = sigma(e1c1 + e2c2 ...)L where e1, e2 etc are the extinction coefficients, c1, c2 are the concentrations of the coloring materials and L is the path length. The spectrum for a mix of beers is A = w1*SRM1(I + SDC1*V1,1 * SDC2*V1,2 +...) +w2*SRM2(I + SDC1*V1,2 * SDC2*V2,2 +...) ... where I is a vector of all 1's, SDC1 etc are the spectral deviation coefficients and V1, V2 etc are the eigenspectra. This can be put into a matrix form suitable for Moore-Penrose solution which gives the best, in the rms sense, approximation to a specified target. Of course the best solution would not necessarily have weights which summed to 1 and , of course , any solution vector would have to be normalized so that the weights do sum to one. Lots of details like that last one should make this an excellent teaching opportunity. Just sort of musing here so don't hold me to any of the details but yes, interesting problem.
 
85% of them were commercial beers.

One could conceivably do what you suggest and as an academic excercise you wouldn't need to have access to any of the beers. Just the spectra. In fact this could be an excellent illustration as to how to pick a basis set. Obviously you need a set of beers whose eigencharacterization spans the space of beers you wish to model/emulate and if it doesn't you can only strive to match a projection onto that space.

Sure, but the nice thing about having commercial beers available (and constructing the spectra using the raw spectra from the commercial beers as your basis) is that it gives a more 'interpretable' solution. An eigenspectra gives a nice mathematical construct, but you can't necessarily pour a beer with an eigenspectra into a glass to see what it looks like. With the 'real beer' library of spectra if someone really really wanted to see what a particular beer looked like you could mix the appropriate amounts of the commercial beers into a glass and recreate it.

To come up with an arbitrary spectrum by blending beers not only must the spectrum you wish to simulate lie in the hyperplane spanned by the set of eigenspectra you choose but these eigenspectra would have to be absorption spectra, not transmission spectra as I used.

Isn't absorption just the -log of transmission?

This can be put into a matrix form suitable for Moore-Penrose solution which gives the best, in the rms sense, approximation to a specified target.

Right, but Moore-Penrose will, in general, try to use all of the elements of a basis in the reconstruction. To get sparse solutions (using only a few elements of the basis in the reconstruction) you have to manually limit the rank of the basis (i.e. select which elements to use). If instead you solve the problem using something like L1-regularization (essentially just add a penalty term equal to the absolute value of the spectral weights) the solution will automatically select which elements to use (from potentially very large basis sets - like every commercial beer you've measured) that reconstructs the spectra to within a given rms error threshold.

For example, if your basis of spectra is the matrix S and you're trying describe a target spectra x, then you end up solving the minimization (with respect to A) of

min sum(abs(A)) such that |x-S*A|^2 <= (rms threshold)^2

Where A is constrained to be non-negative
 
Sure, but the nice thing about having commercial beers available (and constructing the spectra using the raw spectra from the commercial beers as your basis) is that it gives a more 'interpretable' solution. An eigenspectra gives a nice mathematical construct, but you can't necessarily pour a beer with an eigenspectra into a glass to see what it looks like. With the 'real beer' library of spectra if someone really really wanted to see what a particular beer looked like you could mix the appropriate amounts of the commercial beers into a glass and recreate it.

If you really wanted to do this you would have to be able to measure spectra in order to see how close you came. Rather than having me tell you that I used Prima Pils and here's the spectrum I measured for Prima Pils (3 years ago) it would be better for you to go buy a hand full of beers, characterize them and use them as your basis. Given that my ensemble is representative you should be able to characterize any beer you buy in terms of SRM plus 2 - 5 coefficients. If you can't then either your beer is a real outlier or my eigenspectra don't span the space I think they do. When it comes to experimenting with blends then you would want to use beers in hand so you can see the results of your experiments.



Isn't absorption just the -log of transmission?
Indeed it is but the eigencharacterization of the absorption spectra cannot be obtained by taking the log of the transmission spectra eigencharacterization. The point is that given the measured spectra you can come up with 4 eigen characterizations: linear, log, linear-average and log-average. In terms of expressing visible color with the fewest numbers linear - average is the best (I tried all four).




Right, but Moore-Penrose will, in general, try to use all of the elements of a basis in the reconstruction. To get sparse solutions (using only a few elements of the basis in the reconstruction) you have to manually limit the rank of the basis (i.e. select which elements to use). If instead you solve the problem using something like L1-regularization (essentially just add a penalty term equal to the absolute value of the spectral weights) the solution will automatically select which elements to use (from potentially very large basis sets - like every commercial beer you've measured) that reconstructs the spectra to within a given rms error threshold.

There is only one practical way that I can think of to come up with the pseudo inverse and that to use Singular Value Decomposition in which case (or at least it is the case with most routines) the singular values (and eigenvectors) will be sorted by the singular value magnitudes. Thus if you want the mmse solution of rank m you simply turn off all but the first m singular values.
 
I don't think I'm explaining my proposal clearly. PCA is fine for raw dimensionality reduction (at least assuming the data is multivariate gaussian). What I'm proposing is actually a representation in a potentially higher dimensional space, but with the nice properties that the axes of this space are real beers (so it's more physically interpretable than an eigenspace) and (for any particular beer) the number of non-zero elements in the representation is small.

For example, you've got a library of spectra for 99 beers measured at 81 points. If you convert all these spectra into absorption so that you can add them and then pack them into the (81 x 99) matrix S you've now got an over-complete dictionary for representing beer spectra (assuming that at least 81 of the beers in your library are linearly independent).

Now, if there were no constraints on your representation coefficients then you could exactly represent any spectra x by just solving for the (99 element) vector A

x = S*A

which has multiple solutions since S is over-complete.

If we're going for a solution that's physically realizable though, we need to constrain the coefficients in 'A' to be non-negative and summing to 1, so we get

min |x-S*A|^2 such that sum(abs(A)) = 1 and A>=0

Now that it's constrained we can exactly represent spectra that are in the convex hull of S and get close solutions for spectra that aren't. This is a (non-negatively constrained) version of L1 (or Lasso)-regression in statistics (why I mentioned the idea for the OP). A nice property of L1-regression is that it promotes coefficient vectors with only a few non-zero elements due to the non-differentiablity of the absolute value at the origin (here though the absolute value is redundant since we already have a non-negative constraint, but the non-differenetiability still holds). Also, since this problem is convex it can be solved efficiently.
 
I think we're over looking (or at least I did in an earlier post) the fact that the problem isn't linear because the absorption at wavelength l in a path L of a mix of beers in volumes v1, v2... with extinction coefficients e1 at that wavelength and chromatophor concentrations c1, c2... would be

Abs(l) = e(l)*L*(c1*v1 + c2*v2....)/(v1 + v2 + ....)

because beer 2 dilutes beer 1 etc. This assumes that Beer's law applies and that when v1 ml of beer 1 are added to v2 ml of beer 2 the resulting volume is v1 + v2. Neither of these is exactly true but the Beer's law part is nearly so and given that the beers have approximately equal true extracts the volume part should be pretty close. We can write Abs = B*v where Abs is an 81 element vector of absorbtions, i.e. the spectrum, v a vector whose elements are the desired volumes and B a matrix with elements Abs(beer j at wavlenth l) /(v1 + v2 + ...). If Abs is some desired spectrum then the set of volumes in the v vector which minimizes the norm of Abs - B*v is a 'solution'. There is only one best solution but there may be many other solutions which give nearly the same result. Now there is no constraint that the elements of v sum to any particular value. We can add 10 mL of beer 1 to 20 ml of beer 2 to 30 ml of beer 3 or 100 mL of beer 1 to 200 mL of beer 2 and 300 mL if beer 3. We'll get the same spectrum in either case but the constraint that the volumes all have to be non negative does apply. Thus the problem is quite non linear and we will have to linearize it to find solutions. The problem is there are, because beer spectra are so close to one another, in shape, so many and they are so close together.

Because B is a function of v we cant use Moore-Penrose to minimize |Abs - B*v| but what we can do is hypothesize a solution, say 10 mL of each beer, find the gradient and use Newton's method to refine the hypothesized solution, and repeat with the refined solution until no further improvement in |Abs - B*v| is seen. The difficulty is that the problem is so ill conditioned. In matching the target (green) spectrum in the first figure below by the iterative technique the condition number for the gradient matrix is 1.9e+16. The three columns of numbers below are three blends that try to match that green curve spectrum. The first two were obtained with Newton's method and the quality of the each is about the same: rmse = 0.12. The third column is the global solution. It's quality is an order of magnitude better - rmse = 0.01. The second and third solutions are plotted on the second graph.

15.9% ----11.1% ---- 53.1%
34.6 ----29.6 ---- 0
4.3-----7.5 ----- 46.9
0 --------0 -------- 0
41.7 ----32.7 ----- 0
23.8 ----16.4 ----- 0
0 -------2.6 ------ 0

So now you know how I wasted my day.

SixSpectra.jpg


Matches.jpg
 
I'm not following the argument as to why this needs to be non-linear. If instead of working with the component volumes you just solve the equation for the percentage of each beer in the final mix (and hence the sum to 1 constraint) this is a pure linear equation isn't it?
 
We are trying to find a set of numbers, v, which minimizes |Abs - B*v| where B has elements whose values are absorptions divided by the sum of the v's i.e. they depend on the things we are solving for. We could write |Abs -C*f| where f are fraction and the elements of C are just the absorbtions but if I solve |Abs -C*f| by Moore-Penrose there is no guarantee that the elements of f will sum to 1. Instead I have to solve |Abs - B*v| iteratively and, if the problem weren't so ill conditioned, that would work very nicely. But it is and that's where the potential value of LASSO comes in. The constraint that all the coefficents add to 1 is a constraint on their L1 norm and I suppose it would be very easy to add to all the other constraints on the L1 norm that in my very limited understanding are a part of the solution process, at least by some methods.
 
We are trying to find a set of numbers, v, which minimizes |Abs - B*v| where B has elements whose values are absorptions divided by the sum of the v's i.e. they depend on the things we are solving for. We could write |Abs -C*f| where f are fraction and the elements of C are just the absorbtions but if I solve |Abs -C*f| by Moore-Penrose there is no guarantee that the elements of f will sum to 1. Instead I have to solve |Abs - B*v| iteratively and, if the problem weren't so ill conditioned, that would work very nicely. But it is and that's where the potential value of LASSO comes in. The constraint that all the coefficents add to 1 is a constraint on their L1 norm and I suppose it would be very easy to add to all the other constraints on the L1 norm that in my very limited understanding are a part of the solution process, at least by some methods.

Oh, well if it's just an implementation issue, the pseudo-code for this isn't too bad. Using your notation from above where,

Abs = spectrum we're trying to match (M x 1 vector)
C = matrix of spectra for all the various beers (M x N matrix)
f = fraction of each beer in C in our final mix (N x 1 vector)

pos(x) = function that sets any negative element of the vector x to 0.

Initizalize f = 0 (vector of all zeros).
Calculate L = Lipchitz constant of the squared error term with respect to f.
In this case L = largest singular value of C'*C (where C' is the transpose of C).

Loop until convergence
\\calculate the gradient step of the solution
q = f - (1/L)*C'*(C*f-Abs)

\\Project this back onto the constraints.
\\Namely, project onto the positive L1 ball of radius 1/L.
\\See http://www.cs.berkeley.edu/~jduchi/projects/DuchiShSiCh08.html for more details

q = pos(q) \\set any elements of q that are less than 0 to 0
u = q sorted in descending order

r = largest value of k=1, 2, .... length(u) such that
u(k) > [(sum of first k elements of u) - 1/L]/k

T = [(sum of first r elements of u) - 1/L)]/r

f = pos(q-T)
end loop


There are faster ways for solving this problem, but for the relatively small data set here this should be fine.

edit: realized I forgot a few 1/L terms in there
 
No, the methods aren't the same. When I say that you project onto the positive L1 ball, what I really mean to say is that you find the projection onto the positive L1 ball with minimum euclidean distance. A Moorse-Penrose solution is effectively the minimum euclidean projection onto a L2 ball. You can rescale it so that it falls inside a L1 ball of given radius, but it's not the optimal projection (measured via euclidean distance) onto the L1 ball. This is actually a key point for promoting sparse solutions. The 'pointy-ness' of the L1 ball encourages solutions that fall along a small number of axes (a toy illustration of this http://grapeot.me/image.axd?picture=2011/3/think-intuitive-sparsity.png).

The convexity of the problem (and the constraint set) means that there will only be one global minimum (and no local minima) of the squared error term. It's possible that the optimal f may not be unique (a trivial example is if C has two identical columns), but all of the optimal f will produce the same squared error.
 
Back
Top