Boiler Won't Kick On, Porsche Cayenne Price Hong Kong, Peugeot 3008 Hybrid Review, A O Smith Gcv 40 100 Thermocouple, Kim Jong Nam Disneyland, " /> Boiler Won't Kick On, Porsche Cayenne Price Hong Kong, Peugeot 3008 Hybrid Review, A O Smith Gcv 40 100 Thermocouple, Kim Jong Nam Disneyland, ">

# python solve system of linear equations without numpy

This will be one of our bigger jumps. They store almost all of the equations for this section in them. Doing row operations on A to drive it to an identity matrix, and performing those same row operations on B, will drive the elements of B to become the elements of X. It has grown to include our new least_squares function above and one other convenience function called                              insert_at_nth_column_of_matrix, which simply inserts a column into a matrix. LinearAlgebraPurePython.py is imported by LinearAlgebraPractice.py. Let’s rewrite equation 2.7a as. In the first code block, we are not importing our pure python tools. The error that we want to minimize is: This is why the method is called least squares. Simultaneous Equations Solver Python Tessshlo. As always, I encourage you to try to do as much of this on your own, but peek as much as you want for help. SymPy is written entirely in Python and does not require any external libraries. Yes, \footnotesize{\bold{Y_2}} is outside the column space of \footnotesize{\bold{X_2}}, BUT there is a projection of \footnotesize{\bold{Y_2}} back onto the column space of \footnotesize{\bold{X_2}} is simply \footnotesize{\bold{X_2 W_2^*}}. The system of equations are the following. There are times that we’d want an inverse matrix of a system for repeated uses of solving for X, but most of the time we simply need a single solution of X for a system of equations, and there is a method that allows us to solve directly for Xwhere we don’t need to know the inverse of the system matrix. The w_i‘s are our coefficients. Using the steps illustrated in the S matrix above, let’s start moving through the steps to solve for X. Also, the train_test_split is a method from the sklearn modules to use most of our data for training and some for testing. (row 3 of A_M)  –  1.0 * (row 1 of A_M)    (row 3 of B_M)  –  1.0 * (row 1 of B_M), 4. Let’s examine that using the next code block below. However, IF we were to cover all the linear algebra required to understand a pure linear algebraic derivation for least squares like the one below, we’d need a small textbook on linear algebra to do so. Block 2 looks at the data that we will use for fitting the model using a scatter plot. (row 1 of A_M)  –  -0.083 * (row 3 of A_M)    (row 1 of B_M)  –  -0.083 * (row 3 of B_M), 9. We scale the row with fd in it to 1/fd. We want to solve for \footnotesize{\bold{W}}, and \footnotesize{\bold{X^T Y}} uses known values. We’ll use python again, and even though the code is similar, it is a bit different. Click on the appropriate link for additional information and source code. As we perform those same steps on B, B will become the values of X. That is, we have more equations than unknowns, and therefore \footnotesize{ \bold{X}} has more rows than columns. If you carefully observe this fake data, you will notice that I have sought to exactly balance out the errors for all data pairs. Posted By: Carlo Bazzo May 20, 2019. Note that numpy:rank does not give you the matrix rank, but rather the number of dimensions of the array. Then, like before, we use pandas features to get the data into a dataframe and convert that into numpy versions of our X and Y data. But it should work for this too – correct? Solve System Of Linear Equations In Python W Numpy. When this is complete, A is an identity matrix, and B has become the solution for X. 1/7.2 * (row 2 of A_M)   and   1/7.2 * (row 2 of B_M), 5. However, it’s a testimony to python that solving a system of equations could be done with so little code. Both of these files are in the repo. However, there is an even greater advantage here. Using these helpful substitutions turns equations 1.13 and 1.14 into equations 1.15 and 1.16. Data Scientist, PhD multi-physics engineer, and python loving geek living in the United States. If you get stuck, take a peek. Again, to go through ALL the linear algebra for supporting this would require many posts on linear algebra. There are complementary .py files of each notebook if you don’t use Jupyter. Let’s consider the parts of the equation to the right of the summation separately for a moment. Thus, both sides of Equation 3.5 are now orthogonal compliments to the column space of \footnotesize{\bold{X_2}} as represented by equation 3.6. The matrix below is simply used to illustrate the steps to accomplish this procedure for any size “system of equations” when A has dimensions n\,x\,n. This is a conceptual overview. The next step is to apply calculus to find where the error E is minimized. There are multiple ways to solve such a system, such as Elimination of Variables, Cramer's Rule, Row Reduction Technique, and the Matrix Solution. Finally, let’s give names to our matrix and vectors. A simple and common real world example of linear regression would be Hooke’s law for coiled springs: If there were some other force in the mechanical circuit that was constant over time, we might instead have another term such as F_b that we could call the force bias. At the top of this loop, we scale fd rows using 1/fd. When we replace the \footnotesize{\hat{y}_i} with the rows of \footnotesize{\bold{X}} is when it becomes interesting. We’ll use python again, and even though the code is similar, it is a bit differ… The new set of equations would then be the following. Please clone the code in the repository and experiment with it and rewrite it in your own style. I wouldn’t use it. As we go thru the math, see if you can complete the derivation on your own. The difference in this section is that we are solving for multiple \footnotesize{m}‘s (i.e. Pure python without numpy or scipy math to simple matrix inversion in solve linear equations you regression with and code instructions write a solving system of Data Scientist, PhD multi-physics engineer, and python loving geek living in the United States. We now do similar operations to find m. Let’s multiply equation 1.15 by N and equation 1.16 by U and subtract the later from the former as shown next. Pycse Python3 Comtions In Science And Engineering. We do this by minimizing …. These steps are essentially identical to the steps presented in the matrix inversion post. I hope that you find them useful. This file is in the repo for this post and is named LeastSquaresPractice_4.py. These errors will be minimized when the partial derivatives in equations 1.10 and 1.12 are “0”. In this post, we create a clustering algorithm class that uses the same principles as scipy, or sklearn, but without using sklearn or numpy or scipy. 2x + 5y - z = 27. In this post, we create a clustering algorithm class that uses the same principles as scipy, or sklearn, but without using sklearn or numpy or scipy. We will be going thru the derivation of least squares using 3 different approaches: LibreOffice Math files (LibreOffice runs on Linux, Windows, and MacOS) are stored in the repo for this project with an odf extension. That is …. We also haven’t talked about pandas yet. Let’s recap where we’ve come from (in order of need, but not in chronological order) to get to this point with our own tools: We’ll be using the tools developed in those posts, and the tools from those posts will make our coding work in this post quite minimal and easy. The data has some inputs in text format. Now let’s use the chain rule on E using a also. And that system has output data that can be measured. Thus, equation 2.7b brought us to a point of being able to solve for a system of equations using what we’ve learned before. However, the math, depending on how deep you want to go, is substantial. If our set of linear equations has constraints that are deterministic, we can represent the problem as matrices and apply matrix algebra. Considering the operations in equation 2.7a, the left and right both have dimensions for our example of \footnotesize{3x1}. Since we are looking for values of \footnotesize{\bold{W}} that minimize the error of equation 1.5, we are looking for where \frac{\partial E}{\partial w_j} is 0. numpy.linalg.solve¶ linalg.solve (a, b) [source] ¶ Solve a linear matrix equation, or system of linear scalar equations. (row 2 of A_M)  –  3.0 * (row 1 of A_M)    (row 2 of B_M)  –  3.0 * (row 1 of B_M), 3. Here is an example of a system of linear equations with two unknown variables, x and y: Equation 1: To solve the above system of linear equations, we need to find the values of the x and yvariables. If you know basic calculus rules such as partial derivatives and the chain rule, you can derive this on your own. Where do we go from here? Wikipedia defines a system of linear equationsas: The ultimate goal of solving a system of linear equations is to find the values of the unknown variables. The fewest lines of code are rarely good code. Is there yet another way to derive a least squares solution? Also, we know that numpy or scipy or sklearn modules could be used, but we want to see how to solve for X in a system of equations without using any of them, because this post, like most posts on this site, is about understanding the principles from math to complete code. Let’s walk through this code and then look at the output. Understanding this will be very important to discussions in upcoming posts when all the dimensions are not necessarily independent, and then we need to find ways to constructively eliminate input columns that are not independent from one of more of the other columns. Wait! Install Learn Introduction New to TensorFlow? There’s one other practice file called LeastSquaresPractice_5.py that imports preconditioned versions of the data from conditioned_data.py. I’d like to do that someday too, but if you can accept equation 3.7 at a high level, and understand the vector differences that we did above, you are in a good place for understanding this at a first pass. A detailed overview with numbers will be performed soon. That is we want find a model that passes through the data with the least of the squares of the errors. We’re only using it here to include 1’s in the last column of the inputs for the same reasons as explained recently above. Example. numpy.linalg.solve¶ numpy.linalg.solve(a, b) [source] ¶ Solve a linear matrix equation, or system of linear scalar equations. Next we enter the for loop for the fd‘s. Block 1 does imports. We then fit the model using the training data and make predictions with our test data. Then just return those coefficients for use. Published by Thom Ives on December 16, 2018December 16, 2018. I do hope, at some point in your career, that you can take the time to satisfy yourself more deeply with some of the linear algebra that we’ll go over. Solving Ordinary Diffeial Equations. Computes the “exact” solution, x, of the well-determined, i.e., full rank, linear matrix equation ax = b. OK. That worked, but will it work for more than one set of inputs? Consider a typical system of equations, such as: We want to solve for X, so we perform row operations on A that drive it to an identity matrix. Sympy is able to solve a large part of polynomial equations, and is also capable of solving multiple equations with respect to multiple variables giving a tuple as second argument. Statement: Solve the system of linear equations using Cramer's Rule in Python with the numpy module (it is suggested to confirm with hand calculations): +3y +2=4 2.r - 6y - 3z = 10 43 - 9y + 3z = 4 Solution: Considering the following linear equations − x + y + z = 6. Section 4 is where the machine learning is performed. After reviewing the code below, you will see that sections 1 thru 3 merely prepare the incoming data to be in the right format for the least squares steps in section 4, which is merely 4 lines of code. In case you weren’t aware, when we multiply one matrix on another, this transforms the right matrix into the space of the left matrix. The APMonitor Modeling Language with a Python interface is optimization software for mixed-integer and differential algebraic equations. the code below is stored in the repo as System_of_Eqns_WITH_Numpy-Scipy.py. The subtraction above results in a vector sticking out perpendicularly from the \footnotesize{\bold{X_2}} column space. Consider the next section if you want. Computes the “exact” solution, x, of the well-determined, i.e., full rank, linear matrix equation ax = b. Parameters We still want to minimize the same error as was shown above in equation 1.5, which is repeated here next. At this point, I will allow the comments in the code above to explain what each block of code does. To do this you use the solve() command: >>> solution = sym. When we have two input dimensions and the output is a third dimension, this is visible. numpy documentation: Solve linear systems with np.solve. If you did all the work on your own after reading the high level description of the math steps, congratulations! \footnotesize{\bold{W}} is \footnotesize{3x1}. Python solve linear equations you solving a system of in pure without numpy or scipy integrated machine learning and artificial intelligence with gaussian elimination martin thoma solved the following set using s chegg com algebra w symbolic maths tutorial linux hint systems Python Solve Linear Equations You Solving A System Of Equations In Pure Python Without Numpy Or… Read More » If we used the nth column, we’d create a linear dependency (colinearity), and then our columns for the encoded variables would not be orthogonal as discussed in the previous post. Therefore, we want to find a reliable way to find m and b that will cause our line equation to pass through the data points with as little error as possible. These operations continue from left to right on matrices A and B. 1/5.0 * (row 1 of A_M)   and   1/5.0 * (row 1 of B_M), 2. At the top portion of the code, copies of A and B are saved for later use, and we save A‘s square dimension for later use. Those previous posts were essential for this post and the upcoming posts. This tutorial is an introduction to solving linear equations with Python. The next nested for loop calculates (current row) – (row with fd) * (element in current row and column of fd) for matrices A and B . How to do gradient descent in python without numpy or scipy. This work could be accomplished in as few as 10 – 12 lines of python. However, near the end of the post, there is a section that shows how to solve for X in a system of equations using numpy / scipy. When have an exact number of equations for the number of unknowns, we say that \footnotesize{\bold{Y_1}} is in the column space of \footnotesize{\bold{X_1}}. \footnotesize{\bold{X^T X}} is a square matrix. Let’s use equation 3.7 on the right side of equation 3.6. It’s a worthy study though. Why do we focus on the derivation for least squares like this? If you’ve been through the other blog posts and played with the code (and even made it your own, which I hope you have done), this part of the blog post will seem fun. You don’t even need least squares to do this one. At the end of the procedure, A equals an identity matrix, and B has become the solution for B. We then used the test data to compare the pure python least squares tools to sklearn’s linear regression tool that used least squares, which, as you saw previously, matched to reasonable tolerances. Applying Polynomial Features to Least Squares Regression using Pure Python without Numpy or Scipy, AX=B,\hspace{5em}\begin{bmatrix}a_{11}&a_{12}&a_{13}\\ a_{11}&a_{12}&a_{13}\\ a_{11}&a_{12}&a_{13}\end{bmatrix} \begin{bmatrix}x_{11}\\ x_{21}\\x_{31}\end{bmatrix}= \begin{bmatrix}b_{11}\\ b_{21}\\b_{31}\end{bmatrix}, IX=B_M,\hspace{5em}\begin{bmatrix}1&0&0\\0&1&0\\ 0&0&1\end{bmatrix} \begin{bmatrix}x_{11}\\ x_{21}\\x_{31}\end{bmatrix}= \begin{bmatrix}bm_{11}\\ bm_{21}\\bm_{31}\end{bmatrix}, S = \begin{bmatrix}S_{11}&\dots&\dots&S_{k2} &\dots&\dots&S_{n2}\\S_{12}&\dots&\dots&S_{k3} &\dots&\dots &S_{n3}\\\vdots& & &\vdots & & &\vdots\\ S_{1k}&\dots&\dots&S_{k1} &\dots&\dots &S_{nk}\\ \vdots& & &\vdots & & &\vdots\\S_{1 n-1}&\dots&\dots&S_{k n-1} &\dots&\dots &S_{n n-1}\\ S_{1n}&\dots&\dots&S_{kn} &\dots&\dots &S_{n1}\\\end{bmatrix}, A=\begin{bmatrix}5&3&1\\3&9&4\\1&3&5\end{bmatrix},\hspace{5em}B=\begin{bmatrix}9\\16\\9\end{bmatrix}, A_M=\begin{bmatrix}5&3&1\\3&9&4\\1&3&5\end{bmatrix},\hspace{4em}B_M=\begin{bmatrix}9\\16\\9\end{bmatrix}, A_M=\begin{bmatrix}1&0.6&0.2\\3&9&4\\1&3&5\end{bmatrix},\hspace{4em}B_M=\begin{bmatrix}1.8\\16\\9\end{bmatrix}, A_M=\begin{bmatrix}1&0.6&0.2\\0&7.2&3.4\\1&3&5\end{bmatrix},\hspace{4em}B_M=\begin{bmatrix}1.8\\10.6\\9\end{bmatrix}, A_M=\begin{bmatrix}1&0.6&0.2\\0&7.2&3.4\\0&2.4&4.8\end{bmatrix},\hspace{4em}B_M=\begin{bmatrix}1.8\\10.6\\7.2\end{bmatrix}, A_M=\begin{bmatrix}1&0.6&0.2\\0&1&0.472\\0&2.4&4.8\end{bmatrix},\hspace{4em}B_M=\begin{bmatrix}1.8\\1.472\\7.2\end{bmatrix}, A_M=\begin{bmatrix}1&0&-0.083\\0&1&0.472\\0&2.4&4.8\end{bmatrix},\hspace{4em}B_M=\begin{bmatrix}0.917\\1.472\\7.2\end{bmatrix}, A_M=\begin{bmatrix}1&0&-0.083\\0&1&0.472\\0&0&3.667\end{bmatrix},\hspace{4em}B_M=\begin{bmatrix}0.917\\1.472\\3.667\end{bmatrix}, A_M=\begin{bmatrix}1&0&-0.083\\0&1&0.472\\0&0&1\end{bmatrix},\hspace{4em}B_M=\begin{bmatrix}0.917\\1.472\\1\end{bmatrix}, A_M=\begin{bmatrix}1&0&0\\0&1&0.472\\0&0&1\end{bmatrix},\hspace{4em}B_M=\begin{bmatrix}1\\1.472\\1\end{bmatrix}, A_M=\begin{bmatrix}1&0&0\\0&1&0\\0&0&1\end{bmatrix},\hspace{4em}B_M=\begin{bmatrix}1\\1\\1\end{bmatrix}. Realize that we went through all that just to show why we could get away with multiplying both sides of the lower left equation in equations 3.2 by \footnotesize{\bold{X_2^T}}, like we just did above in the lower equation of equations 3.9, to change the not equal in equations 3.2 to an equal sign? (row 2 of A_M)  –  0.472 * (row 3 of A_M)    (row 2 of B_M)  –  0.472 * (row 3 of B_M). In this art… In this Python Programming video tutorial you will learn how to solve linear equation using NumPy linear algebra module in detail. Solves systems of linear equations. However, it’s only 4 lines, because the previous tools that we’ve made enable this. Let’s create some short handed versions of some of our terms. The output is shown in figure 2 below. Starting from equations 1.13 and 1.14, let’s make some substitutions to make our algebraic lives easier. The first nested for loop works on all the rows of A besides the one holding fd. Now we do similar steps for \frac{\partial E}{\partial b} by applying the chain rule. The numpy.linalg.solve() function gives the solution of linear equations in the matrix form.. A \cdot B_M should be B and it is! Published by Thom Ives on December 3, 2018December 3, 2018, Find the complimentary System Of Equations project on GitHub. A \cdot B_M = A \cdot X =B=\begin{bmatrix}9\\16\\9\end{bmatrix},\hspace{4em}YES! When solving linear equations, we can represent them in matrix form. Our starting matrices, A and B, are copied, code wise, to A_M and B_M to preserve A and B for later use. Computes the “exact” solution, x, of the well-determined, i.e., full rank, linear matrix equation ax = b. Parameters a (…, M, M) array_like. In a previous article, we looked at solving an LP problem, i.e. a system of linear equations with inequality constraints. You’ve now seen the derivation of least squares for single and multiple input variables using calculus to minimize an error function (or in other words, an objective function – our objective being to minimize the error). With the tools created in the previous posts (chronologically speaking), we’re finally at a point to discuss our first serious machine learning tool starting from the foundational linear algebra all the way to complete python code. This post covers solving a system of equations from math to complete code, and it’s VERY closely related to the matrix inversion post. It could be done without doing this, but it would simply be more work, and the same solution is achieved more simply with this simplification. When the dimensionality of our problem goes beyond two input variables, just remember that we are now seeking solutions to a space that is difficult, or usually impossible, to visualize, but that the values in each column of our system matrix, like \footnotesize{\bold{A_1}}, represent the full record of values for each dimension of our system including the bias (y intercept or output value when all inputs are 0). There’s a lot of good work and careful planning and extra code to support those great machine learning modules AND data visualization modules and tools. This post covers solving a system of equations from math to complete code, and it’s VERY closely related to the matrix inversion post. All that is left is to algebraically isolate b. In all of the code blocks below for testing, we are importing LinearAlgebraPurePython.py. Here we find the solution to the above set of equations in Python using NumPy's numpy.linalg.solve() function. 2y + 5z = -4. It’s my hope that you found this post insightful and helpful. The x_{ij}‘s above are our inputs. First, let’s review the linear algebra that illustrates a system of equations. Now, let’s produce some fake data that necessitates using a least squares approach. AND we could have gone through a lot more linear algebra to prove equation 3.7 and more, but there is a serious amount of extra work to do that. Consider AX=B, where we need to solve for X . Now, let’s arrange equations 3.1a into matrix and vector formats. We’ll cover pandas in detail in future posts. (row 3 of A_M)  –  2.4 * (row 2 of A_M)    (row 3 of B_M)  –  2.4 * (row 2 of B_M), 7. Understanding the derivation is still better than not seeking to understand it. Python's numerical library NumPy has a function numpy.linalg.solve() which solves a linear matrix equation, or system of linear scalar equation. We have a real world system susceptible to noisy input data. Solving linear equations using matrices and Python TOPICS: Analytics EN Python. Let’s do similar steps for \frac{\partial E}{\partial b} by setting equation 1.12 to “0”. The first step for each column is to scale the row that has the fd in it by 1/fd. Suppose that we needed to solve the following integrodifferential equation on the square $$[0,1]\times[0,1]$$: $\nabla^2 P = 10 \left(\int_0^1\int_0^1\cosh(P)\,dx\,dy\right)^2$ with $$P(x,1) = 1$$ and $$P=0$$ elsewhere on the boundary of the square. That’s right. multiple slopes). Let’s substitute \hat y with mx_i+b and use calculus to reduce this error. This blog’s work of exploring how to make the tools ourselves IS insightful for sure, BUT it also makes one appreciate all of those great open source machine learning tools out there for Python (and spark, and th… Since I have done this before, I am going to ask you to trust me with a simplification up front. Let’s revert T, U, V and W back to the terms that they replaced. We will look at matrix form along with the equations written out as we go through this to keep all the steps perfectly clear for those that aren’t as versed in linear algebra (or those who know it, but have cold memories on it – don’t we all sometimes). Develop libraries for array computing, recreating NumPy's foundational concepts. Section 1 simply converts any 1 dimensional (1D) arrays to 2D arrays to be compatible with our tools. The solution method is a set of steps, S, focusing on one column at a time. Now here’s a spoiler alert. Here, due to the oversampling that we have done to compensate for errors in our data (we’d of course like to collect many more data points that this), there is no solution for a \footnotesize{\bold{W_2}} that will yield exactly \footnotesize{\bold{Y_2}}, and therefore \footnotesize{\bold{Y_2}} is not in the column space of \footnotesize{\bold{X_2}}. The noisy inputs, the system itself, and the measurement methods cause errors in the data. Then we algebraically isolate m as shown next. numpy.linalg.solve¶ numpy.linalg.solve (a, b) [source] ¶ Solve a linear matrix equation, or system of linear scalar equations. The code in python employing these methods is shown in a Jupyter notebook called SystemOfEquationsStepByStep.ipynb in the repo. Let’s look at the 3D output for this toy example in figure 3 below, which uses fake and well balanced output data for easy visualization of the least squares fitting concept. We’ll even throw in some visualizations finally. You’ll know when a bias in included in a system matrix, because one column (usually the first or last column) will be all 1’s. The only variables that we must keep visible after these substitutions are m and b. If not, don’t feel bad. Figure 1 shows our plot. In testing, we compare our predictions from the model that was fit to the actual outputs in the test set to determine how well our model is predicting. This is great! 1/3.667 * (row 3 of A_M)   and   1/3.667 * (row 3 of B_M), 8. We will cover linear dependency soon too. And to make the denominator match that of equation 1.17, we simply multiply the above equation by 1 in the form of \frac{-1}{-1}. Section 2 is further making sure that our data is formatted appropriately – we want more rows than columns. Let’s cover the differences. Without using (import numpy) as np and (import sys) To understand and gain insights. Computes the “exact” solution, x, of the well-determined, i.e., full rank, linear matrix equation ax = b. That’s just two points. The actual data points are x and y, and measured values for y will likely have small errors. The simplification is to help us when we move this work into matrix and vector formats. I hope the amount that is presented in this post will feel adequate for our task and will give you some valuable insights. Linear and nonlinear equations can also be solved with Excel and MATLAB. With the tools created in the previous posts (chronologically speaking), we’re finally at a point to discuss our first serious machine learning tool starting from the foundational linear algebra all the way to complete python code. The we simply use numpy.linalg.solve to get the solution. Check out Integrated Machine Learning & AI coming soon to YouTube. Therefore, B_M morphed into X. In this video I go over two methods of solving systems of linear equations in python. I wanted to solve a triplet of simultaneous equations with python. We’ll only need to add a small amount of extra tooling to complete the least squares machine learning tool. 1. With one simple line of Python code, following lines to import numpy and define our matrices, we can get a solution for X. We work with columns from left to right, and work to change each element of each column to a 1 if it’s on the diagonal, and to 0 if it’s not on the diagonal. Instead, we are importing the LinearRegression class from the sklearn.linear_model module. Computes the “exact” solution, x, of the well-determined, i.e., full rank, linear matrix equation ax = b. So there’s a separate GitHub repository for this project. Linear equations such as A*x=b are solved with NumPy in Python. The steps to solve the system of linear equations with np.linalg.solve () are below: Create NumPy array A as a 3 by 3 array of the coefficients Create a NumPy array b as the right-hand side of the equations Solve for the values of x x, y y and z z using np.linalg.solve (A, b). In the future, we’ll sometimes use the material from this as a launching point for other machine learning posts. However, there is a way to find a \footnotesize{\bold{W^*}} that minimizes the error to \footnotesize{\bold{Y_2}} as \footnotesize{\bold{X_2 W^*}} passes thru the column space of \footnotesize{\bold{X_2}}.