|
3 | 3 | using System.Linq;
|
4 | 4 | using BookStore.DO.Entities;
|
5 | 5 | using System.Data.Entity;
|
| 6 | +using System.Data.SqlTypes; |
6 | 7 | using System.Diagnostics;
|
7 | 8 | using System.Threading.Tasks;
|
8 | 9 | using BookStore.DAL.Interface.Abstract;
|
@@ -86,7 +87,7 @@ public async Task RateBook(float rate, int userId, int bookId, bool isSuggestion
|
86 | 87 | context.SaveChanges();
|
87 | 88 | //sw.Stop();
|
88 | 89 | //sw.Elapsed.Duration().Seconds;
|
89 |
| - //Resuggest(); |
| 90 | + Resuggest1(); |
90 | 91 | }
|
91 | 92 | }
|
92 | 93 |
|
@@ -147,12 +148,12 @@ public void Suggest(float rate, int userId, int bookId, bool isSuggestion)
|
147 | 148 | context.SaveChanges();
|
148 | 149 | }
|
149 | 150 | }
|
150 |
| - public float PreditRating(float[] UserFeatures, float[] BookFeatures, int features) |
| 151 | + public float PreditRating(float[] userFeatures, float[] bookFeatures, int features) |
151 | 152 | {
|
152 | 153 | float sum = 0;
|
153 | 154 | for (int i = 0; i < features; i++)
|
154 | 155 | {
|
155 |
| - sum += UserFeatures[i] * BookFeatures[i]; |
| 156 | + sum += userFeatures[i] * bookFeatures[i]; |
156 | 157 | }
|
157 | 158 | return sum;
|
158 | 159 | }
|
@@ -267,86 +268,98 @@ public void Resuggest()
|
267 | 268 | }
|
268 | 269 | }
|
269 | 270 | }
|
270 |
| - int a = 0; |
271 |
| - //var users = GetAll().ToList(); |
272 |
| - ////int maxUserId =users.Select(x => x.User_ID).Max(); |
273 |
| - //int maxBookId = Context.Books.Select(x => x.Book_ID).Max(); |
274 |
| - //float[,] matrix = new float[users.Count, maxBookId]; |
275 |
| - //float[,] result = new float[users.Count, maxBookId]; |
276 |
| - |
277 |
| - ////int[,] korelation = new int[users.Count, users.Count]; |
278 |
| - //float[,] corelation = new float[users.Count, users.Count]; |
279 |
| - ////List<double> corelation = new List<double>(); |
280 |
| - //List<float> average = new List<float>(); |
281 |
| - //List<float> diff = new List<float>(); |
282 |
| - //foreach (var user in users.Select((x, i) => new { Value = x, Index = i })) |
283 |
| - //{ |
284 |
| - // int userId = user.Value.User_ID; |
285 |
| - // float averageRate = 0; |
286 |
| - // int countNonZero = 0; |
287 |
| - // foreach (var rate in GetRatedBooks(userId)) |
288 |
| - // { |
289 |
| - // int bookId = rate.Book.Book_ID; |
290 |
| - // matrix[user.Index, bookId] = rate.RateValue; |
291 |
| - // if (rate.RateValue > 0) |
292 |
| - // { |
293 |
| - // averageRate += rate.RateValue; |
294 |
| - // countNonZero++; |
295 |
| - // } |
296 |
| - // } |
297 |
| - // average.Add((float)averageRate / countNonZero); |
| 271 | + } |
| 272 | + } |
298 | 273 |
|
299 |
| - // if (user.Index > 0) |
300 |
| - // { |
301 |
| - // for (int i = 1; i <= user.Index; i++) //ïî þçåðàì |
302 |
| - // { |
303 |
| - // double kor = 0; |
304 |
| - // float sum = 0, sumSquare1 = 0, sumSquare2 = 0; |
305 |
| - // for (int j = 0; j < maxBookId; j++) //ïî êíèæêàì |
306 |
| - // { |
307 |
| - // if (matrix[user.Index, j] > 0 && matrix[user.Index - i, j] > 0) |
308 |
| - // { |
309 |
| - // sum += (matrix[user.Index, j] - average.ElementAt(user.Index)) * |
310 |
| - // (matrix[user.Index - i, j] - average.ElementAt(user.Index - i)); |
311 |
| - // sumSquare1 += (matrix[user.Index, j] - average.ElementAt(user.Index)) * |
312 |
| - // (matrix[user.Index, j] - average.ElementAt(user.Index)); |
313 |
| - // sumSquare2 += (matrix[user.Index - i, j] - average.ElementAt(user.Index - i)) * |
314 |
| - // (matrix[user.Index - i, j] - average.ElementAt(user.Index - i)); |
315 |
| - // } |
316 |
| - // } |
317 |
| - // diff.Add(sumSquare1); |
318 |
| - // kor = sum / (Math.Sqrt(sumSquare1) * Math.Sqrt(sumSquare2)); |
319 |
| - // //corelation.Add(kor); |
320 |
| - // corelation[user.Index, user.Index - i] = corelation[user.Index - i, user.Index] = (float)kor; |
321 |
| - // } |
322 |
| - // } |
323 |
| - //} |
324 |
| - //float[,] SubMatrix = (float[,])matrix.Clone(); |
325 |
| - //for (int i = 0; i < SubMatrix.GetLength(0); i++) |
326 |
| - //{ |
327 |
| - // for (int j = 0; j < SubMatrix.GetLength(1); j++) |
328 |
| - // { |
329 |
| - // if (SubMatrix[i, j] == 0) |
330 |
| - // { |
331 |
| - // float sum = 0; |
332 |
| - // float sumCor = 0; |
333 |
| - // for (int k = 0; k < SubMatrix.GetLength(0); k++) |
334 |
| - // { |
335 |
| - // if (SubMatrix[k, j] != 0) |
336 |
| - // { |
337 |
| - // sum += (SubMatrix[k, j] - average[k]) * corelation[k, i]; |
338 |
| - // sumCor += Math.Abs(corelation[k, i]); |
339 |
| - // } |
340 |
| - // } |
341 |
| - // if (sum != 0) |
342 |
| - // { |
343 |
| - // Suggest(average[i] + sum / sumCor, users[i].User_ID, j, true); |
344 |
| - // result[i, j] = average[i] + sum / sumCor; |
345 |
| - // } |
346 |
| - // } |
347 |
| - // } |
348 |
| - //} |
| 274 | + public void Resuggest1() |
| 275 | + { |
| 276 | + using (EfDbContext context = new EfDbContext()) |
| 277 | + { |
| 278 | + var users = context.Users.Include(x=>x.Profile.RatedBooks).ToList(); |
| 279 | + var books = context.Books.Include(x=>x.BookDetail.RatedUsers).ToList(); |
| 280 | + int maxBookId =context.Books.Select(x => x.Book_ID).Max(); |
| 281 | + float[,] matrix = new float[users.Count, books.Count]; |
| 282 | + float[,] result = new float[users.Count, books.Count]; |
| 283 | + Rate[,] matr = new Rate[users.Count, books.Count]; |
| 284 | + int rateCounter = 0; |
| 285 | + //int[,] korelation = new int[users.Count, users.Count]; |
| 286 | + float[,] corelation = new float[users.Count, users.Count]; |
| 287 | + //List<double> corelation = new List<double>(); |
| 288 | + List<float> average = new List<float>(); |
| 289 | + List<float> diff = new List<float>(); |
| 290 | + for (int i = 0; i < users.Count; i++) |
| 291 | + { |
| 292 | + var rates = users[i].Profile.RatedBooks.Where(x => x.IsSuggestion == false).ToList(); |
| 293 | + float averageRate = 0; |
| 294 | + int countNonZero = 0; |
| 295 | + for (int j = 0; j < books.Count; j++) |
| 296 | + { |
| 297 | + var rate = rates.FirstOrDefault(x => x.Book.Book_ID == books[j].Book_ID); |
| 298 | + if (rate != null) |
| 299 | + { |
| 300 | + matr[i,j] = rate; |
| 301 | + rateCounter++; |
| 302 | + averageRate += rate.RateValue; |
| 303 | + countNonZero++; |
| 304 | + average.Add(averageRate / countNonZero); |
| 305 | + } |
| 306 | + else |
| 307 | + { |
| 308 | + matr[i,j] = |
| 309 | + (new Rate { User = users[i].Profile,IsSuggestion = true,Book = books[j].BookDetail }); |
| 310 | + } |
| 311 | + } |
| 312 | + if (i> 0) |
| 313 | + { |
| 314 | + for (int k = 1; k<= i; k++) //ïî þçåðàì |
| 315 | + { |
| 316 | + double kor = 0; |
| 317 | + float sum = 0, sumSquare1 = 0, sumSquare2 = 0; |
| 318 | + for (int j = 0; j < books.Count; j++) //ïî êíèæêàì |
| 319 | + { |
| 320 | + if (!matr[i, j].IsSuggestion && !matr[i - k, j].IsSuggestion) |
| 321 | + { |
| 322 | + sum += (matr[i, j].RateValue - average.ElementAt(i)) * |
| 323 | + (matr[i - k, j].RateValue - average.ElementAt(i - k)); |
| 324 | + sumSquare1 += (matr[i, j].RateValue - average.ElementAt(i)) * |
| 325 | + (matr[i, j].RateValue - average.ElementAt(i)); |
| 326 | + sumSquare2 += (matr[i - k, j].RateValue - average.ElementAt(i - k)) * |
| 327 | + (matr[i - k, j].RateValue - average.ElementAt(i - k)); |
| 328 | + } |
| 329 | + } |
| 330 | + diff.Add(sumSquare1); |
| 331 | + kor = sum / (Math.Sqrt(sumSquare1) * Math.Sqrt(sumSquare2)); |
| 332 | + corelation[i, i - k] =corelation[i - k, i] = (float)kor; |
| 333 | + } |
| 334 | + } |
| 335 | + } |
| 336 | + Rate[,] SubMatrix = (Rate[,]) matr.Clone(); |
| 337 | + for (int i = 0; i < SubMatrix.GetLength(0); i++) |
| 338 | + { |
| 339 | + for (int j = 0; j < SubMatrix.GetLength(1); j++) |
| 340 | + { |
| 341 | + if (SubMatrix[i, j].IsSuggestion) |
| 342 | + { |
| 343 | + float sum = 0; |
| 344 | + float sumCor = 0; |
| 345 | + for (int k = 0; k < SubMatrix.GetLength(0); k++) |
| 346 | + { |
| 347 | + if (!SubMatrix[k, j] .IsSuggestion&& !float.IsNaN(average[k])) |
| 348 | + { |
| 349 | + sum += (SubMatrix[k, j].RateValue - average[k])*corelation[k, i]; |
| 350 | + sumCor += Math.Abs(corelation[k, i]); |
| 351 | + } |
| 352 | + } |
| 353 | + if (sum != 0 && !float.IsNaN(sum)) |
| 354 | + { |
| 355 | + Suggest((average[i] + sum / sumCor) > 10 ? 10 : (average[i] + sum / sumCor), users[i].User_ID, books[j].Book_ID, true); |
| 356 | + result[i, j] = average[i] + sum/sumCor; |
| 357 | + } |
| 358 | + } |
| 359 | + } |
| 360 | + } |
349 | 361 | }
|
350 | 362 | }
|
351 | 363 | }
|
| 364 | + |
352 | 365 | }
|
0 commit comments