日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

机器学习知识点(十九)矩阵特征值分解基础知识及Java实现

發(fā)布時間:2025/4/16 java 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习知识点(十九)矩阵特征值分解基础知识及Java实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、特征值分解基礎(chǔ)知識

矩陣乘法Y=AB的數(shù)學意義在于變換,以其中一個向量A為中心,則B的作用主要是使A發(fā)生伸縮或旋轉(zhuǎn)變換。一個矩陣其實就是一個線性變換,因為一個矩陣乘以一個向量后得到的向量,其實就相當于將這個向量進行了線性變換。

如果說一個向量v是方陣A的特征向量,將一定可以表示成下面的形式:


??? 這時候λ就被稱為特征向量v對應(yīng)的特征值,一個矩陣的一組特征向量是一組正交向量。特征值分解是將一個矩陣分解成下面的形式:


其中Q是這個矩陣A的特征向量組成的矩陣,Σ是一個對角陣,每一個對角線上的元素就是一個特征值。一個變換方陣的所有特征向量組成了這個變換矩陣的一組基。所謂基,可以理解為坐標系的軸。平常用到直角坐標系,在線性代數(shù)中可以把這個坐標系扭曲、拉伸、旋轉(zhuǎn),稱為基變換。可以按需求去設(shè)定基,但是基的軸之間必須是線性無關(guān)的,也就是保證坐標系的不同軸不要指向同一個方向或可以被別的軸組合而成。從線性空間的角度看,在一個定義了內(nèi)積的線性空間里,對一個N階對稱方陣進行特征分解,就是產(chǎn)生了該空間的N個標準正交基,然后把矩陣投影到這N個基上。N個特征向量就是N個標準正交基,而特征值的模則代表矩陣在每個基上的投影長度。特征值越大,說明矩陣在對應(yīng)的特征向量上的方差越大,功率越大,信息量越多。不過,特征值分解也有很多的局限,比如說變換的矩陣必須是方陣。

機器學習特征提取中,意思就是最大特征值對應(yīng)的特征向量方向上包含最多的信息量,如果某幾個特征值很小,說明這幾個方向信息量很小,可以用來降維,也就是刪除小特征值對應(yīng)方向的數(shù)據(jù),只保留大特征值方向?qū)?yīng)的數(shù)據(jù),這樣做以后數(shù)據(jù)量減小,但有用信息量變化不大,PCA降維就是基于這種思路。特征值分解可以得到特征值與特征向量,特征值表示的是這個特征到底有多重要,而特征向量表示這個特征是什么,可以將每一個特征向量理解為一個線性的子空間。

2、Java實現(xiàn)

http://math.nist.gov/javanumerics/jama/Java矩陣計算包,下載Jama-1.0.3.jar引入工程。

下載Jama-1.0.3.zip研究源碼。

1)? 特征值分解測試類

?

package sk.ml;import Jama.EigenvalueDecomposition; import Jama.Matrix;public class QRTest {//矩陣特征分解public static void main(String argv[]){double[] columnwise = {1.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.,12.};Matrix A = new Matrix(columnwise,4);//構(gòu)造矩陣A.print(A.getColumnDimension(), A.getRowDimension());EigenvalueDecomposition Eig = A.eig();Matrix D = Eig.getD();Matrix V = Eig.getV();D.print(D.getColumnDimension(), D.getRowDimension());//打印特征值V.print(V.getColumnDimension(), V.getRowDimension());//打印特征向量} }

?

2)? 源碼參考Matrix

?

package Jama;import java.text.NumberFormat; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Locale; import java.text.FieldPosition; import java.io.PrintWriter; import java.io.BufferedReader; import java.io.StreamTokenizer; import Jama.util.*;/**Jama = Java Matrix class. <P>The Java Matrix Class provides the fundamental operations of numericallinear algebra. Various constructors create Matrices from two dimensionalarrays of double precision floating point numbers. Various "gets" and"sets" provide access to submatrices and matrix elements. Several methods implement basic matrix arithmetic, including matrix addition andmultiplication, matrix norms, and element-by-element array operations.Methods for reading and printing matrices are also included. All theoperations in this version of the Matrix Class involve real matrices.Complex matrices may be handled in a future version. <P>Five fundamental matrix decompositions, which consist of pairs or triplesof matrices, permutation vectors, and the like, produce results in fivedecomposition classes. These decompositions are accessed by the Matrixclass to compute solutions of simultaneous linear equations, determinants,inverses and other matrix functions. The five decompositions are: <P><UL><LI>Cholesky Decomposition of symmetric, positive definite matrices.<LI>LU Decomposition of rectangular matrices.<LI>QR Decomposition of rectangular matrices.<LI>Singular Value Decomposition of rectangular matrices.<LI>Eigenvalue Decomposition of both symmetric and nonsymmetric square matrices. </UL> <DL> <DT><B>Example of use:</B></DT> <P> <DD>Solve a linear system A x = b and compute the residual norm, ||b - A x||. <P><PRE>double[][] vals = {{1.,2.,3},{4.,5.,6.},{7.,8.,10.}};Matrix A = new Matrix(vals);Matrix b = Matrix.random(3,1);Matrix x = A.solve(b);Matrix r = A.times(x).minus(b);double rnorm = r.normInf(); </PRE></DD> </DL>@author The MathWorks, Inc. and the National Institute of Standards and Technology. @version 5 August 1998 */public class Matrix implements Cloneable, java.io.Serializable {/* ------------------------Class variables* ------------------------ *//** Array for internal storage of elements.@serial internal array storage.*/private double[][] A;/** Row and column dimensions.@serial row dimension.@serial column dimension.*/private int m, n;/* ------------------------Constructors* ------------------------ *//** Construct an m-by-n matrix of zeros. @param m Number of rows.@param n Number of colums.*/public Matrix (int m, int n) {this.m = m;this.n = n;A = new double[m][n];}/** Construct an m-by-n constant matrix.@param m Number of rows.@param n Number of colums.@param s Fill the matrix with this scalar value.*/public Matrix (int m, int n, double s) {this.m = m;this.n = n;A = new double[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {A[i][j] = s;}}}/** Construct a matrix from a 2-D array.@param A Two-dimensional array of doubles.@exception IllegalArgumentException All rows must have the same length@see #constructWithCopy*/public Matrix (double[][] A) {m = A.length;n = A[0].length;for (int i = 0; i < m; i++) {if (A[i].length != n) {throw new IllegalArgumentException("All rows must have the same length.");}}this.A = A;}/** Construct a matrix quickly without checking arguments.@param A Two-dimensional array of doubles.@param m Number of rows.@param n Number of colums.*/public Matrix (double[][] A, int m, int n) {this.A = A;this.m = m;this.n = n;}/** Construct a matrix from a one-dimensional packed array@param vals One-dimensional array of doubles, packed by columns (ala Fortran).@param m Number of rows.@exception IllegalArgumentException Array length must be a multiple of m.*/public Matrix (double vals[], int m) {this.m = m;n = (m != 0 ? vals.length/m : 0);if (m*n != vals.length) {throw new IllegalArgumentException("Array length must be a multiple of m.");}A = new double[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {A[i][j] = vals[i+j*m];}}}/* ------------------------Public Methods* ------------------------ *//** Construct a matrix from a copy of a 2-D array.@param A Two-dimensional array of doubles.@exception IllegalArgumentException All rows must have the same length*/public static Matrix constructWithCopy(double[][] A) {int m = A.length;int n = A[0].length;Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {if (A[i].length != n) {throw new IllegalArgumentException("All rows must have the same length.");}for (int j = 0; j < n; j++) {C[i][j] = A[i][j];}}return X;}/** Make a deep copy of a matrix*/public Matrix copy () {Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = A[i][j];}}return X;}/** Clone the Matrix object.*/public Object clone () {return this.copy();}/** Access the internal two-dimensional array.@return Pointer to the two-dimensional array of matrix elements.*/public double[][] getArray () {return A;}/** Copy the internal two-dimensional array.@return Two-dimensional array copy of matrix elements.*/public double[][] getArrayCopy () {double[][] C = new double[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = A[i][j];}}return C;}/** Make a one-dimensional column packed copy of the internal array.@return Matrix elements packed in a one-dimensional array by columns.*/public double[] getColumnPackedCopy () {double[] vals = new double[m*n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {vals[i+j*m] = A[i][j];}}return vals;}/** Make a one-dimensional row packed copy of the internal array.@return Matrix elements packed in a one-dimensional array by rows.*/public double[] getRowPackedCopy () {double[] vals = new double[m*n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {vals[i*n+j] = A[i][j];}}return vals;}/** Get row dimension.@return m, the number of rows.*/public int getRowDimension () {return m;}/** Get column dimension.@return n, the number of columns.*/public int getColumnDimension () {return n;}/** Get a single element.@param i Row index.@param j Column index.@return A(i,j)@exception ArrayIndexOutOfBoundsException*/public double get (int i, int j) {return A[i][j];}/** Get a submatrix.@param i0 Initial row index@param i1 Final row index@param j0 Initial column index@param j1 Final column index@return A(i0:i1,j0:j1)@exception ArrayIndexOutOfBoundsException Submatrix indices*/public Matrix getMatrix (int i0, int i1, int j0, int j1) {Matrix X = new Matrix(i1-i0+1,j1-j0+1);double[][] B = X.getArray();try {for (int i = i0; i <= i1; i++) {for (int j = j0; j <= j1; j++) {B[i-i0][j-j0] = A[i][j];}}} catch(ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("Submatrix indices");}return X;}/** Get a submatrix.@param r Array of row indices.@param c Array of column indices.@return A(r(:),c(:))@exception ArrayIndexOutOfBoundsException Submatrix indices*/public Matrix getMatrix (int[] r, int[] c) {Matrix X = new Matrix(r.length,c.length);double[][] B = X.getArray();try {for (int i = 0; i < r.length; i++) {for (int j = 0; j < c.length; j++) {B[i][j] = A[r[i]][c[j]];}}} catch(ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("Submatrix indices");}return X;}/** Get a submatrix.@param i0 Initial row index@param i1 Final row index@param c Array of column indices.@return A(i0:i1,c(:))@exception ArrayIndexOutOfBoundsException Submatrix indices*/public Matrix getMatrix (int i0, int i1, int[] c) {Matrix X = new Matrix(i1-i0+1,c.length);double[][] B = X.getArray();try {for (int i = i0; i <= i1; i++) {for (int j = 0; j < c.length; j++) {B[i-i0][j] = A[i][c[j]];}}} catch(ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("Submatrix indices");}return X;}/** Get a submatrix.@param r Array of row indices.@param j0 Initial column index@param j1 Final column index@return A(r(:),j0:j1)@exception ArrayIndexOutOfBoundsException Submatrix indices*/public Matrix getMatrix (int[] r, int j0, int j1) {Matrix X = new Matrix(r.length,j1-j0+1);double[][] B = X.getArray();try {for (int i = 0; i < r.length; i++) {for (int j = j0; j <= j1; j++) {B[i][j-j0] = A[r[i]][j];}}} catch(ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("Submatrix indices");}return X;}/** Set a single element.@param i Row index.@param j Column index.@param s A(i,j).@exception ArrayIndexOutOfBoundsException*/public void set (int i, int j, double s) {A[i][j] = s;}/** Set a submatrix.@param i0 Initial row index@param i1 Final row index@param j0 Initial column index@param j1 Final column index@param X A(i0:i1,j0:j1)@exception ArrayIndexOutOfBoundsException Submatrix indices*/public void setMatrix (int i0, int i1, int j0, int j1, Matrix X) {try {for (int i = i0; i <= i1; i++) {for (int j = j0; j <= j1; j++) {A[i][j] = X.get(i-i0,j-j0);}}} catch(ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("Submatrix indices");}}/** Set a submatrix.@param r Array of row indices.@param c Array of column indices.@param X A(r(:),c(:))@exception ArrayIndexOutOfBoundsException Submatrix indices*/public void setMatrix (int[] r, int[] c, Matrix X) {try {for (int i = 0; i < r.length; i++) {for (int j = 0; j < c.length; j++) {A[r[i]][c[j]] = X.get(i,j);}}} catch(ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("Submatrix indices");}}/** Set a submatrix.@param r Array of row indices.@param j0 Initial column index@param j1 Final column index@param X A(r(:),j0:j1)@exception ArrayIndexOutOfBoundsException Submatrix indices*/public void setMatrix (int[] r, int j0, int j1, Matrix X) {try {for (int i = 0; i < r.length; i++) {for (int j = j0; j <= j1; j++) {A[r[i]][j] = X.get(i,j-j0);}}} catch(ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("Submatrix indices");}}/** Set a submatrix.@param i0 Initial row index@param i1 Final row index@param c Array of column indices.@param X A(i0:i1,c(:))@exception ArrayIndexOutOfBoundsException Submatrix indices*/public void setMatrix (int i0, int i1, int[] c, Matrix X) {try {for (int i = i0; i <= i1; i++) {for (int j = 0; j < c.length; j++) {A[i][c[j]] = X.get(i-i0,j);}}} catch(ArrayIndexOutOfBoundsException e) {throw new ArrayIndexOutOfBoundsException("Submatrix indices");}}/** Matrix transpose.@return A'*/public Matrix transpose () {Matrix X = new Matrix(n,m);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[j][i] = A[i][j];}}return X;}/** One norm@return maximum column sum.*/public double norm1 () {double f = 0;for (int j = 0; j < n; j++) {double s = 0;for (int i = 0; i < m; i++) {s += Math.abs(A[i][j]);}f = Math.max(f,s);}return f;}/** Two norm@return maximum singular value.*/public double norm2 () {return (new SingularValueDecomposition(this).norm2());}/** Infinity norm@return maximum row sum.*/public double normInf () {double f = 0;for (int i = 0; i < m; i++) {double s = 0;for (int j = 0; j < n; j++) {s += Math.abs(A[i][j]);}f = Math.max(f,s);}return f;}/** Frobenius norm@return sqrt of sum of squares of all elements.*/public double normF () {double f = 0;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {f = Maths.hypot(f,A[i][j]);}}return f;}/** Unary minus@return -A*/public Matrix uminus () {Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = -A[i][j];}}return X;}/** C = A + B@param B another matrix@return A + B*/public Matrix plus (Matrix B) {checkMatrixDimensions(B);Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = A[i][j] + B.A[i][j];}}return X;}/** A = A + B@param B another matrix@return A + B*/public Matrix plusEquals (Matrix B) {checkMatrixDimensions(B);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {A[i][j] = A[i][j] + B.A[i][j];}}return this;}/** C = A - B@param B another matrix@return A - B*/public Matrix minus (Matrix B) {checkMatrixDimensions(B);Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = A[i][j] - B.A[i][j];}}return X;}/** A = A - B@param B another matrix@return A - B*/public Matrix minusEquals (Matrix B) {checkMatrixDimensions(B);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {A[i][j] = A[i][j] - B.A[i][j];}}return this;}/** Element-by-element multiplication, C = A.*B@param B another matrix@return A.*B*/public Matrix arrayTimes (Matrix B) {checkMatrixDimensions(B);Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = A[i][j] * B.A[i][j];}}return X;}/** Element-by-element multiplication in place, A = A.*B@param B another matrix@return A.*B*/public Matrix arrayTimesEquals (Matrix B) {checkMatrixDimensions(B);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {A[i][j] = A[i][j] * B.A[i][j];}}return this;}/** Element-by-element right division, C = A./B@param B another matrix@return A./B*/public Matrix arrayRightDivide (Matrix B) {checkMatrixDimensions(B);Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = A[i][j] / B.A[i][j];}}return X;}/** Element-by-element right division in place, A = A./B@param B another matrix@return A./B*/public Matrix arrayRightDivideEquals (Matrix B) {checkMatrixDimensions(B);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {A[i][j] = A[i][j] / B.A[i][j];}}return this;}/** Element-by-element left division, C = A.\B@param B another matrix@return A.\B*/public Matrix arrayLeftDivide (Matrix B) {checkMatrixDimensions(B);Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = B.A[i][j] / A[i][j];}}return X;}/** Element-by-element left division in place, A = A.\B@param B another matrix@return A.\B*/public Matrix arrayLeftDivideEquals (Matrix B) {checkMatrixDimensions(B);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {A[i][j] = B.A[i][j] / A[i][j];}}return this;}/** Multiply a matrix by a scalar, C = s*A@param s scalar@return s*A*/public Matrix times (double s) {Matrix X = new Matrix(m,n);double[][] C = X.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {C[i][j] = s*A[i][j];}}return X;}/** Multiply a matrix by a scalar in place, A = s*A@param s scalar@return replace A by s*A*/public Matrix timesEquals (double s) {for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {A[i][j] = s*A[i][j];}}return this;}/** Linear algebraic matrix multiplication, A * B@param B another matrix@return Matrix product, A * B@exception IllegalArgumentException Matrix inner dimensions must agree.*/public Matrix times (Matrix B) {if (B.m != n) {throw new IllegalArgumentException("Matrix inner dimensions must agree.");}Matrix X = new Matrix(m,B.n);double[][] C = X.getArray();double[] Bcolj = new double[n];for (int j = 0; j < B.n; j++) {for (int k = 0; k < n; k++) {Bcolj[k] = B.A[k][j];}for (int i = 0; i < m; i++) {double[] Arowi = A[i];double s = 0;for (int k = 0; k < n; k++) {s += Arowi[k]*Bcolj[k];}C[i][j] = s;}}return X;}/** LU Decomposition@return LUDecomposition@see LUDecomposition*/public LUDecomposition lu () {return new LUDecomposition(this);}/** QR Decomposition@return QRDecomposition@see QRDecomposition*/public QRDecomposition qr () {return new QRDecomposition(this);}/** Cholesky Decomposition@return CholeskyDecomposition@see CholeskyDecomposition*/public CholeskyDecomposition chol () {return new CholeskyDecomposition(this);}/** Singular Value Decomposition@return SingularValueDecomposition@see SingularValueDecomposition*/public SingularValueDecomposition svd () {return new SingularValueDecomposition(this);}/** Eigenvalue Decomposition@return EigenvalueDecomposition@see EigenvalueDecomposition*/public EigenvalueDecomposition eig () {return new EigenvalueDecomposition(this);}/** Solve A*X = B@param B right hand side@return solution if A is square, least squares solution otherwise*/public Matrix solve (Matrix B) {return (m == n ? (new LUDecomposition(this)).solve(B) :(new QRDecomposition(this)).solve(B));}/** Solve X*A = B, which is also A'*X' = B'@param B right hand side@return solution if A is square, least squares solution otherwise.*/public Matrix solveTranspose (Matrix B) {return transpose().solve(B.transpose());}/** Matrix inverse or pseudoinverse@return inverse(A) if A is square, pseudoinverse otherwise.*/public Matrix inverse () {return solve(identity(m,m));}/** Matrix determinant@return determinant*/public double det () {return new LUDecomposition(this).det();}/** Matrix rank@return effective numerical rank, obtained from SVD.*/public int rank () {return new SingularValueDecomposition(this).rank();}/** Matrix condition (2 norm)@return ratio of largest to smallest singular value.*/public double cond () {return new SingularValueDecomposition(this).cond();}/** Matrix trace.@return sum of the diagonal elements.*/public double trace () {double t = 0;for (int i = 0; i < Math.min(m,n); i++) {t += A[i][i];}return t;}/** Generate matrix with random elements@param m Number of rows.@param n Number of colums.@return An m-by-n matrix with uniformly distributed random elements.*/public static Matrix random (int m, int n) {Matrix A = new Matrix(m,n);double[][] X = A.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {X[i][j] = Math.random();}}return A;}/** Generate identity matrix@param m Number of rows.@param n Number of colums.@return An m-by-n matrix with ones on the diagonal and zeros elsewhere.*/public static Matrix identity (int m, int n) {Matrix A = new Matrix(m,n);double[][] X = A.getArray();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {X[i][j] = (i == j ? 1.0 : 0.0);}}return A;}/** Print the matrix to stdout. Line the elements up in columns* with a Fortran-like 'Fw.d' style format.@param w Column width.@param d Number of digits after the decimal.*/public void print (int w, int d) {print(new PrintWriter(System.out,true),w,d); }/** Print the matrix to the output stream. Line the elements up in* columns with a Fortran-like 'Fw.d' style format.@param output Output stream.@param w Column width.@param d Number of digits after the decimal.*/public void print (PrintWriter output, int w, int d) {DecimalFormat format = new DecimalFormat();format.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US));format.setMinimumIntegerDigits(1);format.setMaximumFractionDigits(d);format.setMinimumFractionDigits(d);format.setGroupingUsed(false);print(output,format,w+2);}/** Print the matrix to stdout. Line the elements up in columns.* Use the format object, and right justify within columns of width* characters.* Note that is the matrix is to be read back in, you probably will want* to use a NumberFormat that is set to US Locale.@param format A Formatting object for individual elements.@param width Field width for each column.@see java.text.DecimalFormat#setDecimalFormatSymbols*/public void print (NumberFormat format, int width) {print(new PrintWriter(System.out,true),format,width); }// DecimalFormat is a little disappointing coming from Fortran or C's printf.// Since it doesn't pad on the left, the elements will come out different// widths. Consequently, we'll pass the desired column width in as an// argument and do the extra padding ourselves./** Print the matrix to the output stream. Line the elements up in columns.* Use the format object, and right justify within columns of width* characters.* Note that is the matrix is to be read back in, you probably will want* to use a NumberFormat that is set to US Locale.@param output the output stream.@param format A formatting object to format the matrix elements @param width Column width.@see java.text.DecimalFormat#setDecimalFormatSymbols*/public void print (PrintWriter output, NumberFormat format, int width) {output.println(); // start on new line.for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {String s = format.format(A[i][j]); // format the numberint padding = Math.max(1,width-s.length()); // At _least_ 1 spacefor (int k = 0; k < padding; k++)output.print(' ');output.print(s);}output.println();}output.println(); // end with blank line.}/** Read a matrix from a stream. The format is the same the print method,* so printed matrices can be read back in (provided they were printed using* US Locale). Elements are separated by* whitespace, all the elements for each row appear on a single line,* the last row is followed by a blank line.@param input the input stream.*/public static Matrix read (BufferedReader input) throws java.io.IOException {StreamTokenizer tokenizer= new StreamTokenizer(input);// Although StreamTokenizer will parse numbers, it doesn't recognize// scientific notation (E or D); however, Double.valueOf does.// The strategy here is to disable StreamTokenizer's number parsing.// We'll only get whitespace delimited words, EOL's and EOF's.// These words should all be numbers, for Double.valueOf to parse.tokenizer.resetSyntax();tokenizer.wordChars(0,255);tokenizer.whitespaceChars(0, ' ');tokenizer.eolIsSignificant(true);java.util.Vector<Double> vD = new java.util.Vector<Double>();// Ignore initial empty lineswhile (tokenizer.nextToken() == StreamTokenizer.TT_EOL);if (tokenizer.ttype == StreamTokenizer.TT_EOF)throw new java.io.IOException("Unexpected EOF on matrix read.");do {vD.addElement(Double.valueOf(tokenizer.sval)); // Read & store 1st row.} while (tokenizer.nextToken() == StreamTokenizer.TT_WORD);int n = vD.size(); // Now we've got the number of columns!double row[] = new double[n];for (int j=0; j<n; j++) // extract the elements of the 1st row.row[j]=vD.elementAt(j).doubleValue();java.util.Vector<double[]> v = new java.util.Vector<double[]>();v.addElement(row); // Start storing rows instead of columns.while (tokenizer.nextToken() == StreamTokenizer.TT_WORD) {// While non-empty linesv.addElement(row = new double[n]);int j = 0;do {if (j >= n) throw new java.io.IOException("Row " + v.size() + " is too long.");row[j++] = Double.valueOf(tokenizer.sval).doubleValue();} while (tokenizer.nextToken() == StreamTokenizer.TT_WORD);if (j < n) throw new java.io.IOException("Row " + v.size() + " is too short.");}int m = v.size(); // Now we've got the number of rows.double[][] A = new double[m][];v.copyInto(A); // copy the rows out of the vectorreturn new Matrix(A);}/* ------------------------Private Methods* ------------------------ *//** Check if size(A) == size(B) **/private void checkMatrixDimensions (Matrix B) {if (B.m != m || B.n != n) {throw new IllegalArgumentException("Matrix dimensions must agree.");}}private static final long serialVersionUID = 1; }

?

3)源碼參考EigenvalueDecomposition

可重點研讀如何實現(xiàn)特征值分解。

package Jama; import Jama.util.*;/** Eigenvalues and eigenvectors of a real matrix. <P>If A is symmetric, then A = V*D*V' where the eigenvalue matrix D isdiagonal and the eigenvector matrix V is orthogonal.I.e. A = V.times(D.times(V.transpose())) and V.times(V.transpose()) equals the identity matrix. <P>If A is not symmetric, then the eigenvalue matrix D is block diagonalwith the real eigenvalues in 1-by-1 blocks and any complex eigenvalues,lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. Thecolumns of V represent the eigenvectors in the sense that A*V = V*D,i.e. A.times(V) equals V.times(D). The matrix V may be badlyconditioned, or even singular, so the validity of the equationA = V*D*inverse(V) depends upon V.cond(). **/public class EigenvalueDecomposition implements java.io.Serializable {/* ------------------------Class variables* ------------------------ *//** Row and column dimension (square matrix).@serial matrix dimension.*/private int n;/** Symmetry flag.@serial internal symmetry flag.*/private boolean issymmetric;/** Arrays for internal storage of eigenvalues.@serial internal storage of eigenvalues.*/private double[] d, e;/** Array for internal storage of eigenvectors.@serial internal storage of eigenvectors.*/private double[][] V;/** Array for internal storage of nonsymmetric Hessenberg form.@serial internal storage of nonsymmetric Hessenberg form.*/private double[][] H;/** Working storage for nonsymmetric algorithm.@serial working storage for nonsymmetric algorithm.*/private double[] ort;/* ------------------------Private Methods* ------------------------ */// Symmetric Householder reduction to tridiagonal form.private void tred2 () {// This is derived from the Algol procedures tred2 by// Bowdler, Martin, Reinsch, and Wilkinson, Handbook for// Auto. Comp., Vol.ii-Linear Algebra, and the corresponding// Fortran subroutine in EISPACK.for (int j = 0; j < n; j++) {d[j] = V[n-1][j];}// Householder reduction to tridiagonal form.for (int i = n-1; i > 0; i--) {// Scale to avoid under/overflow.double scale = 0.0;double h = 0.0;for (int k = 0; k < i; k++) {scale = scale + Math.abs(d[k]);}if (scale == 0.0) {e[i] = d[i-1];for (int j = 0; j < i; j++) {d[j] = V[i-1][j];V[i][j] = 0.0;V[j][i] = 0.0;}} else {// Generate Householder vector.for (int k = 0; k < i; k++) {d[k] /= scale;h += d[k] * d[k];}double f = d[i-1];double g = Math.sqrt(h);if (f > 0) {g = -g;}e[i] = scale * g;h = h - f * g;d[i-1] = f - g;for (int j = 0; j < i; j++) {e[j] = 0.0;}// Apply similarity transformation to remaining columns.for (int j = 0; j < i; j++) {f = d[j];V[j][i] = f;g = e[j] + V[j][j] * f;for (int k = j+1; k <= i-1; k++) {g += V[k][j] * d[k];e[k] += V[k][j] * f;}e[j] = g;}f = 0.0;for (int j = 0; j < i; j++) {e[j] /= h;f += e[j] * d[j];}double hh = f / (h + h);for (int j = 0; j < i; j++) {e[j] -= hh * d[j];}for (int j = 0; j < i; j++) {f = d[j];g = e[j];for (int k = j; k <= i-1; k++) {V[k][j] -= (f * e[k] + g * d[k]);}d[j] = V[i-1][j];V[i][j] = 0.0;}}d[i] = h;}// Accumulate transformations.for (int i = 0; i < n-1; i++) {V[n-1][i] = V[i][i];V[i][i] = 1.0;double h = d[i+1];if (h != 0.0) {for (int k = 0; k <= i; k++) {d[k] = V[k][i+1] / h;}for (int j = 0; j <= i; j++) {double g = 0.0;for (int k = 0; k <= i; k++) {g += V[k][i+1] * V[k][j];}for (int k = 0; k <= i; k++) {V[k][j] -= g * d[k];}}}for (int k = 0; k <= i; k++) {V[k][i+1] = 0.0;}}for (int j = 0; j < n; j++) {d[j] = V[n-1][j];V[n-1][j] = 0.0;}V[n-1][n-1] = 1.0;e[0] = 0.0;} // Symmetric tridiagonal QL algorithm.private void tql2 () {// This is derived from the Algol procedures tql2, by// Bowdler, Martin, Reinsch, and Wilkinson, Handbook for// Auto. Comp., Vol.ii-Linear Algebra, and the corresponding// Fortran subroutine in EISPACK.for (int i = 1; i < n; i++) {e[i-1] = e[i];}e[n-1] = 0.0;double f = 0.0;double tst1 = 0.0;double eps = Math.pow(2.0,-52.0);for (int l = 0; l < n; l++) {// Find small subdiagonal elementtst1 = Math.max(tst1,Math.abs(d[l]) + Math.abs(e[l]));int m = l;while (m < n) {if (Math.abs(e[m]) <= eps*tst1) {break;}m++;}// If m == l, d[l] is an eigenvalue,// otherwise, iterate.if (m > l) {int iter = 0;do {iter = iter + 1; // (Could check iteration count here.)// Compute implicit shiftdouble g = d[l];double p = (d[l+1] - g) / (2.0 * e[l]);double r = Maths.hypot(p,1.0);if (p < 0) {r = -r;}d[l] = e[l] / (p + r);d[l+1] = e[l] * (p + r);double dl1 = d[l+1];double h = g - d[l];for (int i = l+2; i < n; i++) {d[i] -= h;}f = f + h;// Implicit QL transformation.p = d[m];double c = 1.0;double c2 = c;double c3 = c;double el1 = e[l+1];double s = 0.0;double s2 = 0.0;for (int i = m-1; i >= l; i--) {c3 = c2;c2 = c;s2 = s;g = c * e[i];h = c * p;r = Maths.hypot(p,e[i]);e[i+1] = s * r;s = e[i] / r;c = p / r;p = c * d[i] - s * g;d[i+1] = h + s * (c * g + s * d[i]);// Accumulate transformation.for (int k = 0; k < n; k++) {h = V[k][i+1];V[k][i+1] = s * V[k][i] + c * h;V[k][i] = c * V[k][i] - s * h;}}p = -s * s2 * c3 * el1 * e[l] / dl1;e[l] = s * p;d[l] = c * p;// Check for convergence.} while (Math.abs(e[l]) > eps*tst1);}d[l] = d[l] + f;e[l] = 0.0;}// Sort eigenvalues and corresponding vectors.for (int i = 0; i < n-1; i++) {int k = i;double p = d[i];for (int j = i+1; j < n; j++) {if (d[j] < p) {k = j;p = d[j];}}if (k != i) {d[k] = d[i];d[i] = p;for (int j = 0; j < n; j++) {p = V[j][i];V[j][i] = V[j][k];V[j][k] = p;}}}}// Nonsymmetric reduction to Hessenberg form.private void orthes () {// This is derived from the Algol procedures orthes and ortran,// by Martin and Wilkinson, Handbook for Auto. Comp.,// Vol.ii-Linear Algebra, and the corresponding// Fortran subroutines in EISPACK.int low = 0;int high = n-1;for (int m = low+1; m <= high-1; m++) {// Scale column.double scale = 0.0;for (int i = m; i <= high; i++) {scale = scale + Math.abs(H[i][m-1]);}if (scale != 0.0) {// Compute Householder transformation.double h = 0.0;for (int i = high; i >= m; i--) {ort[i] = H[i][m-1]/scale;h += ort[i] * ort[i];}double g = Math.sqrt(h);if (ort[m] > 0) {g = -g;}h = h - ort[m] * g;ort[m] = ort[m] - g;// Apply Householder similarity transformation// H = (I-u*u'/h)*H*(I-u*u')/h)for (int j = m; j < n; j++) {double f = 0.0;for (int i = high; i >= m; i--) {f += ort[i]*H[i][j];}f = f/h;for (int i = m; i <= high; i++) {H[i][j] -= f*ort[i];}}for (int i = 0; i <= high; i++) {double f = 0.0;for (int j = high; j >= m; j--) {f += ort[j]*H[i][j];}f = f/h;for (int j = m; j <= high; j++) {H[i][j] -= f*ort[j];}}ort[m] = scale*ort[m];H[m][m-1] = scale*g;}}// Accumulate transformations (Algol's ortran).for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {V[i][j] = (i == j ? 1.0 : 0.0);}}for (int m = high-1; m >= low+1; m--) {if (H[m][m-1] != 0.0) {for (int i = m+1; i <= high; i++) {ort[i] = H[i][m-1];}for (int j = m; j <= high; j++) {double g = 0.0;for (int i = m; i <= high; i++) {g += ort[i] * V[i][j];}// Double division avoids possible underflowg = (g / ort[m]) / H[m][m-1];for (int i = m; i <= high; i++) {V[i][j] += g * ort[i];}}}}}// Complex scalar division.private transient double cdivr, cdivi;private void cdiv(double xr, double xi, double yr, double yi) {double r,d;if (Math.abs(yr) > Math.abs(yi)) {r = yi/yr;d = yr + r*yi;cdivr = (xr + r*xi)/d;cdivi = (xi - r*xr)/d;} else {r = yr/yi;d = yi + r*yr;cdivr = (r*xr + xi)/d;cdivi = (r*xi - xr)/d;}}// Nonsymmetric reduction from Hessenberg to real Schur form.private void hqr2 () {// This is derived from the Algol procedure hqr2,// by Martin and Wilkinson, Handbook for Auto. Comp.,// Vol.ii-Linear Algebra, and the corresponding// Fortran subroutine in EISPACK.// Initializeint nn = this.n;int n = nn-1;int low = 0;int high = nn-1;double eps = Math.pow(2.0,-52.0);double exshift = 0.0;double p=0,q=0,r=0,s=0,z=0,t,w,x,y;// Store roots isolated by balanc and compute matrix normdouble norm = 0.0;for (int i = 0; i < nn; i++) {if (i < low | i > high) {d[i] = H[i][i];e[i] = 0.0;}for (int j = Math.max(i-1,0); j < nn; j++) {norm = norm + Math.abs(H[i][j]);}}// Outer loop over eigenvalue indexint iter = 0;while (n >= low) {// Look for single small sub-diagonal elementint l = n;while (l > low) {s = Math.abs(H[l-1][l-1]) + Math.abs(H[l][l]);if (s == 0.0) {s = norm;}if (Math.abs(H[l][l-1]) < eps * s) {break;}l--;}// Check for convergence// One root foundif (l == n) {H[n][n] = H[n][n] + exshift;d[n] = H[n][n];e[n] = 0.0;n--;iter = 0;// Two roots found} else if (l == n-1) {w = H[n][n-1] * H[n-1][n];p = (H[n-1][n-1] - H[n][n]) / 2.0;q = p * p + w;z = Math.sqrt(Math.abs(q));H[n][n] = H[n][n] + exshift;H[n-1][n-1] = H[n-1][n-1] + exshift;x = H[n][n];// Real pairif (q >= 0) {if (p >= 0) {z = p + z;} else {z = p - z;}d[n-1] = x + z;d[n] = d[n-1];if (z != 0.0) {d[n] = x - w / z;}e[n-1] = 0.0;e[n] = 0.0;x = H[n][n-1];s = Math.abs(x) + Math.abs(z);p = x / s;q = z / s;r = Math.sqrt(p * p+q * q);p = p / r;q = q / r;// Row modificationfor (int j = n-1; j < nn; j++) {z = H[n-1][j];H[n-1][j] = q * z + p * H[n][j];H[n][j] = q * H[n][j] - p * z;}// Column modificationfor (int i = 0; i <= n; i++) {z = H[i][n-1];H[i][n-1] = q * z + p * H[i][n];H[i][n] = q * H[i][n] - p * z;}// Accumulate transformationsfor (int i = low; i <= high; i++) {z = V[i][n-1];V[i][n-1] = q * z + p * V[i][n];V[i][n] = q * V[i][n] - p * z;}// Complex pair} else {d[n-1] = x + p;d[n] = x + p;e[n-1] = z;e[n] = -z;}n = n - 2;iter = 0;// No convergence yet} else {// Form shiftx = H[n][n];y = 0.0;w = 0.0;if (l < n) {y = H[n-1][n-1];w = H[n][n-1] * H[n-1][n];}// Wilkinson's original ad hoc shiftif (iter == 10) {exshift += x;for (int i = low; i <= n; i++) {H[i][i] -= x;}s = Math.abs(H[n][n-1]) + Math.abs(H[n-1][n-2]);x = y = 0.75 * s;w = -0.4375 * s * s;}// MATLAB's new ad hoc shiftif (iter == 30) {s = (y - x) / 2.0;s = s * s + w;if (s > 0) {s = Math.sqrt(s);if (y < x) {s = -s;}s = x - w / ((y - x) / 2.0 + s);for (int i = low; i <= n; i++) {H[i][i] -= s;}exshift += s;x = y = w = 0.964;}}iter = iter + 1; // (Could check iteration count here.)// Look for two consecutive small sub-diagonal elementsint m = n-2;while (m >= l) {z = H[m][m];r = x - z;s = y - z;p = (r * s - w) / H[m+1][m] + H[m][m+1];q = H[m+1][m+1] - z - r - s;r = H[m+2][m+1];s = Math.abs(p) + Math.abs(q) + Math.abs(r);p = p / s;q = q / s;r = r / s;if (m == l) {break;}if (Math.abs(H[m][m-1]) * (Math.abs(q) + Math.abs(r)) <eps * (Math.abs(p) * (Math.abs(H[m-1][m-1]) + Math.abs(z) +Math.abs(H[m+1][m+1])))) {break;}m--;}for (int i = m+2; i <= n; i++) {H[i][i-2] = 0.0;if (i > m+2) {H[i][i-3] = 0.0;}}// Double QR step involving rows l:n and columns m:nfor (int k = m; k <= n-1; k++) {boolean notlast = (k != n-1);if (k != m) {p = H[k][k-1];q = H[k+1][k-1];r = (notlast ? H[k+2][k-1] : 0.0);x = Math.abs(p) + Math.abs(q) + Math.abs(r);if (x == 0.0) {continue;}p = p / x;q = q / x;r = r / x;}s = Math.sqrt(p * p + q * q + r * r);if (p < 0) {s = -s;}if (s != 0) {if (k != m) {H[k][k-1] = -s * x;} else if (l != m) {H[k][k-1] = -H[k][k-1];}p = p + s;x = p / s;y = q / s;z = r / s;q = q / p;r = r / p;// Row modificationfor (int j = k; j < nn; j++) {p = H[k][j] + q * H[k+1][j];if (notlast) {p = p + r * H[k+2][j];H[k+2][j] = H[k+2][j] - p * z;}H[k][j] = H[k][j] - p * x;H[k+1][j] = H[k+1][j] - p * y;}// Column modificationfor (int i = 0; i <= Math.min(n,k+3); i++) {p = x * H[i][k] + y * H[i][k+1];if (notlast) {p = p + z * H[i][k+2];H[i][k+2] = H[i][k+2] - p * r;}H[i][k] = H[i][k] - p;H[i][k+1] = H[i][k+1] - p * q;}// Accumulate transformationsfor (int i = low; i <= high; i++) {p = x * V[i][k] + y * V[i][k+1];if (notlast) {p = p + z * V[i][k+2];V[i][k+2] = V[i][k+2] - p * r;}V[i][k] = V[i][k] - p;V[i][k+1] = V[i][k+1] - p * q;}} // (s != 0)} // k loop} // check convergence} // while (n >= low)// Backsubstitute to find vectors of upper triangular formif (norm == 0.0) {return;}for (n = nn-1; n >= 0; n--) {p = d[n];q = e[n];// Real vectorif (q == 0) {int l = n;H[n][n] = 1.0;for (int i = n-1; i >= 0; i--) {w = H[i][i] - p;r = 0.0;for (int j = l; j <= n; j++) {r = r + H[i][j] * H[j][n];}if (e[i] < 0.0) {z = w;s = r;} else {l = i;if (e[i] == 0.0) {if (w != 0.0) {H[i][n] = -r / w;} else {H[i][n] = -r / (eps * norm);}// Solve real equations} else {x = H[i][i+1];y = H[i+1][i];q = (d[i] - p) * (d[i] - p) + e[i] * e[i];t = (x * s - z * r) / q;H[i][n] = t;if (Math.abs(x) > Math.abs(z)) {H[i+1][n] = (-r - w * t) / x;} else {H[i+1][n] = (-s - y * t) / z;}}// Overflow controlt = Math.abs(H[i][n]);if ((eps * t) * t > 1) {for (int j = i; j <= n; j++) {H[j][n] = H[j][n] / t;}}}}// Complex vector} else if (q < 0) {int l = n-1;// Last vector component imaginary so matrix is triangularif (Math.abs(H[n][n-1]) > Math.abs(H[n-1][n])) {H[n-1][n-1] = q / H[n][n-1];H[n-1][n] = -(H[n][n] - p) / H[n][n-1];} else {cdiv(0.0,-H[n-1][n],H[n-1][n-1]-p,q);H[n-1][n-1] = cdivr;H[n-1][n] = cdivi;}H[n][n-1] = 0.0;H[n][n] = 1.0;for (int i = n-2; i >= 0; i--) {double ra,sa,vr,vi;ra = 0.0;sa = 0.0;for (int j = l; j <= n; j++) {ra = ra + H[i][j] * H[j][n-1];sa = sa + H[i][j] * H[j][n];}w = H[i][i] - p;if (e[i] < 0.0) {z = w;r = ra;s = sa;} else {l = i;if (e[i] == 0) {cdiv(-ra,-sa,w,q);H[i][n-1] = cdivr;H[i][n] = cdivi;} else {// Solve complex equationsx = H[i][i+1];y = H[i+1][i];vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q;vi = (d[i] - p) * 2.0 * q;if (vr == 0.0 & vi == 0.0) {vr = eps * norm * (Math.abs(w) + Math.abs(q) +Math.abs(x) + Math.abs(y) + Math.abs(z));}cdiv(x*r-z*ra+q*sa,x*s-z*sa-q*ra,vr,vi);H[i][n-1] = cdivr;H[i][n] = cdivi;if (Math.abs(x) > (Math.abs(z) + Math.abs(q))) {H[i+1][n-1] = (-ra - w * H[i][n-1] + q * H[i][n]) / x;H[i+1][n] = (-sa - w * H[i][n] - q * H[i][n-1]) / x;} else {cdiv(-r-y*H[i][n-1],-s-y*H[i][n],z,q);H[i+1][n-1] = cdivr;H[i+1][n] = cdivi;}}// Overflow controlt = Math.max(Math.abs(H[i][n-1]),Math.abs(H[i][n]));if ((eps * t) * t > 1) {for (int j = i; j <= n; j++) {H[j][n-1] = H[j][n-1] / t;H[j][n] = H[j][n] / t;}}}}}}// Vectors of isolated rootsfor (int i = 0; i < nn; i++) {if (i < low | i > high) {for (int j = i; j < nn; j++) {V[i][j] = H[i][j];}}}// Back transformation to get eigenvectors of original matrixfor (int j = nn-1; j >= low; j--) {for (int i = low; i <= high; i++) {z = 0.0;for (int k = low; k <= Math.min(j,high); k++) {z = z + V[i][k] * H[k][j];}V[i][j] = z;}}}/* ------------------------Constructor* ------------------------ *//** Check for symmetry, then construct the eigenvalue decompositionStructure to access D and V.@param Arg Square matrix*/public EigenvalueDecomposition (Matrix Arg) {double[][] A = Arg.getArray();n = Arg.getColumnDimension();V = new double[n][n];d = new double[n];e = new double[n];issymmetric = true;for (int j = 0; (j < n) & issymmetric; j++) {for (int i = 0; (i < n) & issymmetric; i++) {issymmetric = (A[i][j] == A[j][i]);}}if (issymmetric) {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {V[i][j] = A[i][j];}}// Tridiagonalize.tred2();// Diagonalize.tql2();} else {H = new double[n][n];ort = new double[n];for (int j = 0; j < n; j++) {for (int i = 0; i < n; i++) {H[i][j] = A[i][j];}}// Reduce to Hessenberg form.orthes();// Reduce Hessenberg to real Schur form.hqr2();}}/* ------------------------Public Methods* ------------------------ *//** Return the eigenvector matrix@return V*/public Matrix getV () {return new Matrix(V,n,n);}/** Return the real parts of the eigenvalues@return real(diag(D))*/public double[] getRealEigenvalues () {return d;}/** Return the imaginary parts of the eigenvalues@return imag(diag(D))*/public double[] getImagEigenvalues () {return e;}/** Return the block diagonal eigenvalue matrix@return D*/public Matrix getD () {Matrix X = new Matrix(n,n);double[][] D = X.getArray();for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {D[i][j] = 0.0;}D[i][i] = d[i];if (e[i] > 0) {D[i][i+1] = e[i];} else if (e[i] < 0) {D[i][i-1] = e[i];}}return X;}private static final long serialVersionUID = 1; }

總結(jié)

以上是生活随笔為你收集整理的机器学习知识点(十九)矩阵特征值分解基础知识及Java实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

国产精品久久久久永久免费 | 久久福利国产 | 日本久久成人中文字幕电影 | 国产福利91精品 | 91精品久久久久久久91蜜桃 | 亚洲欧美少妇 | 精品美女久久久久久免费 | 男女拍拍免费视频 | 亚洲女在线| av成人免费观看 | 国精产品一二三线999 | 国产麻豆精品传媒av国产下载 | 99久久影视| 亚洲人成人天堂h久久 | 日韩综合一区二区三区 | 色婷婷免费视频 | 五月婷婷在线视频观看 | 亚洲狠狠操 | 91免费在线| 中文字幕在线影院 | 久久综合久久久 | 免费三级av| 五月天婷婷丁香花 | 国产69熟 | www.天天操| 国产亚洲无 | 国产一区二区三区在线 | 成人国产精品入口 | 欧美成人理伦片 | 久久伊人操 | 中文字幕999 | 日韩av高清在线观看 | 亚洲视频1 | 美女黄视频免费 | 久久观看| 91成人观看 | 亚洲少妇自拍 | 婷婷在线不卡 | 亚欧日韩av | 国产精品永久久久久久久www | 青春草免费在线视频 | 国产精品一区电影 | 国产高清中文字幕 | 久久久99精品免费观看 | 欧美影院久久 | 在线观看成人网 | 成人午夜电影在线 | 成人小视频在线免费观看 | 日韩丝袜 | 久久精品小视频 | 粉嫩一区二区三区粉嫩91 | a午夜电影| 深夜免费福利在线 | 黄色资源网站 | 久久精品国产一区二区电影 | 欧美一性一交一乱 | 久 久久影院 | 99视频免费观看 | 99国产精品久久久久老师 | 日日天天狠狠 | 久久精品视频2 | 日韩视频一区二区在线 | 久色网 | 国产美女精品人人做人人爽 | 日韩精品一区在线播放 | 中文字幕在线观看2018 | 天天色天天草天天射 | 国产精品成人免费精品自在线观看 | 国产午夜精品视频 | 久久精品波多野结衣 | 激情伊人五月天 | 亚洲六月丁香色婷婷综合久久 | 欧美少妇xx | 国产精品久久久久久久久久久久久久 | 1024手机在线看 | 91视频在线观看下载 | 在线观看国产高清视频 | 日韩在线短视频 | 最近中文字幕国语免费高清6 | 五月天激情视频在线观看 | 久久久婷| 激情av一区二区 | 亚洲毛片在线观看. | 成人99免费视频 | 91久久丝袜国产露脸动漫 | 在线观看免费av片 | 国产精品白浆视频 | 欧美精品一区二区三区一线天视频 | 91精品高清| 成人黄色在线 | 亚洲精品视频在线播放 | 欧美另类巨大 | 婷婷日日 | 97视频在线观看成人 | 国产精品九九九九九九 | 亚洲精品国产品国语在线 | 日日夜夜婷婷 | av电影一区| 欧美精品乱码99久久影院 | 久久久久久久看片 | 日韩成片| 日韩va在线观看 | 操操操干干干 | 欧美成人在线免费观看 | 成人免费网站在线观看 | 色综合久久网 | 国产一区二区三区四区大秀 | 伊人久久国产精品 | 热久久免费视频 | 久久久久日本精品一区二区三区 | 国产第一页在线观看 | 亚洲成人精品久久久 | 成年在线观看 | 在线观看国产 | 久久五月婷婷综合 | 国产一区二区电影在线观看 | 99久久久成人国产精品 | 97电影院在线观看 | 成人av免费在线播放 | av在线播放观看 | 久久久免费高清视频 | 丁香午夜婷婷 | 97成人资源 | 亚洲一二三久久 | 亚洲激情在线播放 | 亚洲高清视频一区二区三区 | 91成人网在线 | 毛片网在线播放 | 日韩在线视频精品 | 首页国产精品 | 日精品在线观看 | 国产精品一区二区免费视频 | 在线观看mv的中文字幕网站 | 亚洲精品456在线播放 | 91成年人视频 | 黄色成人av| 成人一区二区在线 | 久久久精品国产免费观看同学 | 91.dizhi永久地址最新 | 久久久久久久毛片 | 免费视频国产 | 免费看片黄色 | 伊人成人久久 | 国产精品久久久久久吹潮天美传媒 | 欧美日韩精品在线播放 | 精品久久久久亚洲 | 九色自拍视频 | 一级片色播影院 | 国产成在线观看免费视频 | 18pao国产成视频永久免费 | 婷婷五月情 | 91精品免费| 婷婷在线视频观看 | 日韩精品一区二区久久 | 免费在线观看日韩视频 | 亚洲国产三级在线观看 | 久久精品成人热国产成 | 天天玩天天干 | 国产成人三级 | 97av精品| 免费a网址 | 国产精品手机视频 | av大全在线观看 | 中文字幕亚洲高清 | 国产69精品久久久久久 | 毛片美女网站 | 日韩日韩日韩日韩 | 久久久.com| 免费a v观看 | 黄色性av| 欧美日韩精品影院 | 中文字幕欧美日韩va免费视频 | 一区二区三区在线视频111 | 色婷婷狠狠操 | 91精品视频在线 | 国产精品色婷婷视频 | 亚洲在线成人精品 | 中文成人字幕 | 又黄又爽又刺激 | 中文在线字幕免费观看 | 国产精品久久久久久久久久新婚 | 青青网视频 | 中文字幕首页 | av网站地址 | 国产午夜视频在线观看 | 天天操网站 | 欧美日韩视频在线观看一区二区 | 中国一级片在线观看 | 激情五月网站 | 免费99视频 | www亚洲一区 | 国产高清久久 | 91视频免费看网站 | 国产美女精品视频免费观看 | 久久久久亚洲天堂 | 国产69精品久久久久9999apgf | 成人免费视频网 | 西西大胆免费视频 | 天天综合中文 | 国产高清在线视频 | 亚洲欧美经典 | 免费影视大全推荐 | 免费在线观看亚洲视频 | 玖玖色在线观看 | 亚洲视频免费 | 91麻豆精品国产自产在线 | 丁香六月中文字幕 | 草久在线 | 久草在线最新免费 | av超碰在线观看 | 久久嗨| 国产精品久久久久久久久毛片 | 亚洲综合欧美精品电影 | 久久免费在线观看视频 | 色视频网站免费观看 | 青青河边草免费观看 | 99久久99视频只有精品 | 中文字幕一区二区三区在线视频 | 缴情综合网五月天 | 欧美十八 | 91在线九色| 在线观看日韩中文字幕 | 国产亚洲精品bv在线观看 | 色综合 久久精品 | 国产色在线,com | 日韩影视在线观看 | 91激情在线视频 | 91久久精品日日躁夜夜躁国产 | 天天干天天插 | 国产精品网址在线观看 | 亚洲一区精品二人人爽久久 | 中文字幕丰满人伦在线 | 国产小视频免费观看 | 91亚洲影院 | 久久综合视频网 | 99热这里只有精品国产首页 | 黄色三级视频片 | 精品在线二区 | 五月天亚洲综合 | 九色精品免费永久在线 | 在线观看的黄色 | 午夜91视频 | 免费视频网 | 国产精品自在欧美一区 | 亚洲 中文 欧美 日韩vr 在线 | 天天爱天天操天天射 | 天天插视频| 久久精品精品 | 欧美日韩一区二区视频在线观看 | 亚洲视频免费视频 | 99精品在线视频播放 | 亚洲欧美视频在线观看 | 啪嗒啪嗒免费观看完整版 | www.xxx.性狂虐 | 久热免费在线观看 | 国产精品中文字幕av | 成人免费观看视频网站 | 亚洲精品午夜久久久久久久 | 又黄又爽免费视频 | 青青草华人在线视频 | 久久99在线 | 久亚洲精品| 国产精品电影在线 | 91精品欧美| 香蕉网在线播放 | 西西www444| 亚洲婷婷丁香 | 18国产精品白浆在线观看免费 | 日本不卡一区二区三区在线观看 | 日韩国产精品久久久久久亚洲 | 人人爽网站 | 日韩一区视频在线 | 在线午夜电影神马影院 | 中文字幕在线观看完整版电影 | 激情综合网五月婷婷 | 91麻豆精品国产91久久久更新时间 | 国产又粗又猛又爽又黄的视频免费 | 区一区二区三区中文字幕 | 亚洲精品456在线播放乱码 | 免费在线中文字幕 | 伊人国产视频 | av中文字幕不卡 | 青青河边草手机免费 | 国产亚洲欧美日韩高清 | 色婷婷亚洲精品 | 亚洲黄色av一区 | 亚洲欧美日韩中文在线 | 国产精品自在欧美一区 | 国产小视频在线观看 | 日日插日日干 | 久久久五月天 | 国产精品久久久久久久久大全 | 日韩欧美视频在线免费观看 | 精品一区电影国产 | 欧美激情视频在线观看免费 | 成人a毛片 | 国产一区二区精品久久 | 99综合影院在线 | 麻豆视频免费看 | 91尤物在线播放 | 国产一区成人在线 | 高清不卡一区二区三区 | 99视频播放 | 99精品久久99久久久久 | 欧美日韩高清 | 精品视频在线观看 | av 一区二区三区 | 久久露脸国产精品 | 欧美日韩国产在线观看 | 久草视频免费看 | 欧美日韩精品综合 | 久久伊人精品一区二区三区 | 国产午夜精品一区二区三区 | 中文字幕在线免费 | 国产精品一区二区电影 | 高清av中文字幕 | 97av影院 | 国产精品 国产精品 | 99久久久国产精品免费99 | av网站大全免费 | 久久影视网 | 日韩黄色中文字幕 | 亚洲欧洲国产日韩精品 | 国产在线观看不卡 | 久久精品播放 | 欧美ⅹxxxxxx | 91九色蝌蚪国产 | 精品久久久久久国产偷窥 | 人人看看人人 | 国产午夜av | 69精品视频 | 国产精品自在线 | 国产午夜一级毛片 | 国产高清无av久久 | 天天干天天上 | 欧美亚洲xxx | 久久草在线视频国产 | av网站在线观看免费 | 久久久天天操 | 精品国产一区二区三区四区在线观看 | 亚洲专区在线视频 | 成人影片在线播放 | 五月天最新网址 | 黄色大片国产 | 欧美热久久| 亚洲高清国产视频 | 9在线观看免费高清完整版在线观看明 | 久久久久久久久久久久久久电影 | av中文在线影视 | 欧美性免费 | 国产精品 日韩精品 | 午夜久久久影院 | 91精品1区 | 久久中文视频 | 亚洲国产小视频在线观看 | 日本在线中文在线 | 91成人免费在线视频 | 女人18毛片a级毛片一区二区 | 久久久av免费 | 国产亚洲欧美日韩高清 | 黄色av电影 | 国产在线不卡视频 | 欧美日韩高清在线观看 | 色综合久久88色综合天天免费 | 国产精品久久久久久久久免费 | 国产亚洲久一区二区 | 91夜夜夜 | 国产精品免费久久久久久久久久中文 | 欧美 亚洲 另类 激情 另类 | 日韩四虎| 欧美激情视频在线免费观看 | 久久综合成人网 | 91在线免费观看网站 | 91在线文字幕 | 日本黄网站 | 国产手机精品视频 | 欧美在线aaa | 国产最新视频在线 | 国产白浆视频 | 中文字幕高清免费日韩视频在线 | 中文字幕a∨在线乱码免费看 | 日本久久电影 | 黄色大片日本免费大片 | 激情欧美在线观看 | 欧美日韩国产精品久久 | 日日夜夜干 | 人人爽人人爽人人片av免 | 视频一区二区在线 | 在线播放第一页 | 欧美激情在线网站 | 欧美日韩在线视频观看 | 欧美日韩观看 | 亚洲91精品| 成 人 a v天堂 | 欧美日韩高清在线 | 天天综合网~永久入口 | 伊人官网 | 天天综合人人 | 久久久国产影院 | 97综合在线 | 亚洲人成精品久久久久 | 欧美特一级 | 国产美女搞久久 | 日本婷婷色 | 欧美日韩国产高清视频 | 天天激情天天干 | 欧美经典久久 | 中文字幕视频 | 日韩有码第一页 | 日本公乱妇视频 | 99这里有精品 | 三级黄色三级 | 91精品国产一区 | www.狠狠色.com | 国产精品婷婷午夜在线观看 | 亚洲九九九在线观看 | 久久久国产一区二区 | 久久人人爽人人爽人人片av免费 | 日韩av电影中文字幕 | 成人免费视频网址 | 婷婷六月综合网 | 国产视频黄| av成人资源 | 六月天色婷婷 | 亚洲国产精品久久 | 久久99热这里只有精品国产 | 日韩视频在线观看免费 | 人人网av| 6080yy午夜一二三区久久 | 国产视频精选 | 亚洲在线看 | 久久精品国产成人精品 | 在线观看日韩中文字幕 | 色www精品视频在线观看 | 国产黄在线播放 | 久久精品国产精品 | 国内精品免费久久影院 | av电影在线免费 | 怡红院成人在线 | 国产精品第二十页 | 天天摸天天弄 | 久久成视频 | 久久黄色网址 | 四月婷婷在线观看 | 在线成人性视频 | 色香蕉视频 | 男女啪啪视屏 | 99视频+国产日韩欧美 | 99精品免费在线观看 | 国产91成人在在线播放 | 一区二区三区电影大全 | 国产免费又爽又刺激在线观看 | 亚洲在线黄色 | 最新国产一区二区三区 | 五月激情电影 | 国产精品破处视频 | 久久久九色精品国产一区二区三区 | 91精品爽啪蜜夜国产在线播放 | 男女日麻批 | 色视频 在线 | 中文字幕 91| 国产精品对白一区二区三区 | 国产最新福利 | 国产涩涩在线观看 | 久久久久亚洲国产 | 日韩av二区| 午夜美女av | 久久无码精品一区二区三区 | 亚洲精品高清视频 | 91日本在线播放 | 色综合人人 | 97视频免费看 | 91在线欧美| 日本在线观看中文字幕 | 国产精品综合在线观看 | 日韩欧美高清在线 | 13日本xxxxxⅹxxx20 | 99久热精品 | 亚洲国产精品久久久久久 | 狠狠夜夜 | 日韩精品三区四区 | 91大神免费视频 | 91在线看片 | 伊人久久国产 | 又色又爽又黄 | 在线观看视频你懂的 | 久草在线在线视频 | 麻豆av一区二区三区在线观看 | 国产成人精品999 | 又黄又色又爽 | 国产日产精品一区二区三区四区 | 免费在线91| 天天干天天做 | 在线www色 | 韩日色视频 | 丝袜美女在线观看 | 黄色网www | 国产精品美女久久久久aⅴ 干干夜夜 | 国产啊v在线 | 黄色av一区| 手机版av在线| 成年人在线观看免费视频 | 欧美性黑人 | 天天干天天拍天天操 | 国产免费小视频 | 7777精品伊人久久久大香线蕉 | 亚洲精品美女 | 一区在线观看 | 91在线小视频 | 69国产盗摄一区二区三区五区 | 久草热久草视频 | 国产视频久久久久 | 久久国产a| 免费视频91| 天天射天天操天天 | 97超碰人人澡 | 免费看黄网站在线 | 日韩久久精品一区二区三区下载 | 久草精品视频在线看网站免费 | 精品国产乱码一区二 | 成人资源网 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 91影视成人 | 密桃av在线| 亚洲成人免费 | 日日夜夜免费精品 | 亚洲成人资源网 | 2022久久国产露脸精品国产 | 特黄特色特刺激视频免费播放 | 91黄色在线观看 | 国产精品二区在线 | 综合色综合色 | 国产福利精品视频 | 免费亚洲精品视频 | 最近中文字幕大全 | av一区在线 | 国产午夜三级一区二区三桃花影视 | 中文字幕亚洲字幕 | 国产中的精品av小宝探花 | 亚洲免费成人 | 欧美大片大全 | 狠狠狠狠狠狠 | 国产在线精品国自产拍影院 | 特级西西www44高清大胆图片 | 女人18毛片a级毛片一区二区 | 欧美小视频在线观看 | 91麻豆视频| 久久久久久久久久免费 | 精品久久久久久综合日本 | 亚洲精品xxxx | 国产精品theporn | 一本一道波多野毛片中文在线 | 99热最新精品 | 日韩av电影免费观看 | 精品v亚洲v欧美v高清v | 国产精品久久久久久久久软件 | 亚洲视频在线观看 | 久久久免费毛片 | 亚洲一区欧美精品 | 日本精品免费看 | 亚洲成人av片在线观看 | 亚洲成人中文在线 | 欧美成年网站 | 国产黄色播放 | 探花在线观看 | 夜夜躁狠狠躁日日躁视频黑人 | 丁香六月国产 | 久久亚洲免费视频 | 婷婷久久婷婷 | 欧美日韩一区二区免费在线观看 | 中文字幕久久精品 | 天天干天天干天天干 | 欧美精品久久久久久久久久丰满 | 91在线网址 | 精品国产理论 | 精品一区二区在线免费观看 | 在线国产专区 | 亚洲国产精久久久久久久 | 国产精品美女 | www.com黄色| 女人18毛片a级毛片一区二区 | 999成人国产 | 五月婷婷久久综合 | 国产精品成人a免费观看 | 亚洲黄色片 | 亚洲欧美少妇 | 超碰在线个人 | 超碰精品在线 | 六月色丁| 国产群p| 日本成人中文字幕在线观看 | 97人人添人澡人人爽超碰动图 | 日韩国产高清在线 | 久久久久二区 | 黄色毛片观看 | 久久99久久99精品中文字幕 | 亚洲高清视频在线 | 亚洲视频精品在线 | 97在线看 | 日韩免费福利 | 国产精品久久久久久久久久三级 | 欧美综合久久 | 亚洲午夜久久久久 | 91人人揉日日捏人人看 | 亚洲在线视频观看 | 国产精品麻豆91 | 又爽又黄又刺激的视频 | 欧美最猛性xxxxx免费 | 亚洲精品国精品久久99热 | 亚洲黄色网络 | 国产精品中文字幕av | 成人羞羞视频在线观看免费 | 97免费在线观看视频 | 天天天色| 亚洲综合在线发布 | 日韩av视屏在线观看 | 黄色av一区 | 国内精品视频在线 | 少妇搡bbb| av福利超碰网站 | 久久久观看 | 久草网在线观看 | 国产精品久久久久久久久久久免费看 | 亚洲国产中文字幕在线视频综合 | 91一区啪爱嗯打偷拍欧美 | 一区二区成人国产精品 | 99久久免费看 | 欧美国产日韩一区二区三区 | 久久久久久久国产精品 | 国产精品原创视频 | av在线播放观看 | 韩国av免费观看 | 成年人网站免费观看 | 久久久久久久免费看 | 三级黄色片在线观看 | 久久久久久久久国产 | 日韩av电影中文字幕 | 99久久精品免费看国产四区 | 日日日天天天 | 日日夜夜精品网站 | 婷婷精品视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 99精品小视频 | 最近更新好看的中文字幕 | 国产精品theporn | 99视频精品全部免费 在线 | 日韩精品不卡在线观看 | 丁香九月婷婷综合 | 亚洲国产视频网站 | 午夜电影中文字幕 | 国产a精品 | 成人三级av | 久久久久国产免费免费 | 97**国产露脸精品国产 | 国产夫妻性生活自拍 | 国产一级视频在线免费观看 | 色综合夜色一区 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 日本资源中文字幕在线 | 一区二区免费不卡在线 | 97香蕉超级碰碰久久免费软件 | 在线电影播放 | 欧美一级性生活视频 | 国产精品自拍在线 | 国产精品免费一区二区三区在线观看 | 国产一区视频在线观看免费 | 97精品国产一二三产区 | 久草在线视频资源 | 亚洲狠狠丁香婷婷综合久久久 | 国产综合久久 | 日韩视频免费在线 | 亚洲欧洲日韩在线观看 | 精品人人爽| 99热亚洲精品 | 毛片视频网址 | 日本成址在线观看 | 色综合咪咪久久网 | 超碰日韩 | 五月婷婷国产 | 五月婷婷激情六月 | 欧美激情另类 | 精品亚洲视频在线观看 | 96香蕉视频 | 亚洲欧美日本国产 | 国产麻豆精品一区 | 国产资源站 | 麻豆久久久| 中文字幕av全部资源www中文字幕在线观看 | 麻豆91在线播放 | 久久久久国产成人免费精品免费 | 欧美性大战久久久久 | 亚洲a免费| 成人欧美一区二区三区在线观看 | 久草在线这里只有精品 | 91视频91蝌蚪 | 韩国av一区二区三区 | 久久99国产精品二区护士 | 日本视频不卡 | 日韩成人免费在线电影 | 久艹视频在线免费观看 | 成 人 a v天堂 | 在线 高清 中文字幕 | 久久国产成人午夜av影院宅 | 人人艹人人| av福利网址导航 | 在线国产一区二区三区 | 国产精品一区二区三区免费看 | 日p视频 | 国产精品手机在线播放 | 五月天综合网站 | 国产精品久久久久久久久免费 | 91最新网址 | 国产精品久久久久三级 | 国内成人精品视频 | 香蕉视频网站在线观看 | 五月天国产精品 | 久久大片网站 | 久久精品4| 麻花豆传媒一二三产区 | 亚洲aⅴ一区二区三区 | 狠狠激情中文字幕 | 草久久精品 | 在线免费国产 | 国产精品二区在线观看 | 99热这里只有精品免费 | 九九热精品在线 | www.夜夜爽| 永久免费毛片在线观看 | 九九激情视频 | 日韩在线观看电影 | 国产精品视频你懂的 | 在线精品在线 | 婷婷丁香色综合狠狠色 | 91中文字幕 | 婷婷激情久久 | 五月婷婷久草 | 日韩色高清 | 日韩精品在线观看视频 | 激情综合网在线观看 | 一级黄色片在线观看 | 在线观看91av | 日韩午夜三级 | 国产男男gay做爰 | 国产精品久久艹 | 黄色av一区二区三区 | 丁香伊人网 | a在线观看免费视频 | 国产视频一区在线 | 久久精彩视频 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 免费高清男女打扑克视频 | 黄色成年 | 国产一级久久 | 久久综合日 | 日韩区视频 | 色综合久久88色综合天天人守婷 | 日韩av在线一区二区 | 亚洲美女精品区人人人人 | 一区二区三区中文字幕在线 | 99中文在线 | 国产一级一片免费播放放 | 国产又黄又硬又爽 | 久久国语露脸国产精品电影 | 亚洲视频免费在线看 | 一区二区三区中文字幕在线 | 黄污网站在线观看 | 国产专区日韩专区 | 精品欧美小视频在线观看 | 国产精品一区免费在线观看 | 久久久999精品视频 国产美女免费观看 | 婷婷中文字幕在线观看 | 日本精品一区二区三区在线观看 | 狠狠色丁香婷婷综合最新地址 | 午夜精品av | 国产精品久久久亚洲 | 国产精品久久久久久久久久久免费看 | 国产精品高潮呻吟久久久久 | 亚洲国产人午在线一二区 | 91人人人| 免费在线看成人av | 亚洲理论电影 | 国产精品久久99精品毛片三a | 中文十次啦 | 中文字幕在线观看视频网站 | 国产黄影院色大全免费 | 亚洲一级电影视频 | 美国av片在线观看 | 国产麻豆剧传媒免费观看 | 2020天天干天天操 | 亚洲国产精品99久久久久久久久 | 久久久黄色 | 精品一区精品二区 | 欧美性色综合网 | 日韩成人精品一区二区三区 | 69av免费视频 | 国产一区在线精品 | 91精品欧美一区二区三区 | 岛国精品一区二区 | 最新色站 | 国产午夜在线观看 | 久久视频这里只有精品 | 中文字幕乱码一区二区 | 国产剧情一区二区在线观看 | 香蕉网在线播放 | 色诱亚洲精品久久久久久 | 午夜在线免费观看视频 | 91在线欧美 | 91丨九色丨高潮丰满 | 亚洲激情综合网 | 丁香五婷| 中文字幕高清在线播放 | 97视频免费播放 | 日韩网站一区 | 国产精品99久久久久久宅男 | 亚洲激情在线观看 | 91网在线看 | 国产精品久久久久一区二区三区 | www91在线 | 在线观看视频免费播放 | 天天综合网国产 | 国产一区二区在线免费观看 | 欧美性色xo影院 | 美女黄色网在线播放 | 国产综合精品一区二区三区 | av在线小说| 欧美极品少妇xbxb性爽爽视频 | 日韩极品在线 | 欧美精品乱码久久久久久按摩 | 久久99精品久久久久久三级 | 成人在线观看影院 | 亚洲精品乱码久久久久久9色 | av成人资源| 日韩精品免费一线在线观看 | 免费三级黄色片 | 亚洲精品视频在线观看免费 | 久久在线观看 | 欧美日韩xxx | 免费观看www7722午夜电影 | 色偷偷男人的天堂av | 色综合久久久网 | 99久热在线精品 | 国模视频一区二区三区 | 久草精品在线播放 | 少妇资源站 | 日韩精选在线观看 | 日韩高清免费电影 | 亚洲精品在线网站 | 中文字幕在线第一页 | 国产九九精品视频 | 999国内精品永久免费视频 | 免费国产在线视频 | 久久久国产精品麻豆 | 日日摸日日添夜夜爽97 | 国产精品久久久久久久午夜 | 中文十次啦 | 精品黄色在线 | 国产精品乱码久久久 | 欧美在一区 | 日韩精品在线视频免费观看 | 四虎成人网| 久产久精国产品 | 天天操天天干天天玩 | 欧美日韩另类在线观看 | 亚洲精品乱码久久久久久高潮 | 精品专区一区二区 | 99在线国产| 亚洲最新视频在线播放 | 在线观看一区视频 | 天天爽综合网 | 免费在线激情电影 | 亚洲2019精品| 91九色成人 | 91精品视频在线 | 九九精品视频在线观看 | 天天草综合网 | 中文字幕av免费在线观看 | 天堂v中文 | 精品亚洲午夜久久久久91 | 日韩av看片 | 五月天婷婷在线播放 | 国产在线色 | 综合网中文字幕 | 人人爽人人做 | 中文字幕一区二区三区精华液 | 久久天天躁夜夜躁狠狠躁2022 | 91日韩国产| 狠狠天天 | 色综合久久综合网 | 水蜜桃亚洲一二三四在线 | 国产大陆亚洲精品国产 | 一区二区三区免费在线观看视频 | 中文字幕在线中文 | 69国产在线观看 | 蜜臀精品久久久久久蜜臀 | 久久久久久蜜桃一区二区 | 亚洲精品黄色在线观看 | 色偷偷88欧美精品久久久 | 久久久久99精品成人片三人毛片 | 九色琪琪久久综合网天天 | 亚洲综合网 | 日韩,精品电影 | 在线观看国产永久免费视频 | 激情综合一区 | 成人免费在线视频观看 | 久久久久一区二区三区 | 国产露脸91国语对白 | 2019精品手机国产品在线 | 亚洲精品国产成人 | 99精品免费网 | 亚洲精品国产成人 | 国产最新视频在线观看 | 日韩在线不卡视频 | 一级免费黄色 | 亚洲国产精品激情在线观看 | 精品一区二区电影 | 一区二区影院 | 韩国在线一区二区 | 日韩电影一区二区在线 | 欧美精品在线视频 | 日本丰满少妇免费一区 | 亚洲免费成人 | 2024国产精品视频 | 久久这里| 成人av网页 | 午夜在线免费观看 | 色丁香久久 | 超碰成人av | 五月婷婷播播 | 狠狠躁日日躁狂躁夜夜躁av | 91精彩在线视频 | 精品国产a | 国产五月 | 精品在线观 | 在线色视频小说 | 99久久99热这里只有精品 | 国产视频一区在线播放 | 国产中文字幕网 | 激情av在线资源 | 91精品国产自产在线观看 | 97超碰人人网 | 成年人免费在线观看网站 | 91三级在线观看 | www.av小说| 蜜桃av人人夜夜澡人人爽 | 中文在线免费看视频 | 欧美在线视频免费 | 免费日韩一区二区三区 | 婷婷精品国产一区二区三区日韩 | 麻豆精品视频 | 九月婷婷综合网 | 手机在线看片日韩 | 亚洲一级片免费观看 | 丁香婷婷深情五月亚洲 | 美女视频久久久 | 国产成人精品a | 黄a在线 | 成人电影毛片 | 免费手机黄色网址 | 91视频高清 | 黄色av一级 | 免费看黄在线观看 | 99久久精品国产一区二区成人 | 六月色丁香 | 午夜精品福利一区二区三区蜜桃 | 久久免费播放视频 | 最新亚洲视频 | 在线天堂中文www视软件 | 日本激情视频中文字幕 | 免费a v视频 | 日韩免费视频一区二区 | 精品国产成人在线 | 亚洲一区尤物 | 欧美少妇xxx | 丁香导航 | 99超碰在线观看 | 91网址在线 | 伊人婷婷激情 | 精品久久国产 | 精品亚洲一区二区三区 | 麻豆视频免费播放 | 成人久久18免费网站图片 | 日本乱码在线 | 在线观看一 | 欧美精品中文字幕亚洲专区 | 欧美精品在线一区二区 | 开心激情五月网 | 成人午夜在线观看 | 亚洲91在线| www国产在线 | 一级黄毛片 | 99精品在线播放 | 字幕网在线观看 | a黄色片| 探花视频免费观看 | 日韩欧美在线高清 | www看片网站 | 亚洲 在线 | 中文字幕av有码 |