mail.cpp
上传用户:xmhs66
上传日期:2022-07-26
资源大小:989k
文件大小:2k
源码类别:

生物技术

开发平台:

Visual C++

  1. /*************************************************************************
  2.  * * filename: mail.cpp
  3.  * * description: Mail类实现:从文件中解析数据,以欧式距离或余弦计算相似度
  4.  * * student: Liwanjun
  5.  * * data: 2010-03-29 
  6.  * **********************************************************************/ 
  7. #include "mail.h"
  8. #include <cstdlib>
  9. #include <cmath>
  10. #include <iostream>
  11. #include <fstream>
  12. #include <algorithm>
  13. using std::string;
  14. using std::ofstream;
  15. using std::endl;
  16. const string delim(","); 
  17. //初始化Mail对象,读取文件的每一行,解析并保存维度值和分类值
  18. void Mail::initialize(string rec)
  19. {
  20. recstr = rec;
  21.     string::size_type begIdx = 0, endIdx = 0;
  22. int count = 0;
  23. int i = 1;
  24. string tempstr;
  25. while(true)
  26. {
  27. endIdx = rec.find_first_of(delim, begIdx);
  28. if(endIdx == string::npos)
  29. {
  30. endIdx = rec.length();
  31. break;
  32. }
  33. tempstr = rec.substr(begIdx, endIdx - begIdx);
  34. dimvec.push_back(atof(tempstr.c_str()));
  35. begIdx = endIdx + 1;
  36. }
  37. tempstr = rec.substr(begIdx, endIdx - begIdx);
  38. spam = atof(tempstr.c_str());
  39. }
  40. //构造Mail对象,由于测试集没有分类属性,因此用istest来区分不同的初始化行为
  41. //istest = 1表示测试集
  42. Mail::Mail(string rec, bool istest)
  43. {
  44. initialize(rec);
  45. if(istest)
  46. {
  47. dimvec.push_back(spam);
  48. spam = 0;
  49. }
  50. }
  51. //当前Mail对象与指定Mail对象间的欧氏距离
  52. double Mail::euclidDis(const Mail& mail)
  53. {
  54. double total = 0.;
  55. for(int i = 0; i < dimvec.size(); i++)
  56. {
  57. total += (dimvec[i] - mail.dimvec[i]) * 
  58. (dimvec[i] - mail.dimvec[i]); 
  59. }
  60. double dis = sqrt(total);
  61. return dis;
  62. }
  63. //当前Mail对象与指定Mail对象间的向量夹角余弦
  64. double Mail::cosin(const Mail& mail)
  65. {
  66. double cos = 0., inner = 0., norm = 0., tempx = 0., tempy = 0.;
  67. for(int i = 0; i < dimvec.size(); i++)
  68. {
  69. inner += dimvec[i] * mail.dimvec[i];
  70. tempx += dimvec[i] * dimvec[i];
  71. tempy += mail.dimvec[i] * mail.dimvec[i];
  72. }
  73. norm = sqrt(tempx) * sqrt(tempy);
  74. cos = inner / norm;
  75. return 1 - cos;
  76. }