久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Ranklib源码剖析--LambdaMart

發布時間:2024/7/19 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ranklib源码剖析--LambdaMart 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Ranklib是一套優秀的Learning to Rank領域的開源實現,其中有實現了MART,RankNet,RankBoost,LambdaMart,Random Forest等模型。其中由微軟發布的LambdaMART是IR業內常用的Learning to Rank模型,本文主要介紹Ranklib中的LambdaMART模型的具體實現,用以幫助理解paper中闡述的方法。本文是基于version2.3版本的Ranklib來介紹的。

LambdaMart的基本原理詳見之前的博客:http://www.cnblogs.com/bentuwuying/p/6690836.html。要知道LambdaMart是基于MART的,而MART又是由若干棵regression tree組合而成的。所以,我們先來看看Ranklib中是如何實現regression tree的,以及在給定training data with labels的情況下,regression tree是如何擬合的。

1. regression tree

regression tree擬合給定training data的步驟總結概括如下:

RegressionTreenodes #限制一棵樹的最大葉子節點數minLeafSupport #控制分裂的次數,如果某個節點所包含的訓練數據小于2*minLeafSupport ,則該節點不再分裂root #根節點leaves #葉子節點list 構造函數RegressionTree(int nLeaves, DataPoint[] trainingSamples, double[] labels, FeatureHistogram hist, int minLeafSupport)對各個類變量進行初始化fit #對training data進行擬合regression tree 新建一個隊列queue,用于按隊列順序(即按層遍歷的順序)進行分裂初始化一個regression tree的根節點rootroot.split #根節點分裂hist.findBestSplit #調用Split對象包含的FeatureHistogram對象的分裂方法(在該節點的已經統計好的特征統計直方圖的基礎上,尋找最佳分裂點,進行分裂,再計算左右子節點的特征統計直方圖,并對左右子節點進行初始化) 判斷deviance,為0則分裂不成功根據samplingRate決定usedFeatures(分裂時需要使用的features的索引)調用內部的findBestSplit方法在一個節點上,在usedFeatures中,根據該節點的特征統計直方圖,來進行分裂時feature和threshold的選擇S = sumLeft * sumLeft / countLeft + sumRight * sumRight / countRight對每個可選的劃分點(feature和threshold組合),求最大的S值,對應于均方誤差最小,是最優的劃分點判斷劃分是否成功,若S=-1,則分裂不成功對該節點上的每個訓練數據,根據最優分裂點,進行左右子節點的分配初始化分裂后左右子節點各自的特征統計直方圖construct #一般用作父節點分裂后產生的左子節點的特征統計直方圖的構造函數(當使用父節點來構造時,thresholds數組不變,但是sum和count數組需要重新構造)construct #一般用作父節點分裂后產生的右子節點的特征統計直方圖的構造函數 計算本節點和左右子節點的均方誤差sp.set #調用FeatureHistogram對象所在的Split對象的方法 一般在該節點進行分裂完成后,設定分裂時的featureID,threshold,deviance只有非葉子節點才會進行分裂(調用這個方法),所以只有非葉子節點的featureID不為-1,葉子節點由于沒有調用這個方法,故featureID=-1初始化左子節點(根據分裂到左子節點的訓練數據索引數組,左子節點的特征統計直方圖,左子節點的均方誤差,左子節點的訓練數據label之和),并設置到當前節點的左子節點變量上初始化右子節點(根據分裂到右子節點的訓練數據索引數組,右子節點的特征統計直方圖,右子節點的均方誤差,右子節點的訓練數據label之和),并設置到當前節點的右子節點變量上insert #將左右的子節點插入隊列,用于下面遍歷 按均方誤差從大到小的順序進行插入隊列循環:按隊列順序(即按層遍歷的順序)進行分裂,再將每次能夠成功分裂的產生的兩個子節點插入隊列中根據根節點root的leaves類方法(迭代遍歷),設置regression tree的leaves類變量

?

下面是regression tree擬合過程中涉及到的幾個類文件代碼,關鍵部分都有添加了詳細的注釋。

?

1. FeatureHistogram

1 package ciir.umass.edu.learning.tree; 2 import java.util.ArrayList; 3 import java.util.Arrays; 4 import java.util.List; 5 import java.util.Random; 6 import ciir.umass.edu.learning.DataPoint; 7 import ciir.umass.edu.utilities.MyThreadPool; 8 import ciir.umass.edu.utilities.WorkerThread; 9 /** 10 * @author vdang 11 */ 12 //特征直方圖類,對RankList對象進行特征的直方圖統計,選擇每次split時最優的feature和劃分點 13 public class FeatureHistogram { 14 // 存放分裂時的featureIdx,thresholdIdx,以及評判是否最佳分裂的評分值sumLeft*sumLeft/countLeft + sumRight*sumRight/countRight 15 class Config { 16 int featureIdx = -1; 17 int thresholdIdx = -1; 18 double S = -1; 19 } 20 21 //Parameter 22 public static float samplingRate = 1; //采樣率,用于對分裂時使用的feature個數進行采樣,不使用所有的feature 23 24 //Variables 25 public int[] features = null; //feature數組,每個元素是一個feature id(fid) 26 public float[][] thresholds = null; //二維數組,第一維是feature,下標是相應的features的下標,不是feature id;第二維是閾值,個數為所有訓練數據在此feature上的value的去重個數,從小到大排序的不重復值,用于對此節點的訓練數據在此feature上分裂時可選的feature value閾值 27 public double[][] sum = null; //二維數組,第一維是feature,下標是相應的features的下標,不是feature id;第二維是label之和,是所有訓練數據中在此feature上的value小于等于相應位置的threshold值(thresholds[i][j])的DataPoint的label之和,sum二維數組大小與thresholds數組相同 28 public double sumResponse = 0; //所有的訓練數據的label之和 29 public double sqSumResponse = 0; //所有的訓練數據的label的平方和 30 public int[][] count = null; //二維數組,第一維是feature,下標是相應的features的下標,不是feature id;第二維是個數,是所有訓練數據中在此feature上的value小于等于相應位置的threshold值(thresholds[i][j])的DataPoint的個數,count二維數組大小與thresholds數組相同 31 public int[][] sampleToThresholdMap = null; //二維數組,第一維是feature,下標是相應的features的下標,不是feature id;第二維是索引,是對應訓練數據samples[i][j]在特定feature上每個訓練數據的value對應于其在thresholds數組中相應行的列索引位置 32 33 //whether to re-use its parents @sum and @count instead of cleaning up the parent and re-allocate for the children. 34 //@sum and @count of any intermediate tree node (except for root) can be re-used. 35 private boolean reuseParent = false; 36 37 public FeatureHistogram() 38 { 39 40 } 41 42 //FeatureHistogram構造函數(1-1),一般用作整棵樹/根節點的feature histogram,計算該節點的特征統計直方圖 43 //@samples: 訓練數據 44 //@labels: 訓練數據的label 45 //@sampleSortedIdx: 將樣本根據特征排序,方便做樹的分列時快速找出最優分列點,sorted list of samples by each feature, need initializing only once,初始化可見LambdaMART.java中的init() 46 //@features: 訓練數據的特征集合 47 //@thresholds: 創建存放候選閾值(分列點)的表,a table of candidate thresolds for each feature, we will select the best tree split from these candidates later on 48 ,初始化可見LambdaMART.java中的init(),此二維數組的每一行的最后一列的值是后加的,為Float.MAX_VALUE 49 public void construct(DataPoint[] samples, double[] labels, int[][] sampleSortedIdx, int[] features, float[][] thresholds) 50 { 51 this.features = features; 52 this.thresholds = thresholds; 53 54 sumResponse = 0; 55 sqSumResponse = 0; 56 57 sum = new double[features.length][]; 58 count = new int[features.length][]; 59 sampleToThresholdMap = new int[features.length][]; 60 61 //確定是否使用多線程計算 62 MyThreadPool p = MyThreadPool.getInstance(); 63 if(p.size() == 1) 64 construct(samples, labels, sampleSortedIdx, thresholds, 0, features.length-1); 65 else 66 p.execute(new Worker(this, samples, labels, sampleSortedIdx, thresholds), features.length); 67 } 68 //FeatureHistogram構造函數(1-2),被(1-1)調用 69 protected void construct(DataPoint[] samples, double[] labels, int[][] sampleSortedIdx, float[][] thresholds, int start, int end) 70 { 71 for(int i=start;i<=end;i++) //對于每個feature 72 { 73 int fid = features[i]; // 獲取feature id 74 //get the list of samples associated with this node (sorted in ascending order with respect to the current feature) 75 int[] idx = sampleSortedIdx[i]; //根據此feature下的value從小到大排序后的訓練數據的索引數組 76 77 double sumLeft = 0; //累計此值,用于給sumLabel使用 78 float[] threshold = thresholds[i]; 79 double[] sumLabel = new double[threshold.length]; //對應前面sum二維數組的一行 80 int[] c = new int[threshold.length]; //對應前面count二維數組的一行 81 int[] stMap = new int[samples.length]; //對應前面sampleToThresholdMap二維數組的一行 82 83 int last = -1; 84 for(int t=0;t<threshold.length;t++) //對于每個可選的split閾值 85 { 86 int j=last+1; 87 //find the first sample that exceeds the current threshold 88 for(;j<idx.length;j++) 89 { 90 int k = idx[j]; //獲取此DataPoint在samples數組中的索引 91 if(samples[k].getFeatureValue(fid) > threshold[t]) 92 break; 93 sumLeft += labels[k]; 94 if(i == 0) 95 { 96 sumResponse += labels[k]; 97 sqSumResponse += labels[k] * labels[k]; 98 } 99 stMap[k] = t; 100 } 101 last = j-1; 102 sumLabel[t] = sumLeft; 103 c[t] = last+1; 104 } 105 sampleToThresholdMap[i] = stMap; 106 sum[i] = sumLabel; 107 count[i] = c; 108 } 109 } 110 111 //update(1-1), update the histogram with these training labels (the feature histogram will be used to find the best tree split) 112 protected void update(double[] labels) 113 { 114 sumResponse = 0; 115 sqSumResponse = 0; 116 117 118 //確定是否使用多線程計算 119 MyThreadPool p = MyThreadPool.getInstance(); 120 if(p.size() == 1) 121 update(labels, 0, features.length-1); 122 else 123 p.execute(new Worker(this, labels), features.length); 124 } 125 126 //update(1-2),被(1-1)調用 127 protected void update(double[] labels, int start, int end) 128 { 129 for(int f=start;f<=end;f++) 130 Arrays.fill(sum[f], 0); 131 for(int k=0;k<labels.length;k++) 132 { 133 for(int f=start;f<=end;f++) 134 { 135 int t = sampleToThresholdMap[f][k]; 136 sum[f][t] += labels[k]; 137 if(f == 0) 138 { 139 sumResponse += labels[k]; 140 sqSumResponse += labels[k]*labels[k]; 141 } 142 //count doesn't change, so no need to re-compute 143 } 144 } 145 for(int f=start;f<=end;f++) 146 { 147 for(int t=1;t<thresholds[f].length;t++) 148 sum[f][t] += sum[f][t-1]; 149 } 150 } 151 152 //FeatureHistogram構造函數(2-1),一般用作父節點分裂后產生的左子節點的特征統計直方圖的構造函數 153 //當使用父節點來構造時,thresholds數組不變,但是sum和count數組需要重新構造 154 //@soi: 使用的訓練數據的索引位置 155 public void construct(FeatureHistogram parent, int[] soi, double[] labels) 156 { 157 this.features = parent.features; 158 this.thresholds = parent.thresholds; 159 sumResponse = 0; 160 sqSumResponse = 0; 161 sum = new double[features.length][]; 162 count = new int[features.length][]; 163 sampleToThresholdMap = parent.sampleToThresholdMap; 164 165 166 //確定是否使用多線程計算 167 MyThreadPool p = MyThreadPool.getInstance(); 168 if(p.size() == 1) 169 construct(parent, soi, labels, 0, features.length-1); 170 else 171 p.execute(new Worker(this, parent, soi, labels), features.length); 172 } 173 174 //FeatureHistogram構造函數(2-2),被(2-1)調用 175 protected void construct(FeatureHistogram parent, int[] soi, double[] labels, int start, int end) 176 { 177 //init 178 for(int i=start;i<=end;i++) 179 { 180 float[] threshold = thresholds[i]; 181 sum[i] = new double[threshold.length]; 182 count[i] = new int[threshold.length]; 183 Arrays.fill(sum[i], 0); 184 Arrays.fill(count[i], 0); 185 } 186 187 //update 188 for(int i=0;i<soi.length;i++) 189 { 190 int k = soi[i]; 191 for(int f=start;f<=end;f++) 192 { 193 int t = sampleToThresholdMap[f][k]; 194 sum[f][t] += labels[k]; 195 count[f][t] ++; 196 if(f == 0) 197 { 198 sumResponse += labels[k]; 199 sqSumResponse += labels[k]*labels[k]; 200 } 201 } 202 } 203 204 for(int f=start;f<=end;f++) 205 { 206 for(int t=1;t<thresholds[f].length;t++) 207 { 208 sum[f][t] += sum[f][t-1]; 209 count[f][t] += count[f][t-1]; 210 } 211 } 212 } 213 214 //FeatureHistogram構造函數(3-1),一般用作父節點分裂后產生的右子節點的特征統計直方圖的構造函數 215 public void construct(FeatureHistogram parent, FeatureHistogram leftSibling, boolean reuseParent) 216 { 217 this.reuseParent = reuseParent; 218 this.features = parent.features; 219 this.thresholds = parent.thresholds; 220 sumResponse = parent.sumResponse - leftSibling.sumResponse; 221 sqSumResponse = parent.sqSumResponse - leftSibling.sqSumResponse; 222 223 if(reuseParent) 224 { 225 sum = parent.sum; 226 count = parent.count; 227 } 228 else 229 { 230 sum = new double[features.length][]; 231 count = new int[features.length][]; 232 } 233 sampleToThresholdMap = parent.sampleToThresholdMap; 234 235 //確定是否使用多線程計算 236 MyThreadPool p = MyThreadPool.getInstance(); 237 if(p.size() == 1) 238 construct(parent, leftSibling, 0, features.length-1); 239 else 240 p.execute(new Worker(this, parent, leftSibling), features.length); 241 } 242 243 //FeatureHistogram構造函數(3-2),被(3-1)調用 244 protected void construct(FeatureHistogram parent, FeatureHistogram leftSibling, int start, int end) 245 { 246 for(int f=start;f<=end;f++) 247 { 248 float[] threshold = thresholds[f]; 249 if(!reuseParent) 250 { 251 sum[f] = new double[threshold.length]; 252 count[f] = new int[threshold.length]; 253 } 254 for(int t=0;t<threshold.length;t++) 255 { 256 sum[f][t] = parent.sum[f][t] - leftSibling.sum[f][t]; 257 count[f][t] = parent.count[f][t] - leftSibling.count[f][t]; 258 } 259 } 260 } 261 262 //findBestSplit函數(1-2),被(1-1)調用。在一個節點上,在usedFeatures中,根據該節點的特征統計直方圖,來進行分裂時feature和threshold的選擇 263 protected Config findBestSplit(int[] usedFeatures, int minLeafSupport, int start, int end) 264 { 265 Config cfg = new Config(); 266 int totalCount = count[start][count[start].length-1]; 267 for(int f=start;f<=end;f++) 268 { 269 int i = usedFeatures[f]; 270 float[] threshold = thresholds[i]; 271 272 for(int t=0;t<threshold.length;t++) 273 { 274 int countLeft = count[i][t]; 275 int countRight = totalCount - countLeft; 276 if(countLeft < minLeafSupport || countRight < minLeafSupport) 277 continue; 278 279 double sumLeft = sum[i][t]; 280 double sumRight = sumResponse - sumLeft; 281 282 double S = sumLeft * sumLeft / countLeft + sumRight * sumRight / countRight; 283 //求最大的S值,對應于均方誤差最小,是最優的劃分點 284 if(cfg.S < S) 285 { 286 cfg.S = S; 287 cfg.featureIdx = i; 288 cfg.thresholdIdx = t; 289 } 290 } 291 } 292 return cfg; 293 } 294 295 //findBestSplit函數(1-1),在該節點的已經統計好的特征統計直方圖的基礎上,尋找最佳分裂點,進行分裂,再計算左右子節點的特征統計直方圖,并對左右子節點進行初始化 296 public boolean findBestSplit(Split sp, double[] labels, int minLeafSupport) 297 { 298 if(sp.getDeviance() >= 0.0 && sp.getDeviance() <= 0.0)//equals 0 299 return false;//no need to split 300 301 int[] usedFeatures = null;//index of the features to be used for tree splitting 302 if(samplingRate < 1)//need to do sub sampling (feature sampling) 303 { 304 int size = (int)(samplingRate * features.length); 305 usedFeatures = new int[size]; 306 //put all features into a pool 307 List<Integer> fpool = new ArrayList<Integer>(); 308 for(int i=0;i<features.length;i++) 309 fpool.add(i); 310 //do sampling, without replacement 311 Random r = new Random(); 312 for(int i=0;i<size;i++) 313 { 314 int sel = r.nextInt(fpool.size()); 315 usedFeatures[i] = fpool.get(sel); 316 fpool.remove(sel); 317 } 318 } 319 else//no sub-sampling, all features will be used 320 { 321 usedFeatures = new int[features.length]; 322 for(int i=0;i<features.length;i++) 323 usedFeatures[i] = i; 324 } 325 326 //find the best split 327 Config best = new Config(); 328 //確定是否使用多線程 329 MyThreadPool p = MyThreadPool.getInstance(); 330 if(p.size() == 1) 331 best = findBestSplit(usedFeatures, minLeafSupport, 0, usedFeatures.length-1); 332 else 333 { 334 WorkerThread[] workers = p.execute(new Worker(this, usedFeatures, minLeafSupport), usedFeatures.length); 335 for(int i=0;i<workers.length;i++) 336 { 337 Worker wk = (Worker)workers[i]; 338 if(best.S < wk.cfg.S) 339 best = wk.cfg; 340 } 341 } 342 343 if(best.S == -1)//unsplitable, for some reason... 344 return false; 345 346 //if(minS >= sp.getDeviance()) 347 //return null; 348 349 double[] sumLabel = sum[best.featureIdx]; 350 int[] sampleCount = count[best.featureIdx]; 351 352 double s = sumLabel[sumLabel.length-1]; 353 int c = sampleCount[sumLabel.length-1]; 354 355 double sumLeft = sumLabel[best.thresholdIdx]; 356 int countLeft = sampleCount[best.thresholdIdx]; 357 358 double sumRight = s - sumLeft; 359 int countRight = c - countLeft; 360 361 int[] left = new int[countLeft]; 362 int[] right = new int[countRight]; 363 int l = 0; 364 int r = 0; 365 int k = 0; 366 int[] idx = sp.getSamples(); 367 //對該節點上的每個訓練數據,根據最優分裂點,進行左右子節點的分配 368 for(int j=0;j<idx.length;j++) 369 { 370 k = idx[j]; 371 if(sampleToThresholdMap[best.featureIdx][k] <= best.thresholdIdx)//go to the left 372 left[l++] = k; 373 else//go to the right 374 right[r++] = k; 375 } 376 377 //初始化分裂后左右子節點各自的特征統計直方圖 378 FeatureHistogram lh = new FeatureHistogram(); 379 lh.construct(sp.hist, left, labels); //初始化左子節點的特征統計直方圖 380 FeatureHistogram rh = new FeatureHistogram(); 381 rh.construct(sp.hist, lh, !sp.isRoot()); //初始化右子節點的特征統計直方圖 382 double var = sqSumResponse - sumResponse * sumResponse / idx.length; //計算本節點的均方誤差 383 double varLeft = lh.sqSumResponse - lh.sumResponse * lh.sumResponse / left.length; //計算左子節點的均方誤差 384 double varRight = rh.sqSumResponse - rh.sumResponse * rh.sumResponse / right.length; //計算右子節點的均方誤差 385 386 sp.set(features[best.featureIdx], thresholds[best.featureIdx][best.thresholdIdx], var); 387 sp.setLeft(new Split(left, lh, varLeft, sumLeft)); 388 sp.setRight(new Split(right, rh, varRight, sumRight)); 389 390 sp.clearSamples(); //清理本節點所屬的sortedSampleIDs,samples,hist等數據 391 392 return true; 393 } 394 class Worker extends WorkerThread { 395 FeatureHistogram fh = null; 396 int type = -1; 397 398 //find best split (type == 0) 399 int[] usedFeatures = null; 400 int minLeafSup = -1; 401 Config cfg = null; 402 403 //update (type = 1) 404 double[] labels = null; 405 406 //construct (type = 2) 407 FeatureHistogram parent = null; 408 int[] soi = null; 409 410 //construct (type = 3) 411 FeatureHistogram leftSibling = null; 412 413 //construct (type = 4) 414 DataPoint[] samples; 415 int[][] sampleSortedIdx; 416 float[][] thresholds; 417 418 public Worker() 419 { 420 } 421 public Worker(FeatureHistogram fh, int[] usedFeatures, int minLeafSup) 422 { 423 type = 0; 424 this.fh = fh; 425 this.usedFeatures = usedFeatures; 426 this.minLeafSup = minLeafSup; 427 } 428 public Worker(FeatureHistogram fh, double[] labels) 429 { 430 type = 1; 431 this.fh = fh; 432 this.labels = labels; 433 } 434 public Worker(FeatureHistogram fh, FeatureHistogram parent, int[] soi, double[] labels) 435 { 436 type = 2; 437 this.fh = fh; 438 this.parent = parent; 439 this.soi = soi; 440 this.labels = labels; 441 } 442 public Worker(FeatureHistogram fh, FeatureHistogram parent, FeatureHistogram leftSibling) 443 { 444 type = 3; 445 this.fh = fh; 446 this.parent = parent; 447 this.leftSibling = leftSibling; 448 } 449 public Worker(FeatureHistogram fh, DataPoint[] samples, double[] labels, int[][] sampleSortedIdx, float[][] thresholds) 450 { 451 type = 4; 452 this.fh = fh; 453 this.samples = samples; 454 this.labels = labels; 455 this.sampleSortedIdx = sampleSortedIdx; 456 this.thresholds = thresholds; 457 } 458 public void run() 459 { 460 if(type == 0) 461 cfg = fh.findBestSplit(usedFeatures, minLeafSup, start, end); 462 else if(type == 1) 463 fh.update(labels, start, end); 464 else if(type == 2) 465 fh.construct(parent, soi, labels, start, end); 466 else if(type == 3) 467 fh.construct(parent, leftSibling, start, end); 468 else if(type == 4) 469 fh.construct(samples, labels, sampleSortedIdx, thresholds, start, end); 470 } 471 public WorkerThread clone() 472 { 473 Worker wk = new Worker(); 474 wk.fh = fh; 475 wk.type = type; 476 477 //find best split (type == 0) 478 wk.usedFeatures = usedFeatures; 479 wk.minLeafSup = minLeafSup; 480 //wk.cfg = cfg; 481 482 //update (type = 1) 483 wk.labels = labels; 484 485 //construct (type = 2) 486 wk.parent = parent; 487 wk.soi = soi; 488 489 //construct (type = 3) 490 wk.leftSibling = leftSibling; 491 492 //construct (type = 1) 493 wk.samples = samples; 494 wk.sampleSortedIdx = sampleSortedIdx; 495 wk.thresholds = thresholds; 496 497 return wk; 498 } 499 } 500 }

?

2. Split

1 package ciir.umass.edu.learning.tree; 2 import java.util.ArrayList; 3 import java.util.List; 4 import ciir.umass.edu.learning.DataPoint; 5 /** 6 * 7 * @author vdang 8 * 9 */ 10 //Tree node,節點類,用于: 11 // 1)訓練時候的分裂判斷(利用FeatureHistogram類); 12 // 2)存儲該節點的分裂規則(featureID,threshold)以及該節點的輸出(avgLabel,deviance等) 13 public class Split { 14 //Key attributes of a split (tree node) 15 //存儲該節點的分裂規則(featureID,threshold)以及該節點的輸出(avgLabel,deviance等) 16 private int featureID = -1; 17 private float threshold = 0F; 18 private double avgLabel = 0.0F; 19 20 //Intermediate variables (ONLY used during learning) 21 //*DO NOT* attempt to access them once the training is done 22 private boolean isRoot = false; 23 private double sumLabel = 0.0; 24 private double sqSumLabel = 0.0; 25 private Split left = null; 26 private Split right = null; 27 private double deviance = 0F;//mean squared error "S" 28 private int[][] sortedSampleIDs = null; 29 public int[] samples = null;//訓練時候,該節點上的訓練數據集的索引 30 public FeatureHistogram hist = null;//訓練時候,該節點上的訓練數據集的特征統計直方圖 31 32 public Split() 33 { 34 35 } 36 public Split(int featureID, float threshold, double deviance) 37 { 38 this.featureID = featureID; 39 this.threshold = threshold; 40 this.deviance = deviance; 41 } 42 public Split(int[][] sortedSampleIDs, double deviance, double sumLabel, double sqSumLabel) 43 { 44 this.sortedSampleIDs = sortedSampleIDs; 45 this.deviance = deviance; 46 this.sumLabel = sumLabel; 47 this.sqSumLabel = sqSumLabel; 48 avgLabel = sumLabel/sortedSampleIDs[0].length; 49 } 50 public Split(int[] samples, FeatureHistogram hist, double deviance, double sumLabel) 51 { 52 this.samples = samples; 53 this.hist = hist; 54 this.deviance = deviance; 55 this.sumLabel = sumLabel; 56 avgLabel = sumLabel/samples.length; 57 } 58 59 //一般在該節點進行分裂完成后,設定分裂時的featureID,threshold,deviance。 60 //只有非葉子節點才會進行分裂(調用這個方法),所以只有非葉子節點的featureID不為-1,葉子節點由于沒有調用這個方法,故featureID=-1 61 public void set(int featureID, float threshold, double deviance) 62 { 63 this.featureID = featureID; 64 this.threshold = threshold; 65 this.deviance = deviance; 66 } 67 public void setLeft(Split s) 68 { 69 left = s; 70 } 71 public void setRight(Split s) 72 { 73 right = s; 74 } 75 public void setOutput(float output) 76 { 77 avgLabel = output; 78 } 79 80 public Split getLeft() 81 { 82 return left; 83 } 84 public Split getRight() 85 { 86 return right; 87 } 88 public double getDeviance() 89 { 90 return deviance; 91 } 92 public double getOutput() 93 { 94 return avgLabel; 95 } 96 97 //得到此節點(一般是根節點)下的所有葉子節點的list 98 //采用了遞歸的方法,碰到葉子節點(featureID=-1)則加入到list中,否則遞歸地調用leaves(list), 99 public List<Split> leaves() 100 { 101 List<Split> list = new ArrayList<Split>(); 102 leaves(list); 103 return list; 104 } 105 private void leaves(List<Split> leaves) 106 { 107 if(featureID == -1) 108 leaves.add(this); 109 else 110 { 111 left.leaves(leaves); 112 right.leaves(leaves); 113 } 114 } 115 116 //得到一個DataPoint在此節點(一般是根節點)下的最終落入(每層都按照分裂規則進入下一層)的葉子節點的輸出值(avgLabel值) 117 public double eval(DataPoint dp) 118 { 119 Split n = this; 120 while(n.featureID != -1) 121 { 122 if(dp.getFeatureValue(n.featureID) <= n.threshold) 123 n = n.left; 124 else 125 n = n.right; 126 } 127 return n.avgLabel; 128 } 129 130 public String toString() 131 { 132 return toString(""); 133 } 134 public String toString(String indent) 135 { 136 String strOutput = indent + "<split>" + "\n"; 137 strOutput += getString(indent + "\t"); 138 strOutput += indent + "</split>" + "\n"; 139 return strOutput; 140 } 141 public String getString(String indent) 142 { 143 String strOutput = ""; 144 if(featureID == -1) 145 { 146 strOutput += indent + "<output> " + avgLabel + " </output>" + "\n"; 147 } 148 else 149 { 150 strOutput += indent + "<feature> " + featureID + " </feature>" + "\n"; 151 strOutput += indent + "<threshold> " + threshold + " </threshold>" + "\n"; 152 strOutput += indent + "<split pos=\"left\">" + "\n"; 153 strOutput += left.getString(indent + "\t"); 154 strOutput += indent + "</split>" + "\n"; 155 strOutput += indent + "<split pos=\"right\">" + "\n"; 156 strOutput += right.getString(indent + "\t"); 157 strOutput += indent + "</split>" + "\n"; 158 } 159 return strOutput; 160 } 161 //Internal functions(ONLY used during learning) 162 //*DO NOT* attempt to call them once the training is done 163 //*重要*,訓練時候,在該節點上進行分裂,調用了該節點的特征統計直方圖對象的方法findBestSplit 164 public boolean split(double[] trainingLabels, int minLeafSupport) 165 { 166 return hist.findBestSplit(this, trainingLabels, minLeafSupport); 167 } 168 public int[] getSamples() 169 { 170 if(sortedSampleIDs != null) 171 return sortedSampleIDs[0]; 172 return samples; 173 } 174 public int[][] getSampleSortedIndex() 175 { 176 return sortedSampleIDs; 177 } 178 public double getSumLabel() 179 { 180 return sumLabel; 181 } 182 public double getSqSumLabel() 183 { 184 return sqSumLabel; 185 } 186 public void clearSamples() 187 { 188 sortedSampleIDs = null; 189 samples = null; 190 hist = null; 191 } 192 public void setRoot(boolean isRoot) 193 { 194 this.isRoot = isRoot; 195 } 196 public boolean isRoot() 197 { 198 return isRoot; 199 } 200 }

?

3. RegressionTree

1 package ciir.umass.edu.learning.tree; 2 import java.util.ArrayList; 3 import java.util.List; 4 import ciir.umass.edu.learning.DataPoint; 5 /** 6 * @author vdang 7 */ 8 //回歸樹類 9 public class RegressionTree { 10 11 //Parameters 12 protected int nodes = 10;//-1 for unlimited number of nodes (the size of the tree will then be controlled *ONLY* by minLeafSupport) 13 protected int minLeafSupport = 1; //控制分裂的次數,如果某個節點所包含的訓練數據小于2*minLeafSupport ,則該節點不再分裂 14 15 //Member variables and functions 16 protected Split root = null; //根節點 17 protected List<Split> leaves = null; //葉子節點list 18 19 protected DataPoint[] trainingSamples = null; 20 protected double[] trainingLabels = null; 21 protected int[] features = null; 22 protected float[][] thresholds = null; //二維數組,第一維是feature,下標是相應的features的下標,不是feature id;第二維是閾值,個數為所有訓練數據在此feature上的value的去重個數,從小到大排序的不重復值,用于對此節點的訓練數據在此feature上分裂時可選的feature value閾值 23 protected int[] index = null; 24 protected FeatureHistogram hist = null; 25 26 public RegressionTree(Split root) 27 { 28 this.root = root; 29 leaves = root.leaves(); 30 } 31 public RegressionTree(int nLeaves, DataPoint[] trainingSamples, double[] labels, FeatureHistogram hist, int minLeafSupport) 32 { 33 this.nodes = nLeaves; 34 this.trainingSamples = trainingSamples; 35 this.trainingLabels = labels; 36 this.hist = hist; 37 this.minLeafSupport = minLeafSupport; 38 index = new int[trainingSamples.length]; 39 for(int i=0;i<trainingSamples.length;i++) 40 index[i] = i; 41 } 42 43 /** 44 * Fit the tree from the specified training data 45 */ 46 public void fit() 47 { 48 List<Split> queue = new ArrayList<Split>(); //用于按隊列順序(即按層遍歷的順序)進行分裂 49 root = new Split(index, hist, Float.MAX_VALUE, 0); //回歸樹的根節點 50 root.setRoot(true); 51 root.split(trainingLabels, minLeafSupport); //根節點分裂1次,下面多了2個子節點 52 insert(queue, root.getLeft()); //將左子節點插入隊列,用于下面遍歷 53 insert(queue, root.getRight()); //將右子節點插入隊列,用于下面遍歷 54 //循環:按隊列順序(即按層遍歷的順序)進行分裂,再將每次能夠成功分裂的產生的兩個子節點插入隊列中 55 int taken = 0; 56 while( (nodes == -1 || taken + queue.size() < nodes) && queue.size() > 0) 57 { 58 Split leaf = queue.get(0); 59 queue.remove(0); 60 61 if(leaf.getSamples().length < 2 * minLeafSupport) 62 { 63 taken++; 64 continue; 65 } 66 67 if(!leaf.split(trainingLabels, minLeafSupport))//unsplitable (i.e. variance(s)==0; or after-split variance is higher than before) 對每個遍歷到的節點,進行1次分裂,下面多了2個子節點 68 taken++; 69 else 70 { 71 insert(queue, leaf.getLeft()); //將左子節點插入隊列,用于下面遍歷 72 insert(queue, leaf.getRight()); //將右子節點插入隊列,用于下面遍歷 73 } 74 } 75 leaves = root.leaves(); 76 } 77 78 /** 79 * Get the tree output for the input sample 80 * @param dp 81 * @return 82 */ 83 public double eval(DataPoint dp) 84 { 85 return root.eval(dp); 86 } 87 /** 88 * Retrieve all leave nodes in the tree 89 * @return 90 */ 91 public List<Split> leaves() 92 { 93 return leaves; 94 } 95 /** 96 * Clear samples associated with each leaves (when they are no longer necessary) in order to save memory 97 */ 98 public void clearSamples() 99 { 100 trainingSamples = null; 101 trainingLabels = null; 102 features = null; 103 thresholds = null; 104 index = null; 105 hist = null; 106 for(int i=0;i<leaves.size();i++) 107 leaves.get(i).clearSamples(); 108 } 109 110 /** 111 * Generate the string representation of the tree 112 */ 113 public String toString() 114 { 115 if(root != null) 116 return root.toString(); 117 return ""; 118 } 119 public String toString(String indent) 120 { 121 if(root != null) 122 return root.toString(indent); 123 return ""; 124 } 125 126 public double variance() 127 { 128 double var = 0; 129 for(int i=0;i<leaves.size();i++) 130 var += leaves.get(i).getDeviance(); 131 return var; 132 } 133 protected void insert(List<Split> ls, Split s) 134 { 135 int i=0; 136 while(i < ls.size()) 137 { 138 if(ls.get(i).getDeviance() > s.getDeviance()) //按均方誤差從大到小的順序進行插入隊列 139 i++; 140 else 141 break; 142 } 143 ls.add(i, s); 144 } 145 }

?

2. LambdaMart

LambdaMart模型訓練過程總結概括如下:

1 LambdaMart 2 init 3 初始化訓練數據:martSamples,modelScores,pseudoResponses,weights 4 將樣本根據特征排序,方便做樹的分裂時快速找出最優分裂點:sortedIdx 5 初始化二維數組:thresholds(第一維是feature,下標是相應的features的下標,不是feature id;第二維是閾值,個數為所有訓練數據在此feature上的value的去重個數,從小到大排序的不重復值,用于對此節點的訓練數據在此feature上分裂時可選的feature value閾值) 6 hist.construct #根據訓練數據以及thresholds二維數組,初始化一個FeatureHistogram對象,用于構造整體數據的特征統計直方圖,用于在根節點上進行分裂 7 初始化: 8 sum #二維數組,第一維是feature,下標是相應的features的下標,不是feature id;第二維是label之和,是所有訓練數據中在此feature上的value小于等于相應位置的threshold值(thresholds[i][j])的DataPoint的label之和,sum二維數組大小與thresholds數組相同 9 count #二維數組,第一維是feature,下標是相應的features的下標,不是feature id;第二維是個數,是所有訓練數據中在此feature上的value小于等于相應位置的threshold值(thresholds[i][j])的DataPoint的個數,count二維數組大小與thresholds數組相同 10 sampleToThresholdMap #二維數組,第一維是feature,下標是相應的features的下標,不是feature id;第二維是索引,是對應訓練數據samples[i][j]在特定feature上每個訓練數據的value對應于其在thresholds數組中相應行的列索引位置 11 sumResponse #所有的訓練數據的label之和 12 sqSumResponse #所有的訓練數據的label的平方和 13 learn 14 初始化一個Ensemble對象ensemble 15 開始Gradient Boosting過程,即依次構造若干棵regression tree: 16 computePseudoResponses #計算本輪迭代中,每個instance需要擬合的pseudo responses值(即梯度值,lambda) 17 根據LambdaMart的梯度計算公式進行計算 18 hist.update #根據本輪迭代中計算得到的pseudo responses值(即梯度值,lambda),更新特征統計直方圖,因為只改變了training data中每個instance的label,而其他值(如features)并未改變 19 初始化一棵regression tree(根據訓練數據和特征統計直方圖) 20 rt.fit #用regression tree對訓練數據+本輪迭代中的pseudo responses值(即梯度值,lambda)進行擬合 21 將本輪迭代擬合產生的regression tree加入到ensembel對象中 22 updateTreeOutput #更新本輪迭代中擬合數據的regression tree的各個葉子節點的輸出 23 計算本輪迭代后(新regression tree已經加入到集成模型中),training data中各個instance的預測分:modelScores 24 computeModelScoreOnTraining #計算本輪迭代后,最新模型對于training data總體的排序評價分(例如NDCG) 25 計算本輪迭代后(新regression tree已經加入到集成模型中),validation data中各個instance的預測分:modelScoresOnValidation 26 computeModelScoreOnValidation #計算本輪迭代后,最新模型對于validation data總體的排序評價分(例如NDCG) 27 更新在validation data上的歷次各個模型的最優排序評價分:bestScoreOnValidationData,以及最優模型編號:bestModelOnValidation 28 如果在連續若干輪迭代中,模型在validation data上的排序評價分都沒有提高,則終止迭代 29 回滾到在驗證集上的最優模型 30 計算最優模型在training data和validation data上的排序評價分

?

下面是LambdaMart訓練過程的代碼,關鍵部分都有添加了詳細的注釋。

?

1. LambdaMART

1 package ciir.umass.edu.learning.tree; 2 import ciir.umass.edu.learning.DataPoint; 3 import ciir.umass.edu.learning.RankList; 4 import ciir.umass.edu.learning.Ranker; 5 import ciir.umass.edu.metric.MetricScorer; 6 import ciir.umass.edu.utilities.MergeSorter; 7 import ciir.umass.edu.utilities.MyThreadPool; 8 import ciir.umass.edu.utilities.RankLibError; 9 import ciir.umass.edu.utilities.SimpleMath; 10 import java.io.BufferedReader; 11 import java.io.StringReader; 12 import java.util.ArrayList; 13 import java.util.Arrays; 14 import java.util.List; 15 /** 16 * @author vdang 17 * 18 * This class implements LambdaMART. 19 * Q. Wu, C.J.C. Burges, K. Svore and J. Gao. Adapting Boosting for Information Retrieval Measures. 20 * Journal of Information Retrieval, 2007. 21 */ 22 public class LambdaMART extends Ranker { 23 //Parameters 24 public static int nTrees = 1000;//the number of trees 25 public static float learningRate = 0.1F;//or shrinkage 26 public static int nThreshold = 256; 27 public static int nRoundToStopEarly = 100;//If no performance gain on the *VALIDATION* data is observed in #rounds, stop the training process right away. 28 public static int nTreeLeaves = 10; 29 public static int minLeafSupport = 1; 30 31 //for debugging 32 public static int gcCycle = 100; 33 34 //Local variables 35 protected float[][] thresholds = null; 36 protected Ensemble ensemble = null; 37 protected double[] modelScores = null;//on training data 38 39 protected double[][] modelScoresOnValidation = null; 40 protected int bestModelOnValidation = Integer.MAX_VALUE-2; 41 42 //Training instances prepared for MART 43 protected DataPoint[] martSamples = null;//Need initializing only once 44 protected int[][] sortedIdx = null;//sorted list of samples in @martSamples by each feature -- Need initializing only once 45 protected FeatureHistogram hist = null; 46 protected double[] pseudoResponses = null;//different for each iteration 47 protected double[] weights = null;//different for each iteration 48 49 public LambdaMART() 50 { 51 } 52 public LambdaMART(List<RankList> samples, int[] features, MetricScorer scorer) 53 { 54 super(samples, features, scorer); 55 } 56 57 public void init() 58 { 59 PRINT("Initializing... "); 60 //initialize samples for MART 61 int dpCount = 0; 62 for(int i=0;i<samples.size();i++) 63 { 64 RankList rl = samples.get(i); 65 dpCount += rl.size(); 66 } 67 int current = 0; 68 martSamples = new DataPoint[dpCount]; 69 modelScores = new double[dpCount]; 70 pseudoResponses = new double[dpCount]; 71 weights = new double[dpCount]; 72 for(int i=0;i<samples.size();i++) 73 { 74 RankList rl = samples.get(i); 75 for(int j=0;j<rl.size();j++) 76 { 77 martSamples[current+j] = rl.get(j); 78 modelScores[current+j] = 0.0F; 79 pseudoResponses[current+j] = 0.0F; 80 weights[current+j] = 0; 81 } 82 current += rl.size(); 83 } 84 85 //sort (MART) samples by each feature so that we can quickly retrieve a sorted list of samples by any feature later on. 86 // 將樣本根據特征排序,方便做樹的分裂時快速找出最優分裂點 87 sortedIdx = new int[features.length][]; 88 MyThreadPool p = MyThreadPool.getInstance(); 89 if(p.size() == 1)//single-thread 90 sortSamplesByFeature(0, features.length-1); 91 else//multi-thread 92 { 93 int[] partition = p.partition(features.length); 94 for(int i=0;i<partition.length-1;i++) 95 p.execute(new SortWorker(this, partition[i], partition[i+1]-1)); 96 p.await(); 97 } 98 99 //Create a table of candidate thresholds (for each feature). Later on, we will select the best tree split from these candidates // 創建存放候選閾值(分裂點)的表 100 thresholds = new float[features.length][]; 101 for(int f=0;f<features.length;f++) 102 { 103 //For this feature, keep track of the list of unique values and the max/min 104 List<Float> values = new ArrayList<Float>(); 105 float fmax = Float.NEGATIVE_INFINITY; 106 float fmin = Float.MAX_VALUE; 107 for(int i=0;i<martSamples.length;i++) 108 { 109 int k = sortedIdx[f][i];//get samples sorted with respect to this feature 110 float fv = martSamples[k].getFeatureValue(features[f]); 111 values.add(fv); 112 if(fmax < fv) 113 fmax = fv; 114 if(fmin > fv) 115 fmin = fv; 116 //skip all samples with the same feature value 117 int j=i+1; 118 while(j < martSamples.length) 119 { 120 if(martSamples[sortedIdx[f][j]].getFeatureValue(features[f]) > fv) 121 break; 122 j++; 123 } 124 i = j-1;//[i, j] gives the range of samples with the same feature value 125 } 126 127 if(values.size() <= nThreshold || nThreshold == -1) 128 { 129 thresholds[f] = new float[values.size()+1]; 130 for(int i=0;i<values.size();i++) 131 thresholds[f][i] = values.get(i); 132 thresholds[f][values.size()] = Float.MAX_VALUE; 133 } 134 else 135 { 136 float step = (Math.abs(fmax - fmin))/nThreshold; 137 thresholds[f] = new float[nThreshold+1]; 138 thresholds[f][0] = fmin; 139 for(int j=1;j<nThreshold;j++) 140 thresholds[f][j] = thresholds[f][j-1] + step; 141 thresholds[f][nThreshold] = Float.MAX_VALUE; 142 } 143 } 144 145 if(validationSamples != null) 146 { 147 modelScoresOnValidation = new double[validationSamples.size()][]; 148 for(int i=0;i<validationSamples.size();i++) 149 { 150 modelScoresOnValidation[i] = new double[validationSamples.get(i).size()]; 151 Arrays.fill(modelScoresOnValidation[i], 0); 152 } 153 } 154 155 //compute the feature histogram (this is used to speed up the procedure of finding the best tree split later on) 156 // 計算特征直方圖,加速尋找分裂點 157 hist = new FeatureHistogram(); 158 hist.construct(martSamples, pseudoResponses, sortedIdx, features, thresholds); 159 //we no longer need the sorted indexes of samples 160 sortedIdx = null; 161 162 System.gc(); 163 PRINTLN("[Done]"); 164 } 165 public void learn() 166 { 167 ensemble = new Ensemble(); 168 169 PRINTLN("---------------------------------"); 170 PRINTLN("Training starts..."); 171 PRINTLN("---------------------------------"); 172 PRINTLN(new int[]{7, 9, 9}, new String[]{"#iter", scorer.name()+"-T", scorer.name()+"-V"}); 173 PRINTLN("---------------------------------"); 174 175 //Start the gradient boosting process 176 for(int m=0; m<nTrees; m++) 177 { 178 PRINT(new int[]{7}, new String[]{(m+1)+""}); 179 180 //Compute lambdas (which act as the "pseudo responses") 181 //Create training instances for MART: 182 // - Each document is a training sample 183 // - The lambda for this document serves as its training label 184 // 計算lambdas (pseudo responses) 185 computePseudoResponses(); 186 187 //update the histogram with these training labels (the feature histogram will be used to find the best tree split) 188 // 根據新的label更新特征直方圖 189 hist.update(pseudoResponses); 190 191 //Fit a regression tree 192 // 回歸決策樹 193 RegressionTree rt = new RegressionTree(nTreeLeaves, martSamples, pseudoResponses, hist, minLeafSupport); 194 rt.fit(); 195 196 //Add this tree to the ensemble (our model) 197 // 將新生成的樹加入模型 198 ensemble.add(rt, learningRate); 199 //update the outputs of the tree (with gamma computed using the Newton-Raphson method) 200 // 更新樹的輸出 201 updateTreeOutput(rt); 202 203 //Update the model's outputs on all training samples 204 // 更新所有訓練樣本的模型輸出 205 List<Split> leaves = rt.leaves(); 206 for(int i=0;i<leaves.size();i++) 207 { 208 Split s = leaves.get(i); 209 int[] idx = s.getSamples(); 210 for(int j=0;j<idx.length;j++) 211 modelScores[idx[j]] += learningRate * s.getOutput(); 212 } 213 //clear references to data that is no longer used 214 rt.clearSamples(); 215 216 //beg the garbage collector to work... 217 if(m % gcCycle == 0) 218 System.gc();//this call is expensive. We shouldn't do it too often. 219 //Evaluate the current model 220 // 評價模型 221 scoreOnTrainingData = computeModelScoreOnTraining(); 222 //**** NOTE **** 223 //The above function to evaluate the current model on the training data is equivalent to a single call: 224 // 225 // scoreOnTrainingData = scorer.score(rank(samples); 226 // 227 //However, this function is more efficient since it uses the cached outputs of the model (as opposed to re-evaluating the model 228 //on the entire training set). 229 230 PRINT(new int[]{9}, new String[]{SimpleMath.round(scoreOnTrainingData, 4) + ""}); 231 232 //Evaluate the current model on the validation data (if available) 233 if(validationSamples != null) 234 { 235 //Update the model's scores on all validation samples 236 for(int i=0;i<modelScoresOnValidation.length;i++) 237 for(int j=0;j<modelScoresOnValidation[i].length;j++) 238 modelScoresOnValidation[i][j] += learningRate * rt.eval(validationSamples.get(i).get(j)); 239 240 //again, equivalent to scoreOnValidation=scorer.score(rank(validationSamples)), but more efficient since we use the cached models' outputs 241 double score = computeModelScoreOnValidation(); 242 243 PRINT(new int[]{9}, new String[]{SimpleMath.round(score, 4) + ""}); 244 if(score > bestScoreOnValidationData) 245 { 246 bestScoreOnValidationData = score; 247 bestModelOnValidation = ensemble.treeCount()-1; 248 } 249 } 250 251 PRINTLN(""); 252 253 //Should we stop early? 254 // 檢驗是否提前結束 255 if(m - bestModelOnValidation > nRoundToStopEarly) 256 break; 257 } 258 259 //Rollback to the best model observed on the validation data 260 // 回滾到在驗證集上的最優模型 261 while(ensemble.treeCount() > bestModelOnValidation+1) 262 ensemble.remove(ensemble.treeCount()-1); 263 264 //Finishing up 265 scoreOnTrainingData = scorer.score(rank(samples)); 266 PRINTLN("---------------------------------"); 267 PRINTLN("Finished sucessfully."); 268 PRINTLN(scorer.name() + " on training data: " + SimpleMath.round(scoreOnTrainingData, 4)); 269 if(validationSamples != null) 270 { 271 bestScoreOnValidationData = scorer.score(rank(validationSamples)); 272 PRINTLN(scorer.name() + " on validation data: " + SimpleMath.round(bestScoreOnValidationData, 4)); 273 } 274 PRINTLN("---------------------------------"); 275 } 276 public double eval(DataPoint dp) 277 { 278 return ensemble.eval(dp); 279 } 280 public Ranker createNew() 281 { 282 return new LambdaMART(); 283 } 284 public String toString() 285 { 286 return ensemble.toString(); 287 } 288 public String model() 289 { 290 String output = "## " + name() + "\n"; 291 output += "## No. of trees = " + nTrees + "\n"; 292 output += "## No. of leaves = " + nTreeLeaves + "\n"; 293 output += "## No. of threshold candidates = " + nThreshold + "\n"; 294 output += "## Learning rate = " + learningRate + "\n"; 295 output += "## Stop early = " + nRoundToStopEarly + "\n"; 296 output += "\n"; 297 output += toString(); 298 return output; 299 } 300 @Override 301 public void loadFromString(String fullText) 302 { 303 try { 304 String content = ""; 305 //String model = ""; 306 StringBuffer model = new StringBuffer (); 307 BufferedReader in = new BufferedReader(new StringReader(fullText)); 308 while((content = in.readLine()) != null) 309 { 310 content = content.trim(); 311 if(content.length() == 0) 312 continue; 313 if(content.indexOf("##")==0) 314 continue; 315 //actual model component 316 //model += content; 317 model.append (content); 318 } 319 in.close(); 320 //load the ensemble 321 ensemble = new Ensemble(model.toString()); 322 features = ensemble.getFeatures(); 323 } 324 catch(Exception ex) 325 { 326 throw RankLibError.create("Error in LambdaMART::load(): ", ex); 327 } 328 } 329 public void printParameters() 330 { 331 PRINTLN("No. of trees: " + nTrees); 332 PRINTLN("No. of leaves: " + nTreeLeaves); 333 PRINTLN("No. of threshold candidates: " + nThreshold); 334 PRINTLN("Min leaf support: " + minLeafSupport); 335 PRINTLN("Learning rate: " + learningRate); 336 PRINTLN("Stop early: " + nRoundToStopEarly + " rounds without performance gain on validation data"); 337 } 338 public String name() 339 { 340 return "LambdaMART"; 341 } 342 public Ensemble getEnsemble() 343 { 344 return ensemble; 345 } 346 347 protected void computePseudoResponses() 348 { 349 Arrays.fill(pseudoResponses, 0F); 350 Arrays.fill(weights, 0); 351 MyThreadPool p = MyThreadPool.getInstance(); 352 if(p.size() == 1)//single-thread 353 computePseudoResponses(0, samples.size()-1, 0); 354 else //multi-threading 355 { 356 List<LambdaComputationWorker> workers = new ArrayList<LambdaMART.LambdaComputationWorker>(); 357 //divide the entire dataset into chunks of equal size for each worker thread 358 int[] partition = p.partition(samples.size()); 359 int current = 0; 360 for(int i=0;i<partition.length-1;i++) 361 { 362 //execute the worker 363 LambdaComputationWorker wk = new LambdaComputationWorker(this, partition[i], partition[i+1]-1, current); 364 workers.add(wk);//keep it so we can get back results from it later on 365 p.execute(wk); 366 367 if(i < partition.length-2) 368 for(int j=partition[i]; j<=partition[i+1]-1;j++) 369 current += samples.get(j).size(); 370 } 371 372 //wait for all workers to complete before we move on to the next stage 373 p.await(); 374 } 375 } 376 protected void computePseudoResponses(int start, int end, int current) 377 { 378 int cutoff = scorer.getK(); 379 //compute the lambda for each document (a.k.a "pseudo response") 380 for(int i=start;i<=end;i++) 381 { 382 RankList orig = samples.get(i); 383 int[] idx = MergeSorter.sort(modelScores, current, current+orig.size()-1, false); 384 RankList rl = new RankList(orig, idx, current); 385 double[][] changes = scorer.swapChange(rl); 386 //NOTE: j, k are indices in the sorted (by modelScore) list, not the original 387 // ==> need to map back with idx[j] and idx[k] 388 for(int j=0;j<rl.size();j++) 389 { 390 DataPoint p1 = rl.get(j); 391 int mj = idx[j]; 392 for(int k=0;k<rl.size();k++) 393 { 394 if(j > cutoff && k > cutoff)//swaping these pair won't result in any change in target measures since they're below the cut-off point 395 break; 396 DataPoint p2 = rl.get(k); 397 int mk = idx[k]; 398 if(p1.getLabel() > p2.getLabel()) 399 { 400 double deltaNDCG = Math.abs(changes[j][k]); 401 if(deltaNDCG > 0) 402 { 403 double rho = 1.0 / (1 + Math.exp(modelScores[mj] - modelScores[mk])); 404 double lambda = rho * deltaNDCG; 405 pseudoResponses[mj] += lambda; 406 pseudoResponses[mk] -= lambda; 407 double delta = rho * (1.0 - rho) * deltaNDCG; 408 weights[mj] += delta; 409 weights[mk] += delta; 410 } 411 } 412 } 413 } 414 current += orig.size(); 415 } 416 } 417 protected void updateTreeOutput(RegressionTree rt) 418 { 419 List<Split> leaves = rt.leaves(); 420 for(int i=0;i<leaves.size();i++) 421 { 422 float s1 = 0F; 423 float s2 = 0F; 424 Split s = leaves.get(i); 425 int[] idx = s.getSamples(); 426 for(int j=0;j<idx.length;j++) 427 { 428 int k = idx[j]; 429 s1 += pseudoResponses[k]; 430 s2 += weights[k]; 431 } 432 if(s2 == 0) 433 s.setOutput(0); 434 else 435 s.setOutput(s1/s2); 436 } 437 } 438 protected int[] sortSamplesByFeature(DataPoint[] samples, int fid) 439 { 440 double[] score = new double[samples.length]; 441 for(int i=0;i<samples.length;i++) 442 score[i] = samples[i].getFeatureValue(fid); 443 int[] idx = MergeSorter.sort(score, true); 444 return idx; 445 } 446 /** 447 * This function is equivalent to the inherited function rank(...), but it uses the cached model's outputs instead of computing them from scratch. 448 * @param rankListIndex 449 * @param current 450 * @return 451 */ 452 protected RankList rank(int rankListIndex, int current) 453 { 454 RankList orig = samples.get(rankListIndex); 455 double[] scores = new double[orig.size()]; 456 for(int i=0;i<scores.length;i++) 457 scores[i] = modelScores[current+i]; 458 int[] idx = MergeSorter.sort(scores, false); 459 return new RankList(orig, idx); 460 } 461 protected float computeModelScoreOnTraining() 462 { 463 /*float s = 0; 464 int current = 0; 465 MyThreadPool p = MyThreadPool.getInstance(); 466 if(p.size() == 1)//single-thread 467 s = computeModelScoreOnTraining(0, samples.size()-1, current); 468 else 469 { 470 List<Worker> workers = new ArrayList<Worker>(); 471 //divide the entire dataset into chunks of equal size for each worker thread 472 int[] partition = p.partition(samples.size()); 473 for(int i=0;i<partition.length-1;i++) 474 { 475 //execute the worker 476 Worker wk = new Worker(this, partition[i], partition[i+1]-1, current); 477 workers.add(wk);//keep it so we can get back results from it later on 478 p.execute(wk); 479 480 if(i < partition.length-2) 481 for(int j=partition[i]; j<=partition[i+1]-1;j++) 482 current += samples.get(j).size(); 483 } 484 //wait for all workers to complete before we move on to the next stage 485 p.await(); 486 for(int i=0;i<workers.size();i++) 487 s += workers.get(i).score; 488 }*/ 489 float s = computeModelScoreOnTraining(0, samples.size()-1, 0); 490 s = s / samples.size(); 491 return s; 492 } 493 protected float computeModelScoreOnTraining(int start, int end, int current) 494 { 495 float s = 0; 496 int c = current; 497 for(int i=start;i<=end;i++) 498 { 499 s += scorer.score(rank(i, c)); 500 c += samples.get(i).size(); 501 } 502 return s; 503 } 504 protected float computeModelScoreOnValidation() 505 { 506 /*float score = 0; 507 MyThreadPool p = MyThreadPool.getInstance(); 508 if(p.size() == 1)//single-thread 509 score = computeModelScoreOnValidation(0, validationSamples.size()-1); 510 else 511 { 512 List<Worker> workers = new ArrayList<Worker>(); 513 //divide the entire dataset into chunks of equal size for each worker thread 514 int[] partition = p.partition(validationSamples.size()); 515 for(int i=0;i<partition.length-1;i++) 516 { 517 //execute the worker 518 Worker wk = new Worker(this, partition[i], partition[i+1]-1); 519 workers.add(wk);//keep it so we can get back results from it later on 520 p.execute(wk); 521 } 522 //wait for all workers to complete before we move on to the next stage 523 p.await(); 524 for(int i=0;i<workers.size();i++) 525 score += workers.get(i).score; 526 }*/ 527 float score = computeModelScoreOnValidation(0, validationSamples.size()-1); 528 return score/validationSamples.size(); 529 } 530 protected float computeModelScoreOnValidation(int start, int end) 531 { 532 float score = 0; 533 for(int i=start;i<=end;i++) 534 { 535 int[] idx = MergeSorter.sort(modelScoresOnValidation[i], false); 536 score += scorer.score(new RankList(validationSamples.get(i), idx)); 537 } 538 return score; 539 } 540 541 protected void sortSamplesByFeature(int fStart, int fEnd) 542 { 543 for(int i=fStart;i<=fEnd; i++) 544 sortedIdx[i] = sortSamplesByFeature(martSamples, features[i]); 545 } 546 //For multi-threading processing 547 class SortWorker implements Runnable { 548 LambdaMART ranker = null; 549 int start = -1; 550 int end = -1; 551 SortWorker(LambdaMART ranker, int start, int end) 552 { 553 this.ranker = ranker; 554 this.start = start; 555 this.end = end; 556 } 557 public void run() 558 { 559 ranker.sortSamplesByFeature(start, end); 560 } 561 } 562 class LambdaComputationWorker implements Runnable { 563 LambdaMART ranker = null; 564 int rlStart = -1; 565 int rlEnd = -1; 566 int martStart = -1; 567 LambdaComputationWorker(LambdaMART ranker, int rlStart, int rlEnd, int martStart) 568 { 569 this.ranker = ranker; 570 this.rlStart = rlStart; 571 this.rlEnd = rlEnd; 572 this.martStart = martStart; 573 } 574 public void run() 575 { 576 ranker.computePseudoResponses(rlStart, rlEnd, martStart); 577 } 578 } 579 class Worker implements Runnable { 580 LambdaMART ranker = null; 581 int rlStart = -1; 582 int rlEnd = -1; 583 int martStart = -1; 584 int type = -1; 585 586 //compute score on validation 587 float score = 0; 588 589 Worker(LambdaMART ranker, int rlStart, int rlEnd) 590 { 591 type = 3; 592 this.ranker = ranker; 593 this.rlStart = rlStart; 594 this.rlEnd = rlEnd; 595 } 596 Worker(LambdaMART ranker, int rlStart, int rlEnd, int martStart) 597 { 598 type = 4; 599 this.ranker = ranker; 600 this.rlStart = rlStart; 601 this.rlEnd = rlEnd; 602 this.martStart = martStart; 603 } 604 public void run() 605 { 606 if(type == 4) 607 score = ranker.computeModelScoreOnTraining(rlStart, rlEnd, martStart); 608 else if(type == 3) 609 score = ranker.computeModelScoreOnValidation(rlStart, rlEnd); 610 } 611 } 612 }

?

版權聲明:

?? 本文由笨兔勿應所有,發布于http://www.cnblogs.com/bentuwuying。如果轉載,請注明出處,在未經作者同意下將本文用于商業用途,將追究其法律責任。

?

轉載于:https://www.cnblogs.com/bentuwuying/p/6701027.html

總結

以上是生活随笔為你收集整理的Ranklib源码剖析--LambdaMart的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

欧美日韩一区二区免费视频 | 亚洲小说图区综合在线 | 国产乱人无码伦av在线a | 中文久久乱码一区二区 | 色综合久久网 | 国产成人精品必看 | 国产国语老龄妇女a片 | 亚洲无人区午夜福利码高清完整版 | 国产精品久久久久影院嫩草 | ass日本丰满熟妇pics | 2020久久香蕉国产线看观看 | 成人亚洲精品久久久久软件 | 又大又黄又粗又爽的免费视频 | 亚洲中文字幕在线观看 | 亚洲精品久久久久久久久久久 | 婷婷五月综合激情中文字幕 | 免费看少妇作爱视频 | 国产午夜精品一区二区三区嫩草 | 性色欲网站人妻丰满中文久久不卡 | 国产乱人伦av在线无码 | 大地资源网第二页免费观看 | 久久久精品欧美一区二区免费 | 久青草影院在线观看国产 | 国产激情一区二区三区 | 亚洲人亚洲人成电影网站色 | 少妇被黑人到高潮喷出白浆 | 丝袜美腿亚洲一区二区 | 国产精品成人av在线观看 | 一区二区三区高清视频一 | 久久这里只有精品视频9 | 国产69精品久久久久app下载 | 无码吃奶揉捏奶头高潮视频 | 丰满人妻翻云覆雨呻吟视频 | 亚洲国精产品一二二线 | 国精产品一品二品国精品69xx | 人妻天天爽夜夜爽一区二区 | 亚洲国产精品无码一区二区三区 | 日日躁夜夜躁狠狠躁 | 呦交小u女精品视频 | 国产亚洲美女精品久久久2020 | 最新国产乱人伦偷精品免费网站 | 中文字幕av伊人av无码av | 荫蒂添的好舒服视频囗交 | 国产精品第一区揄拍无码 | 中文字幕精品av一区二区五区 | 日本高清一区免费中文视频 | 欧美三级不卡在线观看 | 国产香蕉尹人视频在线 | 精品乱码久久久久久久 | 狠狠色噜噜狠狠狠7777奇米 | 成人一区二区免费视频 | 97精品国产97久久久久久免费 | 九九久久精品国产免费看小说 | 嫩b人妻精品一区二区三区 | 亚洲色欲色欲欲www在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 人人妻人人藻人人爽欧美一区 | 国产av人人夜夜澡人人爽麻豆 | 性欧美videos高清精品 | 国产偷国产偷精品高清尤物 | 亚洲熟妇色xxxxx亚洲 | 日本精品久久久久中文字幕 | 性欧美大战久久久久久久 | 国产亚洲精品久久久久久久久动漫 | 内射爽无广熟女亚洲 | 在线精品亚洲一区二区 | 亚洲国产精品久久久久久 | 久久精品中文字幕一区 | 亚洲午夜久久久影院 | 亚洲一区二区三区香蕉 | 欧美性猛交内射兽交老熟妇 | 国产乱人伦av在线无码 | 亚洲精品一区二区三区四区五区 | 亚洲成a人片在线观看无码 | 自拍偷自拍亚洲精品10p | 国产在线精品一区二区高清不卡 | 精品久久久久久人妻无码中文字幕 | 欧美xxxxx精品 | 亚洲精品一区二区三区在线 | 亚洲日韩av片在线观看 | 精品国产一区av天美传媒 | 婷婷五月综合激情中文字幕 | 日欧一片内射va在线影院 | 亚洲а∨天堂久久精品2021 | 国产精品久久久久久无码 | yw尤物av无码国产在线观看 | 精品人人妻人人澡人人爽人人 | 色妞www精品免费视频 | 人人妻人人澡人人爽欧美一区九九 | 久久久久99精品国产片 | 亚洲狠狠婷婷综合久久 | 久久无码专区国产精品s | 国产熟妇另类久久久久 | 国产97人人超碰caoprom | 内射老妇bbwx0c0ck | 国产午夜无码精品免费看 | 国产精品久久精品三级 | 亚洲精品成人av在线 | 国产熟妇另类久久久久 | 国产舌乚八伦偷品w中 | 天堂а√在线中文在线 | 欧美xxxxx精品 | 精品国产麻豆免费人成网站 | 人妻有码中文字幕在线 | 国产精品久久久久久亚洲毛片 | 强开小婷嫩苞又嫩又紧视频 | 无码吃奶揉捏奶头高潮视频 | 精品国产国产综合精品 | 国产偷自视频区视频 | 亚洲乱码国产乱码精品精 | 大肉大捧一进一出好爽视频 | 无码av免费一区二区三区试看 | 久久国产自偷自偷免费一区调 | 高清不卡一区二区三区 | 欧美日本精品一区二区三区 | 欧美精品在线观看 | 亚洲日韩乱码中文无码蜜桃臀网站 | 欧美猛少妇色xxxxx | 欧美35页视频在线观看 | 久久久久av无码免费网 | 精品无人国产偷自产在线 | 亚洲综合另类小说色区 | 六十路熟妇乱子伦 | 青青草原综合久久大伊人精品 | 波多野42部无码喷潮在线 | 成人无码精品一区二区三区 | 亚洲а∨天堂久久精品2021 | 国产成人无码午夜视频在线观看 | 久久无码专区国产精品s | 精品人妻人人做人人爽夜夜爽 | √天堂中文官网8在线 | 玩弄中年熟妇正在播放 | 偷窥日本少妇撒尿chinese | 天天躁夜夜躁狠狠是什么心态 | 精品国产一区二区三区av 性色 | 小泽玛莉亚一区二区视频在线 | 色婷婷综合中文久久一本 | 兔费看少妇性l交大片免费 | 桃花色综合影院 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲综合精品香蕉久久网 | 国产两女互慰高潮视频在线观看 | 红桃av一区二区三区在线无码av | 国语精品一区二区三区 | 精品水蜜桃久久久久久久 | 久久婷婷五月综合色国产香蕉 | 青草视频在线播放 | 国产电影无码午夜在线播放 | 无码福利日韩神码福利片 | 成人一在线视频日韩国产 | 成 人 网 站国产免费观看 | 丰满人妻翻云覆雨呻吟视频 | 曰本女人与公拘交酡免费视频 | 男女猛烈xx00免费视频试看 | 国产免费无码一区二区视频 | 亚洲人成影院在线无码按摩店 | 欧美黑人乱大交 | 熟女少妇在线视频播放 | 无码人妻丰满熟妇区五十路百度 | 亚洲国产精品一区二区美利坚 | 免费无码av一区二区 | 内射欧美老妇wbb | 日日天日日夜日日摸 | 麻豆国产丝袜白领秘书在线观看 | 午夜熟女插插xx免费视频 | 兔费看少妇性l交大片免费 | 欧美性色19p | 捆绑白丝粉色jk震动捧喷白浆 | 国产精品va在线观看无码 | 人人妻人人澡人人爽人人精品浪潮 | 澳门永久av免费网站 | 天堂一区人妻无码 | 人妻少妇被猛烈进入中文字幕 | 国内揄拍国内精品人妻 | 国产av久久久久精东av | 亚洲国产一区二区三区在线观看 | 国产在线精品一区二区高清不卡 | 成人毛片一区二区 | 亚洲一区二区三区偷拍女厕 | 日本又色又爽又黄的a片18禁 | 国产精品美女久久久网av | 国产sm调教视频在线观看 | 久久久亚洲欧洲日产国码αv | 亚洲 激情 小说 另类 欧美 | 少妇久久久久久人妻无码 | 99久久久无码国产精品免费 | 欧美性生交xxxxx久久久 | 久久99精品久久久久久 | 国产成人无码午夜视频在线观看 | 97精品国产97久久久久久免费 | 奇米影视7777久久精品 | 青青久在线视频免费观看 | 亚洲国产精品毛片av不卡在线 | 少女韩国电视剧在线观看完整 | 亚洲精品成人av在线 | 六十路熟妇乱子伦 | 国产suv精品一区二区五 | 亚洲综合精品香蕉久久网 | 国产人妻精品一区二区三区不卡 | 一个人看的www免费视频在线观看 | 午夜性刺激在线视频免费 | 四虎影视成人永久免费观看视频 | 成熟女人特级毛片www免费 | 国产成人亚洲综合无码 | 国产激情一区二区三区 | 99视频精品全部免费免费观看 | 日本成熟视频免费视频 | 亚洲欧美日韩成人高清在线一区 | 久久99精品国产麻豆 | 伊人久久大香线焦av综合影院 | 国产在线精品一区二区三区直播 | 亚洲s码欧洲m码国产av | 亚洲aⅴ无码成人网站国产app | 色综合久久久无码网中文 | 巨爆乳无码视频在线观看 | 午夜成人1000部免费视频 | 在线播放亚洲第一字幕 | 国产97色在线 | 免 | 色诱久久久久综合网ywww | 国产97在线 | 亚洲 | 丝袜足控一区二区三区 | 日日橹狠狠爱欧美视频 | 中文字幕无码视频专区 | 欧美日韩久久久精品a片 | 亚洲精品美女久久久久久久 | 亚洲理论电影在线观看 | 久久精品国产一区二区三区肥胖 | 欧美 丝袜 自拍 制服 另类 | 无码午夜成人1000部免费视频 | 小泽玛莉亚一区二区视频在线 | 久久精品国产一区二区三区肥胖 | 性做久久久久久久久 | 久久午夜无码鲁丝片午夜精品 | 国产电影无码午夜在线播放 | 日韩人妻系列无码专区 | 暴力强奷在线播放无码 | 久久久久免费看成人影片 | 色综合久久88色综合天天 | 97久久精品无码一区二区 | 人妻天天爽夜夜爽一区二区 | 99re在线播放 | 日本饥渴人妻欲求不满 | 久久精品国产一区二区三区 | 高潮喷水的毛片 | 精品久久久久久亚洲精品 | 亚洲色www成人永久网址 | 国产偷自视频区视频 | 欧美日韩人成综合在线播放 | 最新版天堂资源中文官网 | 国产明星裸体无码xxxx视频 | 精品一区二区三区波多野结衣 | 国产成人精品久久亚洲高清不卡 | 欧美zoozzooz性欧美 | 六十路熟妇乱子伦 | 亚洲精品午夜无码电影网 | 久久久久久国产精品无码下载 | 日本肉体xxxx裸交 | 国产精品沙发午睡系列 | 98国产精品综合一区二区三区 | 久久国产劲爆∧v内射 | 无码一区二区三区在线观看 | 国产人妻精品午夜福利免费 | 激情综合激情五月俺也去 | 伊在人天堂亚洲香蕉精品区 | 无码人妻出轨黑人中文字幕 | 狠狠色噜噜狠狠狠7777奇米 | 亚洲一区二区三区播放 | 2020最新国产自产精品 | 亚洲中文字幕无码中文字在线 | 伊人久久大香线蕉午夜 | 亚洲狠狠婷婷综合久久 | 国内精品人妻无码久久久影院 | 性色av无码免费一区二区三区 | 亚洲欧美色中文字幕在线 | 免费观看激色视频网站 | 99久久精品国产一区二区蜜芽 | 男女下面进入的视频免费午夜 | 老熟妇乱子伦牲交视频 | 爆乳一区二区三区无码 | 国产亲子乱弄免费视频 | 无码成人精品区在线观看 | 国产亚洲精品久久久久久 | 夜夜躁日日躁狠狠久久av | 亚洲精品午夜无码电影网 | 激情五月综合色婷婷一区二区 | 日本精品高清一区二区 | 性史性农村dvd毛片 | 小鲜肉自慰网站xnxx | 欧美肥老太牲交大战 | 亚洲日韩中文字幕在线播放 | 国产精品国产三级国产专播 | 欧美日韩亚洲国产精品 | 麻豆果冻传媒2021精品传媒一区下载 | 波多野结衣乳巨码无在线观看 | 天天拍夜夜添久久精品大 | 欧美黑人巨大xxxxx | 国产猛烈高潮尖叫视频免费 | 久久精品人妻少妇一区二区三区 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲欧美日韩国产精品一区二区 | 国产精品久久久久久亚洲毛片 | 亚洲 欧美 激情 小说 另类 | 国产三级久久久精品麻豆三级 | 一本精品99久久精品77 | 亚洲大尺度无码无码专区 | 国产精品免费大片 | 久久精品中文闷骚内射 | 日韩精品无码一区二区中文字幕 | 日本一区二区三区免费高清 | 亚洲午夜福利在线观看 | 国产精品免费大片 | 老熟妇乱子伦牲交视频 | 亚洲日韩av片在线观看 | 亚洲成av人在线观看网址 | 久久99精品国产.久久久久 | 国产国语老龄妇女a片 | 亚洲娇小与黑人巨大交 | 国产又爽又黄又刺激的视频 | 伊人久久大香线焦av综合影院 | 丁香啪啪综合成人亚洲 | 日本www一道久久久免费榴莲 | 久久国产36精品色熟妇 | 无码人妻久久一区二区三区不卡 | 内射后入在线观看一区 | 亚洲性无码av中文字幕 | 欧美日韩一区二区免费视频 | 狠狠噜狠狠狠狠丁香五月 | 国产 精品 自在自线 | 国产人妻精品午夜福利免费 | 国产va免费精品观看 | 欧洲精品码一区二区三区免费看 | 亚洲熟妇色xxxxx欧美老妇 | 美女毛片一区二区三区四区 | 无码人妻丰满熟妇区五十路百度 | 日本饥渴人妻欲求不满 | 人妻中文无码久热丝袜 | 老子影院午夜精品无码 | 国产精品视频免费播放 | 亚洲成av人综合在线观看 | 无遮挡啪啪摇乳动态图 | 亚洲国产精品美女久久久久 | 国产综合色产在线精品 | 日日噜噜噜噜夜夜爽亚洲精品 | 人妻尝试又大又粗久久 | 四虎永久在线精品免费网址 | 婷婷色婷婷开心五月四房播播 | 熟女少妇人妻中文字幕 | 日韩精品无码一本二本三本色 | 精品日本一区二区三区在线观看 | 性色欲网站人妻丰满中文久久不卡 | 亚洲综合无码久久精品综合 | 国内精品人妻无码久久久影院蜜桃 | 亚洲国产一区二区三区在线观看 | 午夜精品一区二区三区在线观看 | 久久无码人妻影院 | 黑人巨大精品欧美黑寡妇 | 久久精品99久久香蕉国产色戒 | 香蕉久久久久久av成人 | 沈阳熟女露脸对白视频 | 免费乱码人妻系列无码专区 | 国产疯狂伦交大片 | 精品无码av一区二区三区 | 成人无码视频免费播放 | 性欧美videos高清精品 | 啦啦啦www在线观看免费视频 | 麻豆av传媒蜜桃天美传媒 | 欧美高清在线精品一区 | 国产三级久久久精品麻豆三级 | 亚洲人成影院在线观看 | 牲欲强的熟妇农村老妇女视频 | 国产一区二区三区四区五区加勒比 | 日韩少妇内射免费播放 | a片免费视频在线观看 | 亚洲经典千人经典日产 | 久久亚洲中文字幕无码 | 少妇无套内谢久久久久 | 色噜噜亚洲男人的天堂 | 中文字幕中文有码在线 | 无码精品人妻一区二区三区av | 无码人妻av免费一区二区三区 | 成人免费无码大片a毛片 | 精品人妻中文字幕有码在线 | 18禁止看的免费污网站 | 国产熟妇高潮叫床视频播放 | 67194成是人免费无码 | 亚洲娇小与黑人巨大交 | 少妇厨房愉情理9仑片视频 | 中文精品无码中文字幕无码专区 | 欧美日韩视频无码一区二区三 | 精品人人妻人人澡人人爽人人 | 在线精品国产一区二区三区 | 欧洲熟妇色 欧美 | 精品无码国产自产拍在线观看蜜 | 久久婷婷五月综合色国产香蕉 | 亚洲精品久久久久中文第一幕 | 丰满人妻一区二区三区免费视频 | 国产精品久久久久9999小说 | 久久综合网欧美色妞网 | 亚洲一区二区观看播放 | 国产午夜精品一区二区三区嫩草 | 国产片av国语在线观看 | 成年美女黄网站色大免费视频 | 人妻尝试又大又粗久久 | 国产小呦泬泬99精品 | 野外少妇愉情中文字幕 | 一本大道久久东京热无码av | 无码中文字幕色专区 | 国产成人无码区免费内射一片色欲 | 麻豆国产97在线 | 欧洲 | 国产精品免费大片 | 99久久亚洲精品无码毛片 | 欧美丰满少妇xxxx性 | 亚洲gv猛男gv无码男同 | 国产成人综合美国十次 | 清纯唯美经典一区二区 | 国产精品无码成人午夜电影 | 日本肉体xxxx裸交 | 好男人社区资源 | 人人妻人人藻人人爽欧美一区 | 亚洲男女内射在线播放 | 给我免费的视频在线观看 | 久9re热视频这里只有精品 | 精品久久久无码中文字幕 | 在线观看免费人成视频 | 老司机亚洲精品影院无码 | 亚洲欧美国产精品久久 | 欧美兽交xxxx×视频 | 精品一区二区不卡无码av | 黑人粗大猛烈进出高潮视频 | 国产精品久久久久9999小说 | 欧美精品免费观看二区 | 麻豆精品国产精华精华液好用吗 | 丰满少妇女裸体bbw | 日韩精品乱码av一区二区 | 日本xxxx色视频在线观看免费 | 亚洲第一无码av无码专区 | 亚洲成a人片在线观看无码 | 乱中年女人伦av三区 | 丰满护士巨好爽好大乳 | 丰满人妻精品国产99aⅴ | 永久免费观看美女裸体的网站 | 狠狠cao日日穞夜夜穞av | 国产电影无码午夜在线播放 | 在线观看国产一区二区三区 | 亚洲成熟女人毛毛耸耸多 | 成 人 网 站国产免费观看 | 99精品久久毛片a片 | 久久亚洲精品成人无码 | 久久综合色之久久综合 | 人妻无码久久精品人妻 | 麻豆国产丝袜白领秘书在线观看 | 99久久精品无码一区二区毛片 | 夫妻免费无码v看片 | 色综合久久久久综合一本到桃花网 | 黑人大群体交免费视频 | 中文字幕无码热在线视频 | 在线亚洲高清揄拍自拍一品区 | 性色av无码免费一区二区三区 | 日本精品少妇一区二区三区 | 久久久亚洲欧洲日产国码αv | √8天堂资源地址中文在线 | 蜜桃臀无码内射一区二区三区 | 久久精品国产一区二区三区肥胖 | 中文字幕人成乱码熟女app | 免费观看又污又黄的网站 | 国产精品亚洲专区无码不卡 | 色情久久久av熟女人妻网站 | 成人精品一区二区三区中文字幕 | 国产午夜视频在线观看 | 在线а√天堂中文官网 | 欧美丰满熟妇xxxx性ppx人交 | 波多野结衣av一区二区全免费观看 | 久久久精品国产sm最大网站 | 亚洲精品鲁一鲁一区二区三区 | 亚洲一区av无码专区在线观看 | 亚洲s码欧洲m码国产av | 国产成人综合美国十次 | 亚洲无人区一区二区三区 | 日本免费一区二区三区最新 | 亚洲国产精品无码一区二区三区 | 2019午夜福利不卡片在线 | 美女黄网站人色视频免费国产 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 男女性色大片免费网站 | 无码人妻少妇伦在线电影 | 免费男性肉肉影院 | 国产精品国产自线拍免费软件 | 女高中生第一次破苞av | 麻豆果冻传媒2021精品传媒一区下载 | 国产精品va在线播放 | 任你躁国产自任一区二区三区 | 亚洲精品一区二区三区大桥未久 | 亚洲精品无码国产 | 成人免费无码大片a毛片 | 18精品久久久无码午夜福利 | 中文字幕无线码 | 国产精品无码mv在线观看 | 麻豆国产人妻欲求不满谁演的 | 国产福利视频一区二区 | 亚洲高清偷拍一区二区三区 | 精品人妻av区 | 久久精品女人天堂av免费观看 | 亚洲精品综合一区二区三区在线 | 丰满人妻翻云覆雨呻吟视频 | 爆乳一区二区三区无码 | 久久天天躁夜夜躁狠狠 | 久久国产精品精品国产色婷婷 | 国产欧美熟妇另类久久久 | 大乳丰满人妻中文字幕日本 | 国产成人亚洲综合无码 | 特大黑人娇小亚洲女 | 国产suv精品一区二区五 | 国产成人亚洲综合无码 | 欧美成人午夜精品久久久 | 蜜桃臀无码内射一区二区三区 | 国产精品无码久久av | 强辱丰满人妻hd中文字幕 | 亚洲狠狠婷婷综合久久 | 精品无码av一区二区三区 | 国产精品无码成人午夜电影 | 捆绑白丝粉色jk震动捧喷白浆 | 麻豆人妻少妇精品无码专区 | 亚洲色大成网站www国产 | 18禁黄网站男男禁片免费观看 | 精品久久久无码中文字幕 | 久久综合色之久久综合 | 三上悠亚人妻中文字幕在线 | 欧美日韩精品 | 国产成人午夜福利在线播放 | 在线播放免费人成毛片乱码 | 国产无套内射久久久国产 | 国产农村乱对白刺激视频 | 亚洲乱码日产精品bd | 玩弄中年熟妇正在播放 | 亚洲精品中文字幕久久久久 | 久久亚洲a片com人成 | 一区二区三区乱码在线 | 欧洲 | 装睡被陌生人摸出水好爽 | 亚洲经典千人经典日产 | 亚洲国产欧美日韩精品一区二区三区 | 国产福利视频一区二区 | 装睡被陌生人摸出水好爽 | 国产精品无码一区二区三区不卡 | 中文精品无码中文字幕无码专区 | 暴力强奷在线播放无码 | 日韩精品一区二区av在线 | 日本丰满熟妇videos | 亚洲精品久久久久中文第一幕 | 东北女人啪啪对白 | 97无码免费人妻超级碰碰夜夜 | 亚洲中文字幕在线无码一区二区 | 亚洲人成网站色7799 | 免费无码的av片在线观看 | 欧美第一黄网免费网站 | 国产精品久久久久久无码 | 精品国产精品久久一区免费式 | 午夜肉伦伦影院 | 在线观看欧美一区二区三区 | 最新版天堂资源中文官网 | 国产又爽又猛又粗的视频a片 | 男人和女人高潮免费网站 | 又大又紧又粉嫩18p少妇 | 国产人妖乱国产精品人妖 | 国内少妇偷人精品视频 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国精品人妻无码一区二区三区蜜柚 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产熟妇另类久久久久 | 丝袜美腿亚洲一区二区 | 亚洲日韩av片在线观看 | 欧美老人巨大xxxx做受 | 人人澡人人妻人人爽人人蜜桃 | 精品无码成人片一区二区98 | 对白脏话肉麻粗话av | 少妇人妻av毛片在线看 | 亚洲日韩av一区二区三区中文 | 激情亚洲一区国产精品 | 久久人人爽人人爽人人片av高清 | 台湾无码一区二区 | 成人精品视频一区二区三区尤物 | 4hu四虎永久在线观看 | 丰满人妻翻云覆雨呻吟视频 | 欧美真人作爱免费视频 | 亚洲人成网站免费播放 | 18无码粉嫩小泬无套在线观看 | 无码精品国产va在线观看dvd | 高潮毛片无遮挡高清免费视频 | 欧美日本日韩 | 国产亚洲精品久久久久久大师 | 国精产品一品二品国精品69xx | 无码av岛国片在线播放 | 丰满岳乱妇在线观看中字无码 | 日韩人妻系列无码专区 | 乱人伦人妻中文字幕无码 | 亚洲国产精品成人久久蜜臀 | 伊人色综合久久天天小片 | 亚洲精品一区国产 | 秋霞成人午夜鲁丝一区二区三区 | 成 人 免费观看网站 | 成人毛片一区二区 | 又大又硬又爽免费视频 | 一二三四社区在线中文视频 | 中文字幕乱码亚洲无线三区 | 国产又粗又硬又大爽黄老大爷视 | 中文字幕无码免费久久9一区9 | 亚洲精品无码国产 | 免费网站看v片在线18禁无码 | 亚洲a无码综合a国产av中文 | 131美女爱做视频 | 国产一区二区三区四区五区加勒比 | 亚洲色偷偷男人的天堂 | 日韩精品无码免费一区二区三区 | 精品久久8x国产免费观看 | 人人妻人人澡人人爽精品欧美 | 免费人成在线视频无码 | 日日天干夜夜狠狠爱 | 国产农村妇女高潮大叫 | 国产热a欧美热a在线视频 | 一本色道久久综合狠狠躁 | 日韩精品无码一区二区中文字幕 | 1000部夫妻午夜免费 | 丰满肥臀大屁股熟妇激情视频 | 一本久久a久久精品亚洲 | 精品国产一区二区三区四区在线看 | 久久久精品欧美一区二区免费 | 在线播放无码字幕亚洲 | 亚洲欧美精品伊人久久 | 国产精品无码一区二区桃花视频 | 精品 日韩 国产 欧美 视频 | 国产精品无套呻吟在线 | 欧美成人高清在线播放 | 麻豆av传媒蜜桃天美传媒 | 少妇性荡欲午夜性开放视频剧场 | 激情亚洲一区国产精品 | 少妇邻居内射在线 | 狠狠躁日日躁夜夜躁2020 | 久久综合久久自在自线精品自 | 亚洲欧美日韩综合久久久 | 亚洲第一网站男人都懂 | 久久zyz资源站无码中文动漫 | 内射老妇bbwx0c0ck | 99riav国产精品视频 | 成人无码视频免费播放 | 2020久久香蕉国产线看观看 | 国产精品久久久久影院嫩草 | 亚洲乱亚洲乱妇50p | 无码av免费一区二区三区试看 | 国产欧美亚洲精品a | 久久国产精品精品国产色婷婷 | 亚洲欧美国产精品专区久久 | 欧美精品国产综合久久 | 小sao货水好多真紧h无码视频 | 午夜理论片yy44880影院 | 国产精品99爱免费视频 | 日本精品少妇一区二区三区 | 久久综合久久自在自线精品自 | 亚洲欧洲日本综合aⅴ在线 | 欧美丰满熟妇xxxx | 又紧又大又爽精品一区二区 | 在教室伦流澡到高潮hnp视频 | 亚洲成av人片在线观看无码不卡 | 大乳丰满人妻中文字幕日本 | 无码午夜成人1000部免费视频 | 欧美性色19p | 中文字幕乱码亚洲无线三区 | 国产av一区二区精品久久凹凸 | 欧美丰满熟妇xxxx性ppx人交 | 动漫av一区二区在线观看 | 18黄暴禁片在线观看 | 美女黄网站人色视频免费国产 | 久久久久免费看成人影片 | 欧美zoozzooz性欧美 | 自拍偷自拍亚洲精品10p | 国产亚洲人成a在线v网站 | 成人av无码一区二区三区 | 免费国产成人高清在线观看网站 | 麻豆国产丝袜白领秘书在线观看 | 99久久人妻精品免费二区 | 一本一道久久综合久久 | 亚洲国产精品成人久久蜜臀 | 精品无码一区二区三区爱欲 | 午夜肉伦伦影院 | 久久精品成人欧美大片 | 51国偷自产一区二区三区 | 国产成人无码一二三区视频 | 人人妻人人藻人人爽欧美一区 | 国产在线aaa片一区二区99 | 精品无人区无码乱码毛片国产 | 福利一区二区三区视频在线观看 | 国产口爆吞精在线视频 | 国产精品99久久精品爆乳 | 黑人粗大猛烈进出高潮视频 | 无码纯肉视频在线观看 | 欧美日韩人成综合在线播放 | 99久久精品午夜一区二区 | 少妇性l交大片欧洲热妇乱xxx | 日韩精品a片一区二区三区妖精 | 成人三级无码视频在线观看 | 久久99精品国产.久久久久 | 久久久久久九九精品久 | 一本久道久久综合狠狠爱 | 国产区女主播在线观看 | 欧美一区二区三区视频在线观看 | 性色欲网站人妻丰满中文久久不卡 | 3d动漫精品啪啪一区二区中 | 国产av人人夜夜澡人人爽麻豆 | 国产激情艳情在线看视频 | 日韩精品无码一本二本三本色 | 国内精品九九久久久精品 | 亚洲欧美日韩成人高清在线一区 | 天堂а√在线地址中文在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 狠狠噜狠狠狠狠丁香五月 | 人妻熟女一区 | 亚洲人成人无码网www国产 | aⅴ亚洲 日韩 色 图网站 播放 | 久久久精品456亚洲影院 | 成人欧美一区二区三区黑人 | 狠狠噜狠狠狠狠丁香五月 | 少妇太爽了在线观看 | 丝袜 中出 制服 人妻 美腿 | 天天躁夜夜躁狠狠是什么心态 | 少妇人妻av毛片在线看 | 久久婷婷五月综合色国产香蕉 | 蜜桃无码一区二区三区 | 久久99热只有频精品8 | 国产精品久久久久久亚洲影视内衣 | 清纯唯美经典一区二区 | 中文无码精品a∨在线观看不卡 | 少妇性l交大片欧洲热妇乱xxx | 久久精品国产一区二区三区肥胖 | 欧美国产日韩久久mv | 国产精品igao视频网 | 欧美色就是色 | 欧美日韩亚洲国产精品 | 亚洲天堂2017无码 | 99国产欧美久久久精品 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产真人无遮挡作爱免费视频 | 日韩在线不卡免费视频一区 | 激情内射日本一区二区三区 | 久久www免费人成人片 | 国产精品毛多多水多 | 无码人妻久久一区二区三区不卡 | 性欧美熟妇videofreesex | 久久国产精品二国产精品 | 99久久亚洲精品无码毛片 | 久久综合网欧美色妞网 | 国产精品成人av在线观看 | 天天躁夜夜躁狠狠是什么心态 | 日本又色又爽又黄的a片18禁 | 免费无码av一区二区 | 久久国内精品自在自线 | 国产乱人偷精品人妻a片 | 秋霞特色aa大片 | 欧美人妻一区二区三区 | 男人的天堂av网站 | 学生妹亚洲一区二区 | 欧美 丝袜 自拍 制服 另类 | 色婷婷综合激情综在线播放 | 一本色道婷婷久久欧美 | 学生妹亚洲一区二区 | 野外少妇愉情中文字幕 | 国产人妻精品一区二区三区 | 日本熟妇大屁股人妻 | 天下第一社区视频www日本 | 国产亚洲人成a在线v网站 | 国产精品鲁鲁鲁 | 99精品国产综合久久久久五月天 | 国产小呦泬泬99精品 | 97无码免费人妻超级碰碰夜夜 | 欧美性色19p | 亚洲午夜无码久久 | 亚洲国产欧美在线成人 | 日日夜夜撸啊撸 | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲欧洲日本综合aⅴ在线 | 日日躁夜夜躁狠狠躁 | 久久国产精品精品国产色婷婷 | 久久久久99精品成人片 | 精品国精品国产自在久国产87 | 久久综合狠狠综合久久综合88 | 高潮毛片无遮挡高清免费 | 少妇无码av无码专区在线观看 | av在线亚洲欧洲日产一区二区 | 亚洲精品综合一区二区三区在线 | 一本久久a久久精品亚洲 | 日韩少妇内射免费播放 | 亚洲中文字幕无码中文字在线 | 伊人久久大香线焦av综合影院 | 台湾无码一区二区 | 久久97精品久久久久久久不卡 | 呦交小u女精品视频 | 东京一本一道一二三区 | 狠狠色噜噜狠狠狠7777奇米 | 无码乱肉视频免费大全合集 | 亚洲中文字幕va福利 | 国产麻豆精品精东影业av网站 | 乱人伦中文视频在线观看 | 澳门永久av免费网站 | 天堂久久天堂av色综合 | 欧美freesex黑人又粗又大 | 国产肉丝袜在线观看 | 精品国产精品久久一区免费式 | 日本护士毛茸茸高潮 | 欧美人与物videos另类 | 日本一区二区三区免费播放 | 亚洲经典千人经典日产 | 成人精品一区二区三区中文字幕 | 夜先锋av资源网站 | 久久久成人毛片无码 | 国内精品久久久久久中文字幕 | 国产凸凹视频一区二区 | 亚洲中文字幕在线观看 | 日本熟妇人妻xxxxx人hd | 日韩人妻少妇一区二区三区 | 久久zyz资源站无码中文动漫 | 99久久久国产精品无码免费 | 特黄特色大片免费播放器图片 | 国产亚洲欧美在线专区 | 久久久久久九九精品久 | 久久精品女人天堂av免费观看 | 久久综合香蕉国产蜜臀av | 国产精品美女久久久久av爽李琼 | 亚洲人成网站色7799 | 国产成人综合在线女婷五月99播放 | 欧美精品无码一区二区三区 | 日本熟妇人妻xxxxx人hd | 国产精品久免费的黄网站 | 国产精品美女久久久久av爽李琼 | 欧美 亚洲 国产 另类 | 精品国产一区二区三区四区 | 欧美怡红院免费全部视频 | 亚洲综合伊人久久大杳蕉 | 精品国产一区二区三区av 性色 | 欧美日本日韩 | 亚洲精品综合一区二区三区在线 | 亚洲精品成人福利网站 | 乌克兰少妇xxxx做受 | 国产亚洲精品精品国产亚洲综合 | 亚洲毛片av日韩av无码 | 成 人影片 免费观看 | 成人影院yy111111在线观看 | 精品欧美一区二区三区久久久 | 一本加勒比波多野结衣 | 久久精品国产一区二区三区肥胖 | 2020久久超碰国产精品最新 | 亚洲精品久久久久久久久久久 | 少妇性荡欲午夜性开放视频剧场 | 亚洲中文字幕在线观看 | 无码一区二区三区在线 | 国产97在线 | 亚洲 | 99久久99久久免费精品蜜桃 | 精品人妻人人做人人爽夜夜爽 | 久久国产精品_国产精品 | 国产农村乱对白刺激视频 | 乌克兰少妇性做爰 | 亚洲小说图区综合在线 | 色婷婷欧美在线播放内射 | 欧美 亚洲 国产 另类 | 国产精品美女久久久久av爽李琼 | 无码人妻av免费一区二区三区 | 欧美日韩一区二区综合 | 99久久婷婷国产综合精品青草免费 | 亚洲爆乳大丰满无码专区 | а√资源新版在线天堂 | 亚洲国产高清在线观看视频 | 亚洲国产欧美国产综合一区 | 国产成人精品无码播放 | 国产精品国产自线拍免费软件 | 亚洲精品国偷拍自产在线观看蜜桃 | 女人色极品影院 | 欧美午夜特黄aaaaaa片 | 亚洲 日韩 欧美 成人 在线观看 | 麻豆国产97在线 | 欧洲 | 中文字幕人妻无码一夲道 | 性啪啪chinese东北女人 | 中文字幕精品av一区二区五区 | 国产精品无码一区二区桃花视频 | 亚洲狠狠色丁香婷婷综合 | 欧美乱妇无乱码大黄a片 | 日韩精品成人一区二区三区 | 欧美熟妇另类久久久久久多毛 | 久久五月精品中文字幕 | 少妇性荡欲午夜性开放视频剧场 | 色婷婷香蕉在线一区二区 | 九月婷婷人人澡人人添人人爽 | 欧美国产日韩亚洲中文 | 国产av人人夜夜澡人人爽麻豆 | 99久久精品日本一区二区免费 | 精品人妻中文字幕有码在线 | 午夜男女很黄的视频 | 日日摸天天摸爽爽狠狠97 | 色五月丁香五月综合五月 | 免费国产黄网站在线观看 | 少妇的肉体aa片免费 | 九九热爱视频精品 | 曰韩无码二三区中文字幕 | 日本欧美一区二区三区乱码 | 露脸叫床粗话东北少妇 | 久久久久久久人妻无码中文字幕爆 | 国产欧美熟妇另类久久久 | 少妇无码av无码专区在线观看 | 国产精品久久久一区二区三区 | 亚洲国产成人av在线观看 | 成人免费视频一区二区 | 亚洲欧美日韩成人高清在线一区 | 人妻人人添人妻人人爱 | 国产精品沙发午睡系列 | 国产农村妇女高潮大叫 | 欧美午夜特黄aaaaaa片 | 成年美女黄网站色大免费视频 | 亚洲中文字幕在线无码一区二区 | 无遮无挡爽爽免费视频 | 又粗又大又硬又长又爽 | 国产超碰人人爽人人做人人添 | 丰满少妇女裸体bbw | 欧美 日韩 人妻 高清 中文 | 日本一区二区三区免费高清 | 77777熟女视频在线观看 а天堂中文在线官网 | 一个人看的视频www在线 | 久久久久久久久蜜桃 | 亚洲国产精品一区二区美利坚 | 天堂а√在线地址中文在线 | 熟妇激情内射com | 国产另类ts人妖一区二区 | 国产人妖乱国产精品人妖 | 亚洲中文字幕va福利 | 丁香花在线影院观看在线播放 | 久久国产精品精品国产色婷婷 | 久久精品女人天堂av免费观看 | 嫩b人妻精品一区二区三区 | 日韩人妻无码中文字幕视频 | 欧美 日韩 人妻 高清 中文 | 2020久久超碰国产精品最新 | 国产精品高潮呻吟av久久4虎 | 国产亚洲tv在线观看 | 久久国产精品偷任你爽任你 | 亚洲大尺度无码无码专区 | 精品人妻人人做人人爽夜夜爽 | 日韩成人一区二区三区在线观看 | 99久久婷婷国产综合精品青草免费 | 97人妻精品一区二区三区 | 国产精品美女久久久久av爽李琼 | 亚洲精品一区二区三区四区五区 | 亚洲国产av美女网站 | 国内揄拍国内精品少妇国语 | 成 人 网 站国产免费观看 | 亲嘴扒胸摸屁股激烈网站 | 国产色精品久久人妻 | 国产成人人人97超碰超爽8 | 精品国产乱码久久久久乱码 | 无码人妻丰满熟妇区五十路百度 | 亚洲成av人片在线观看无码不卡 | 国产一区二区三区四区五区加勒比 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 伊人久久大香线蕉av一区二区 | 成人aaa片一区国产精品 | 国产亚洲人成a在线v网站 | 无码帝国www无码专区色综合 | 国产内射爽爽大片视频社区在线 | 亚洲欧美精品伊人久久 | 激情五月综合色婷婷一区二区 | 久久99精品国产麻豆 | 色妞www精品免费视频 | 纯爱无遮挡h肉动漫在线播放 | 成人无码视频在线观看网站 | 久久99精品久久久久久动态图 | 成人av无码一区二区三区 | 九九久久精品国产免费看小说 | 中文字幕人成乱码熟女app | 欧美熟妇另类久久久久久不卡 | 99久久人妻精品免费一区 | 色一情一乱一伦一区二区三欧美 | 人妻尝试又大又粗久久 | 又湿又紧又大又爽a视频国产 | 亚洲va欧美va天堂v国产综合 | 红桃av一区二区三区在线无码av | 成熟人妻av无码专区 | 中文无码精品a∨在线观看不卡 | 久激情内射婷内射蜜桃人妖 | 东北女人啪啪对白 | 久久久久久a亚洲欧洲av冫 | 欧美性黑人极品hd | 亚洲欧美日韩国产精品一区二区 | 风流少妇按摩来高潮 | 蜜桃视频韩日免费播放 | 国产真实伦对白全集 | 亚洲区小说区激情区图片区 | 国产午夜福利100集发布 | 最新国产麻豆aⅴ精品无码 | 午夜精品一区二区三区在线观看 | 美女毛片一区二区三区四区 | 亚洲日本va中文字幕 | 18禁止看的免费污网站 | 国产激情无码一区二区 | 鲁一鲁av2019在线 | 中文字幕日产无线码一区 | 亚洲综合伊人久久大杳蕉 | 麻豆精产国品 | 性生交大片免费看女人按摩摩 | 国产人妻久久精品二区三区老狼 | 无码人妻久久一区二区三区不卡 | 亚洲成在人网站无码天堂 | 欧美zoozzooz性欧美 | 欧美高清在线精品一区 | 亚洲第一无码av无码专区 | 鲁一鲁av2019在线 | 中文无码成人免费视频在线观看 | 夜夜夜高潮夜夜爽夜夜爰爰 | 玩弄人妻少妇500系列视频 | 乱人伦中文视频在线观看 | 一本色道久久综合亚洲精品不卡 | 久久精品中文字幕一区 | 成人影院yy111111在线观看 | 欧美熟妇另类久久久久久不卡 | 2019nv天堂香蕉在线观看 | 在线播放免费人成毛片乱码 | 色婷婷久久一区二区三区麻豆 | 国产一区二区三区日韩精品 | 久久久www成人免费毛片 | 亚洲欧美日韩国产精品一区二区 | 国产精品第一区揄拍无码 | 日韩精品无码一本二本三本色 | 日本www一道久久久免费榴莲 | 免费人成在线观看网站 | 中文字幕人妻丝袜二区 | 国产精品第一区揄拍无码 | 天天拍夜夜添久久精品大 | 亚洲国产成人a精品不卡在线 | 欧美三级a做爰在线观看 | 色诱久久久久综合网ywww | 国产亚洲精品久久久久久国模美 | 自拍偷自拍亚洲精品10p | 欧美性色19p | 久久天天躁夜夜躁狠狠 | 图片区 小说区 区 亚洲五月 | 亚洲s码欧洲m码国产av | 国产成人人人97超碰超爽8 | 国产精品高潮呻吟av久久4虎 | 18禁止看的免费污网站 | 老司机亚洲精品影院无码 | 又大又黄又粗又爽的免费视频 | 国产成人精品久久亚洲高清不卡 | 精品一区二区三区无码免费视频 | 国产午夜亚洲精品不卡下载 | 丰满人妻一区二区三区免费视频 | 狂野欧美性猛交免费视频 | 亚洲精品欧美二区三区中文字幕 | 少女韩国电视剧在线观看完整 | 国产成人无码午夜视频在线观看 | 无码人妻出轨黑人中文字幕 | 骚片av蜜桃精品一区 | 蜜臀av无码人妻精品 | 又粗又大又硬毛片免费看 | 久久精品中文字幕大胸 | 欧美日韩久久久精品a片 | 特黄特色大片免费播放器图片 | 亚洲精品一区二区三区在线观看 | 亚洲s码欧洲m码国产av | 中文字幕无码免费久久99 | 亚洲中文字幕在线无码一区二区 | 国产在热线精品视频 | 精品国产麻豆免费人成网站 | 亚洲国产综合无码一区 | 小鲜肉自慰网站xnxx | 亚洲の无码国产の无码步美 | 无人区乱码一区二区三区 | 永久黄网站色视频免费直播 | 亚洲精品一区二区三区婷婷月 | 亚洲欧美精品aaaaaa片 | 亚洲狠狠色丁香婷婷综合 | 精品无人区无码乱码毛片国产 | 青青久在线视频免费观看 | 亚洲 欧美 激情 小说 另类 | 荫蒂添的好舒服视频囗交 | 久久精品国产99精品亚洲 | 日日橹狠狠爱欧美视频 | 学生妹亚洲一区二区 | 国产精品无码一区二区桃花视频 | 小鲜肉自慰网站xnxx | 曰韩少妇内射免费播放 | 又粗又大又硬毛片免费看 | 亚洲s色大片在线观看 | 纯爱无遮挡h肉动漫在线播放 | av人摸人人人澡人人超碰下载 | 成人一区二区免费视频 | 成人亚洲精品久久久久 | 亚洲人交乣女bbw | 美女张开腿让人桶 | 日日天日日夜日日摸 | 在线精品国产一区二区三区 | 国产人妖乱国产精品人妖 | 亚洲经典千人经典日产 | 国产免费久久精品国产传媒 | 四十如虎的丰满熟妇啪啪 | 未满成年国产在线观看 | 亚洲精品午夜国产va久久成人 | 狠狠色丁香久久婷婷综合五月 | 亚洲中文字幕无码中字 | 奇米影视7777久久精品 | 国产精品高潮呻吟av久久 | 丰满妇女强制高潮18xxxx | 亚洲人成网站在线播放942 | 国产做国产爱免费视频 | 性色av无码免费一区二区三区 | 久久综合激激的五月天 | 天天躁夜夜躁狠狠是什么心态 | 大屁股大乳丰满人妻 | 国内老熟妇对白xxxxhd | 欧美成人高清在线播放 | 国产区女主播在线观看 | 久久人人爽人人人人片 | 国产一区二区不卡老阿姨 | 亚洲国产精品成人久久蜜臀 | 国产av人人夜夜澡人人爽麻豆 | 99麻豆久久久国产精品免费 | 高中生自慰www网站 | 国产亚洲精品久久久久久久久动漫 | 日韩欧美群交p片內射中文 | 日韩在线不卡免费视频一区 | 欧美日韩综合一区二区三区 | 色综合久久久久综合一本到桃花网 | 人妻少妇被猛烈进入中文字幕 | 97久久精品无码一区二区 | 婷婷综合久久中文字幕蜜桃三电影 | 国产偷国产偷精品高清尤物 | 最新国产麻豆aⅴ精品无码 | 亚洲国产日韩a在线播放 | 中文无码伦av中文字幕 | 国产成人人人97超碰超爽8 | 国产另类ts人妖一区二区 | 亚洲欧洲无卡二区视頻 | 亚洲一区二区三区国产精华液 | 午夜福利一区二区三区在线观看 | 国产av无码专区亚洲awww | 少妇厨房愉情理9仑片视频 | 男女超爽视频免费播放 | 18精品久久久无码午夜福利 | 亚洲欧美日韩成人高清在线一区 | 国产精品va在线观看无码 | 少妇无码一区二区二三区 | 国产色在线 | 国产 | 人人妻人人澡人人爽精品欧美 | 日韩av激情在线观看 | 色一情一乱一伦一区二区三欧美 | 久久国产自偷自偷免费一区调 | 无码人妻久久一区二区三区不卡 | 精品一区二区三区无码免费视频 | 无套内谢的新婚少妇国语播放 | 99久久精品无码一区二区毛片 | 亚洲娇小与黑人巨大交 | 日本肉体xxxx裸交 | 成人毛片一区二区 | 精品久久久中文字幕人妻 | 国产精品久久久久无码av色戒 | 成人aaa片一区国产精品 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 荫蒂添的好舒服视频囗交 | 日韩无码专区 | 黑人玩弄人妻中文在线 | 熟妇激情内射com | 成人免费视频在线观看 | 日本一卡2卡3卡四卡精品网站 | 久久午夜无码鲁丝片秋霞 | 激情亚洲一区国产精品 | 亚洲欧美日韩综合久久久 | 清纯唯美经典一区二区 | 欧美丰满少妇xxxx性 | 在线a亚洲视频播放在线观看 | 亚洲七七久久桃花影院 | www一区二区www免费 | 又粗又大又硬又长又爽 | 一本久道久久综合狠狠爱 | 国产成人av免费观看 | 欧美黑人性暴力猛交喷水 | 婷婷综合久久中文字幕蜜桃三电影 | 欧美激情内射喷水高潮 | 亚洲欧美中文字幕5发布 | 狠狠色欧美亚洲狠狠色www | 中文字幕人成乱码熟女app | 国产亚洲精品久久久久久 | 欧美精品国产综合久久 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲欧洲日本无在线码 | 天堂在线观看www | 2020久久香蕉国产线看观看 | 国产黄在线观看免费观看不卡 | 久久亚洲精品成人无码 | 99久久99久久免费精品蜜桃 | 亚洲成av人片天堂网无码】 | 午夜福利不卡在线视频 | 国产手机在线αⅴ片无码观看 | 大胆欧美熟妇xx | 日本熟妇大屁股人妻 | 国产成人精品一区二区在线小狼 | 少妇无码av无码专区在线观看 | 日日碰狠狠躁久久躁蜜桃 | 亚洲中文字幕va福利 | 白嫩日本少妇做爰 | 婷婷五月综合激情中文字幕 | 老子影院午夜精品无码 | 国产偷自视频区视频 | 又紧又大又爽精品一区二区 | 精品乱码久久久久久久 | 精品国产国产综合精品 | 午夜性刺激在线视频免费 | 97人妻精品一区二区三区 | 性色欲网站人妻丰满中文久久不卡 | 午夜男女很黄的视频 | 少妇厨房愉情理9仑片视频 | 国产精品成人av在线观看 | 亚洲综合无码久久精品综合 | 欧美 亚洲 国产 另类 | 国产超级va在线观看视频 | 丰满少妇人妻久久久久久 | 丰满少妇女裸体bbw | 免费无码的av片在线观看 | 精品乱码久久久久久久 | 亚洲欧洲中文日韩av乱码 | 日产精品高潮呻吟av久久 | 久久人人97超碰a片精品 | 色综合久久中文娱乐网 | 伊在人天堂亚洲香蕉精品区 | 亚洲综合久久一区二区 | 天海翼激烈高潮到腰振不止 | 天天躁日日躁狠狠躁免费麻豆 | 性色欲网站人妻丰满中文久久不卡 | 亚洲精品国产品国语在线观看 | 亚洲一区二区三区偷拍女厕 | 人妻少妇精品无码专区动漫 | 国产精品va在线播放 | 亚洲成av人在线观看网址 | 少妇久久久久久人妻无码 | 日韩人妻无码一区二区三区久久99 | 国产口爆吞精在线视频 | 免费观看黄网站 | 亚洲第一无码av无码专区 | 99麻豆久久久国产精品免费 | 小泽玛莉亚一区二区视频在线 | 国产莉萝无码av在线播放 | 日韩无码专区 | 久久综合九色综合欧美狠狠 | 日欧一片内射va在线影院 | 成人亚洲精品久久久久软件 | 亚洲区小说区激情区图片区 | 国产农村乱对白刺激视频 | 国产亚洲精品久久久久久大师 | 精品国产一区二区三区四区 | 玩弄少妇高潮ⅹxxxyw | 无码人妻精品一区二区三区不卡 | 久久久国产精品无码免费专区 | 欧美老熟妇乱xxxxx | 娇妻被黑人粗大高潮白浆 | 亚洲日本va午夜在线电影 | 欧美老人巨大xxxx做受 | 久久久久久久女国产乱让韩 | www国产亚洲精品久久网站 | 精品亚洲韩国一区二区三区 | 精品夜夜澡人妻无码av蜜桃 | 狠狠色噜噜狠狠狠7777奇米 | 国产精品久久久一区二区三区 | 成在人线av无码免观看麻豆 | 亚洲自偷自拍另类第1页 | 自拍偷自拍亚洲精品被多人伦好爽 | 一区二区传媒有限公司 | 给我免费的视频在线观看 | 久久久久久久女国产乱让韩 | 亚洲理论电影在线观看 | 成人影院yy111111在线观看 | 久青草影院在线观看国产 | 国产卡一卡二卡三 | 中文字幕人妻无码一区二区三区 | 日韩人妻无码一区二区三区久久99 | 人人妻人人澡人人爽人人精品浪潮 | 久青草影院在线观看国产 | 特级做a爰片毛片免费69 | 亚无码乱人伦一区二区 | aa片在线观看视频在线播放 | 99麻豆久久久国产精品免费 | 国产内射爽爽大片视频社区在线 | 成人免费视频在线观看 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 成人一在线视频日韩国产 | 撕开奶罩揉吮奶头视频 | 玩弄人妻少妇500系列视频 | 国产av一区二区精品久久凹凸 | 亚洲第一网站男人都懂 | 99久久人妻精品免费一区 | 精品国产麻豆免费人成网站 | 国产精品无码mv在线观看 | 成年女人永久免费看片 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产午夜手机精彩视频 | 精品无码国产一区二区三区av | 麻豆国产丝袜白领秘书在线观看 | 国内精品九九久久久精品 | 欧美人与禽zoz0性伦交 | 少妇被粗大的猛进出69影院 | 午夜成人1000部免费视频 | 亚洲精品中文字幕 | 牲欲强的熟妇农村老妇女视频 | 狠狠色丁香久久婷婷综合五月 | 成人精品视频一区二区 | а√天堂www在线天堂小说 | 精品成在人线av无码免费看 | 亚洲第一网站男人都懂 | 99re在线播放 | 熟妇人妻无乱码中文字幕 | 亚洲欧美日韩成人高清在线一区 | 欧美怡红院免费全部视频 | 中文字幕亚洲情99在线 | 欧美zoozzooz性欧美 | 国产精品久久久 | 久久久久久久人妻无码中文字幕爆 | 无码播放一区二区三区 | 黑人玩弄人妻中文在线 | 国产精品办公室沙发 | 欧美阿v高清资源不卡在线播放 | 亚洲无人区午夜福利码高清完整版 | 亚洲一区二区三区无码久久 | 日本精品高清一区二区 | 成人女人看片免费视频放人 | 色狠狠av一区二区三区 | 欧洲美熟女乱又伦 | 精品亚洲成av人在线观看 | 国产人妻精品一区二区三区 | 国产精品无码永久免费888 | 76少妇精品导航 | 撕开奶罩揉吮奶头视频 | 久久无码专区国产精品s | 日韩无码专区 | 国产美女精品一区二区三区 | 性做久久久久久久久 | a片免费视频在线观看 | 亚洲小说春色综合另类 | 午夜精品久久久内射近拍高清 | 丰满少妇人妻久久久久久 | 人人超人人超碰超国产 | 国产精品嫩草久久久久 | 十八禁真人啪啪免费网站 | 午夜时刻免费入口 | 国产无遮挡吃胸膜奶免费看 | 亚洲爆乳精品无码一区二区三区 | 国产网红无码精品视频 | 色欲久久久天天天综合网精品 | 一本色道婷婷久久欧美 | 草草网站影院白丝内射 | 日本成熟视频免费视频 | 色婷婷香蕉在线一区二区 | 玩弄中年熟妇正在播放 | 免费观看又污又黄的网站 | 色综合久久中文娱乐网 | 亚洲熟妇色xxxxx欧美老妇 | 久久国内精品自在自线 | 免费国产成人高清在线观看网站 | 久久99精品国产.久久久久 | 国产绳艺sm调教室论坛 | 波多野结衣av一区二区全免费观看 | 无码乱肉视频免费大全合集 | 九九综合va免费看 | 国产肉丝袜在线观看 | 老头边吃奶边弄进去呻吟 | 欧美人妻一区二区三区 | 永久免费精品精品永久-夜色 | 丰满人妻一区二区三区免费视频 | 国产亚洲精品精品国产亚洲综合 | 国产超级va在线观看视频 | 亚洲中文字幕av在天堂 | 高清不卡一区二区三区 | 又大又硬又黄的免费视频 | 丰满少妇弄高潮了www | 日欧一片内射va在线影院 | 精品夜夜澡人妻无码av蜜桃 | 亚洲国产精品久久久天堂 | 丰满人妻一区二区三区免费视频 | 精品偷拍一区二区三区在线看 | 欧美精品免费观看二区 | 久久99精品国产.久久久久 | √8天堂资源地址中文在线 | 精品aⅴ一区二区三区 | 精品无码国产自产拍在线观看蜜 | 天天综合网天天综合色 | 国产乱码精品一品二品 | 中文字幕日产无线码一区 | 牛和人交xxxx欧美 | 精品国产一区二区三区av 性色 | 欧美自拍另类欧美综合图片区 | 四虎国产精品一区二区 | 免费观看的无遮挡av | 久久无码人妻影院 | 久久精品国产精品国产精品污 | 午夜无码区在线观看 | 图片小说视频一区二区 | av无码久久久久不卡免费网站 | 成熟妇人a片免费看网站 | 国产精华av午夜在线观看 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲成色www久久网站 | 日韩av无码一区二区三区 | 99久久精品午夜一区二区 | 欧美日韩一区二区免费视频 | 国产无套内射久久久国产 | 人妻aⅴ无码一区二区三区 | 国产明星裸体无码xxxx视频 | 男人的天堂av网站 | 亚洲一区二区三区 | 日日干夜夜干 | 国产精品欧美成人 | 亚洲色大成网站www | 日日躁夜夜躁狠狠躁 | 国产精品igao视频网 | 国产麻豆精品一区二区三区v视界 | 亚洲日韩乱码中文无码蜜桃臀网站 | 大地资源网第二页免费观看 | 综合激情五月综合激情五月激情1 | 日日夜夜撸啊撸 | 日韩精品无码一区二区中文字幕 | 中文无码成人免费视频在线观看 | 日日鲁鲁鲁夜夜爽爽狠狠 | 欧美日韩一区二区免费视频 | 日本一卡二卡不卡视频查询 | 少妇一晚三次一区二区三区 | 玩弄人妻少妇500系列视频 | 六十路熟妇乱子伦 | 亚洲欧美色中文字幕在线 | 乱码av麻豆丝袜熟女系列 | 国产xxx69麻豆国语对白 | 理论片87福利理论电影 | 青青青爽视频在线观看 | 欧美 日韩 人妻 高清 中文 | 国产精品无码一区二区桃花视频 | 国产黄在线观看免费观看不卡 | 国产午夜福利亚洲第一 | 久精品国产欧美亚洲色aⅴ大片 | 久久综合久久自在自线精品自 | 久久久久亚洲精品中文字幕 | 丰满人妻一区二区三区免费视频 | 国产乱人伦偷精品视频 | 国产精品资源一区二区 | 东京热一精品无码av | 精品熟女少妇av免费观看 | 欧美freesex黑人又粗又大 | 欧美日韩色另类综合 | 激情亚洲一区国产精品 | 国产一区二区不卡老阿姨 | 成人性做爰aaa片免费看 | 人人爽人人爽人人片av亚洲 | 欧美喷潮久久久xxxxx | 亚洲精品一区二区三区在线 | 色窝窝无码一区二区三区色欲 | av小次郎收藏 | 人妻少妇被猛烈进入中文字幕 | 97se亚洲精品一区 | 亚洲国产高清在线观看视频 | 久久99精品国产.久久久久 | 欧美 亚洲 国产 另类 | 精品国产一区二区三区av 性色 | 中文字幕无码日韩欧毛 | 一本久久伊人热热精品中文字幕 | 国产亚洲美女精品久久久2020 | 日韩人妻少妇一区二区三区 | 精品乱码久久久久久久 | 久久99精品久久久久久 | yw尤物av无码国产在线观看 | 国产精品亚洲а∨无码播放麻豆 | 99国产欧美久久久精品 | 亚洲午夜久久久影院 | 国产一区二区三区日韩精品 | 日韩精品无码一本二本三本色 | 成人欧美一区二区三区黑人 | 亚洲成av人影院在线观看 | 精品久久久久久亚洲精品 | 撕开奶罩揉吮奶头视频 | 国产精品人人爽人人做我的可爱 | 亚洲精品一区二区三区四区五区 | 欧美一区二区三区 | 亚洲日韩一区二区 | 国产熟女一区二区三区四区五区 | 精品欧洲av无码一区二区三区 | 欧美 日韩 亚洲 在线 | 亚洲色欲色欲天天天www | 精品国产精品久久一区免费式 | 久久国产自偷自偷免费一区调 | 久久久久久久久蜜桃 | 夜精品a片一区二区三区无码白浆 | 亚洲色偷偷男人的天堂 | 黑人巨大精品欧美一区二区 | 极品尤物被啪到呻吟喷水 | 国产亚洲视频中文字幕97精品 | 超碰97人人射妻 | 久久99精品久久久久婷婷 | 国产电影无码午夜在线播放 | 天下第一社区视频www日本 | 麻豆md0077饥渴少妇 | 人妻少妇精品无码专区二区 | 亚洲无人区午夜福利码高清完整版 | 国产精品无套呻吟在线 | 一二三四社区在线中文视频 | 成人三级无码视频在线观看 | 国产精品久久久久9999小说 | 88国产精品欧美一区二区三区 | 亚洲精品午夜国产va久久成人 | 熟妇人妻中文av无码 | 无套内谢的新婚少妇国语播放 | 久久久久成人片免费观看蜜芽 | 欧美人与动性行为视频 | 亚洲春色在线视频 | 国产激情无码一区二区 | 5858s亚洲色大成网站www | 亚洲精品成人福利网站 | 国产精品久久国产三级国 | 亚洲精品中文字幕乱码 | 九九热爱视频精品 | 国产手机在线αⅴ片无码观看 | 国产片av国语在线观看 | 亚洲大尺度无码无码专区 | 99久久人妻精品免费一区 | 国产精品无码久久av | 久久99精品国产麻豆蜜芽 | 在线播放免费人成毛片乱码 | 波多野42部无码喷潮在线 | 在线天堂新版最新版在线8 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 久久综合久久自在自线精品自 | 国产精品亚洲专区无码不卡 | 亚洲 欧美 激情 小说 另类 | 欧美放荡的少妇 | 欧美亚洲国产一区二区三区 | 亚洲成av人影院在线观看 | 久久午夜夜伦鲁鲁片无码免费 | 成 人 免费观看网站 | 亚洲a无码综合a国产av中文 | 成人aaa片一区国产精品 | 成熟妇人a片免费看网站 | 性欧美videos高清精品 | 国产一精品一av一免费 | 东北女人啪啪对白 | 欧美亚洲日韩国产人成在线播放 | 精品无码国产一区二区三区av | 国产精品第一国产精品 | 日日鲁鲁鲁夜夜爽爽狠狠 | 日韩欧美成人免费观看 | 伦伦影院午夜理论片 | 曰韩无码二三区中文字幕 | 久久99精品国产.久久久久 | 一本加勒比波多野结衣 | 久久国产精品精品国产色婷婷 | 午夜无码区在线观看 | 日本大乳高潮视频在线观看 | 人妻与老人中文字幕 | 欧美刺激性大交 | 久久精品国产一区二区三区肥胖 | 国产极品美女高潮无套在线观看 | 亚洲 欧美 激情 小说 另类 | 中文字幕无码免费久久99 | 免费无码肉片在线观看 | 性色av无码免费一区二区三区 | 久久无码人妻影院 | 日韩少妇白浆无码系列 | 国产九九九九九九九a片 | 夜先锋av资源网站 | 高潮毛片无遮挡高清免费视频 | 又大又紧又粉嫩18p少妇 | 国产亚洲精品久久久闺蜜 | 成人av无码一区二区三区 | 亚洲啪av永久无码精品放毛片 | 国产亚洲日韩欧美另类第八页 | 两性色午夜免费视频 | 97久久国产亚洲精品超碰热 | www成人国产高清内射 | 一个人看的www免费视频在线观看 | 内射爽无广熟女亚洲 | 亚洲国产欧美日韩精品一区二区三区 | 久9re热视频这里只有精品 | 无遮无挡爽爽免费视频 | 国产午夜亚洲精品不卡 | 男女爱爱好爽视频免费看 | 老太婆性杂交欧美肥老太 | 日本乱人伦片中文三区 | 丰满肥臀大屁股熟妇激情视频 | 日韩精品成人一区二区三区 | 欧美熟妇另类久久久久久多毛 | 成 人 网 站国产免费观看 | 日韩精品久久久肉伦网站 | 国产人妻人伦精品1国产丝袜 | 欧美阿v高清资源不卡在线播放 | 最近中文2019字幕第二页 | 人人澡人人妻人人爽人人蜜桃 | 午夜熟女插插xx免费视频 | 亚洲精品国产精品乱码视色 | 亚洲成av人综合在线观看 | 国产手机在线αⅴ片无码观看 | 久久午夜无码鲁丝片 | 小鲜肉自慰网站xnxx | 国产舌乚八伦偷品w中 | 秋霞特色aa大片 | 午夜性刺激在线视频免费 | 最近中文2019字幕第二页 | 国产亚洲美女精品久久久2020 | 国产亚av手机在线观看 | 精品夜夜澡人妻无码av蜜桃 | 亚洲精品www久久久 | 免费无码肉片在线观看 | 欧美人与动性行为视频 | 国产乡下妇女做爰 | 欧美老妇与禽交 | 亚洲无人区午夜福利码高清完整版 | 精品人人妻人人澡人人爽人人 | 国产精品怡红院永久免费 | 欧美黑人巨大xxxxx | 中文字幕av日韩精品一区二区 | 亚洲精品午夜国产va久久成人 | 狠狠cao日日穞夜夜穞av | 牲欲强的熟妇农村老妇女 | 久久午夜无码鲁丝片秋霞 | 亚洲国产精品久久久天堂 | 中文字幕人成乱码熟女app | 漂亮人妻洗澡被公强 日日躁 | 国产精品亚洲综合色区韩国 | 欧美日本精品一区二区三区 | 玩弄少妇高潮ⅹxxxyw | 高清国产亚洲精品自在久久 | 国产热a欧美热a在线视频 | 久久午夜无码鲁丝片 | 色偷偷人人澡人人爽人人模 | 午夜精品一区二区三区在线观看 | 欧美人与禽zoz0性伦交 | 窝窝午夜理论片影院 | 99久久久无码国产aaa精品 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 欧美高清在线精品一区 | 亚拍精品一区二区三区探花 | 精品人妻人人做人人爽夜夜爽 | 亚洲天堂2017无码 | 亚洲狠狠色丁香婷婷综合 | 图片区 小说区 区 亚洲五月 | 国产色在线 | 国产 | 国产成人精品三级麻豆 | 中文字幕乱码中文乱码51精品 | 国色天香社区在线视频 | 51国偷自产一区二区三区 | 国产又爽又猛又粗的视频a片 | 四虎国产精品免费久久 | 精品人妻人人做人人爽夜夜爽 | 国产精华av午夜在线观看 | 久久熟妇人妻午夜寂寞影院 | 久久人人爽人人爽人人片av高清 | 国产香蕉尹人视频在线 | 亚洲 激情 小说 另类 欧美 | 狠狠色噜噜狠狠狠7777奇米 | 亚洲a无码综合a国产av中文 | 久久久久久久久888 | 精品成人av一区二区三区 | 97无码免费人妻超级碰碰夜夜 | 永久免费观看国产裸体美女 | 永久黄网站色视频免费直播 | 欧美亚洲日韩国产人成在线播放 | 久久久中文久久久无码 | 久久天天躁狠狠躁夜夜免费观看 | 国产三级久久久精品麻豆三级 | 97无码免费人妻超级碰碰夜夜 | 国产午夜无码精品免费看 | 强伦人妻一区二区三区视频18 | 无码人妻少妇伦在线电影 | 国产综合色产在线精品 | 国产香蕉97碰碰久久人人 | 精品一二三区久久aaa片 | 强开小婷嫩苞又嫩又紧视频 | 大肉大捧一进一出好爽视频 | 97无码免费人妻超级碰碰夜夜 | 又大又紧又粉嫩18p少妇 | 国产热a欧美热a在线视频 | 国产网红无码精品视频 | www国产亚洲精品久久网站 | 国产精品国产自线拍免费软件 |