示例#1
0
        public JiaMiTu InitialJiaMiTuPoint(JiaMiTu curMiTu, JiaMiTu father, JiaMiTu mother)
        {
            float totalPoint     = 0;
            var   curMiTuType    = curMiTu.GetType();
            var   fatherMiTuType = curMiTu.GetType();
            var   motherMiTuType = curMiTu.GetType();

            foreach (var field in specialFields)
            {
                var fatherValue = (float)fatherMiTuType.GetField(field).GetValue(father);
                var motherValue = (float)motherMiTuType.GetField(field).GetValue(mother);
                var summary     = fatherValue + motherValue;
                curMiTuType.GetField(field).SetValue(curMiTu, summary);
                totalPoint += summary;
            }


            //curMiTu.BODY_COLOR = father.BODY_COLOR + mother.BODY_COLOR;
            //curMiTu.EYE = father.EYE + mother.EYE;
            //curMiTu.EYE_COLOR = father.EYE_COLOR + mother.EYE_COLOR;
            //curMiTu.FIGURE = father.FIGURE + mother.FIGURE;
            //curMiTu.MOUTH = father.MOUTH + mother.MOUTH;
            //curMiTu.PATTERN = father.PATTERN + mother.PATTERN;
            //curMiTu.PATTERN_COLOR = father.PATTERN_COLOR + mother.PATTERN_COLOR;
            ////汇总得分
            //totalPoint = curMiTu.BODY_COLOR + curMiTu.EYE + curMiTu.EYE_COLOR + curMiTu.FIGURE + curMiTu.MOUTH + curMiTu.PATTERN + curMiTu.PATTERN_COLOR;
            curMiTu.TotalPoint       = totalPoint;
            curMiTu.FatherRareDegree = father.RareDegree;
            curMiTu.MotherRareDegree = mother.RareDegree;
            return(curMiTu);
        }
示例#2
0
        public JiaMiTu InitialJiaMiTu(BsonDocument doc)
        {
            var miTuObj = new JiaMiTu()
            {
                //BODY_COLOR = doc["BODY_COLOR.rare"].ToString()=="true"?1:0,
                //EYE = doc["EYE.rare"].ToString() == "true" ? 1 : 0,
                //EYE_COLOR = doc["EYE_COLOR.rare"].ToString() == "true" ? 1 : 0,
                //FIGURE = doc["FIGURE.rare"].ToString() == "true" ? 1 : 0,
                //MOUTH = doc["MOUTH.rare"].ToString() == "true" ? 1 : 0,
                //PATTERN = doc["PATTERN.rare"].ToString() == "true" ? 1 : 0,
                //PATTERN_COLOR = doc["PATTERN_COLOR.rare"].ToString() == "true" ? 1 : 0,
            };
            var type = miTuObj.GetType();

            try
            {
                //赋值遍历
                foreach (var elem in doc.Elements)
                {
                    if (specialFields.Contains(elem.Name))
                    {
                        var curValue = doc[elem.Name] as BsonDocument;
                        if (curValue.Text("rare") == "true")
                        {
                            var getProperty = type.GetField(elem.Name);
                            if (getProperty != null)
                            {
                                getProperty.SetValue(miTuObj, 1);
                            }
                        }
                    }
                }

                miTuObj.RareDegree = (int)Enum.Parse(typeof(RareDegree), doc.Text("rareDegreeKey"));
            }
            catch (Exception ex)
            {
            }
            return(miTuObj);
        }
示例#3
0
        public async Task start()
        {
            bool   alwayCreateModel = true;                                                                    //是否建立模型文档
            string labelColumn      = "RareDegree";                                                            //需要计算的字段 student

            string[] oneHotColumns    = new string[] {  };                                                     //oneHot编码字段
            string[] features         = new string[] { "FatherRareDegree", "MotherRareDegree", "TotalPoint" }; //特征列, "classCount" "student"
            var      curTypeNameIndex = 4;                                                                     //幼儿园 1小学 4中学 5大学 6驾校 7教育其他
            var      tableName        = "MiTuProfile";
            var      tableNameEgg     = "MiTu";
            //条件筛选项

            var conStr = GetConnectionStr("192.168.1.124", "CrawlerDataBase");
            var dataop = new MongoRepositoryHelperA3(conStr);
            //训练评估查询语句
            var query = Query.And(Query.EQ("isUpdate", 1));
            //预测语句
            var fields = new string[] { "id", "BODY_COLOR", "EYE", "EYE_COLOR", "FIGURE", "MOUTH", "PATTERN", "PATTERN_COLOR", "rareDegreeKey", "parents" };

            var traningJiaMiTuList  = new List <JiaMiTu>(); //训练数据
            var evaluateJiaMiTuList = new List <JiaMiTu>(); //评估数据


            PredictionModel <JiaMiTu, JiaMiTuPrediction> model = null;
            ///模型地址
            var modelFileName = $"{ModelDirectory}/{string.Join("_", features)}-{labelColumn}.zip";

            if (File.Exists(modelFileName))
            {
                model = await PredictionModel.ReadAsync <JiaMiTu, JiaMiTuPrediction>(modelFileName);

                // await在你的Main方法中添加一个方法意味着该Main方法必须具有async修饰符并返回a Task:
                // using System.Threading.Tasks;
                // 评估模型
            }
            else
            {
                if (model == null)
                {
                    var allExistJiaMiTuDocList = dataop.FindByQuery(tableName, query).SetFields(fields).ToList();
                    var allCount     = allExistJiaMiTuDocList.Count();
                    int traningCount = (int)(allCount * 0.7);//评估的数据源个数
                    ///加载模型需要数据
                    foreach (var traningJiaMiTu in allExistJiaMiTuDocList)
                    {
                        if (!traningJiaMiTu.Contains("parents"))
                        {
                            continue;
                        }
                        var parents = traningJiaMiTu["parents"] as BsonArray;
                        if (parents.Count <= 1)
                        {
                            continue;
                        }
                        var father = parents[0] as BsonDocument;
                        var mother = parents[1] as BsonDocument;

                        var curJiaMiTu = InitialJiaMiTu(traningJiaMiTu); //赋值字段
                                                                         //var fatherDoc = allExistJiaMiTuDocList.Where(c => c.Text("id") == father.Text("petId")).FirstOrDefault();
                                                                         //var motherDoc = allExistJiaMiTuDocList.Where(c => c.Text("id") == mother.Text("petId")).FirstOrDefault();
                        var fatherDoc = dataop.FindOne(tableName, Query.EQ("id", father.Text("petId")));
                        var motherDoc = dataop.FindOne(tableName, Query.EQ("id", mother.Text("petId")));

                        if (fatherDoc == null || motherDoc == null)
                        {
                            continue;
                        }
                        //父亲
                        var fatherMiTu = InitialJiaMiTu(fatherDoc);
                        //母亲
                        var motherMiTu = InitialJiaMiTu(motherDoc);
                        //当前加密兔

                        curJiaMiTu = InitialJiaMiTuPoint(curJiaMiTu, fatherMiTu, motherMiTu);//计算得分
                        if (curJiaMiTu.TotalPoint <= 0)
                        {
                            continue;
                        }
                        if (traningJiaMiTuList.Count <= traningCount)
                        {
                            traningJiaMiTuList.Add(curJiaMiTu);
                        }
                        else
                        {
                            evaluateJiaMiTuList.Add(curJiaMiTu);
                        }
                    }
                    //PredictionModel<JiaMiTu, JiaMiTuPrediction> model = TrainAsync();
                    //改变的返回类型Train方法意味着你必须一个补充await,以调用codde Train在Method下面的代码如下所示:
                    model = await Train(traningJiaMiTuList, modelFileName, labelColumn, oneHotColumns, features, specialFields);
                }
                Evaluate(evaluateJiaMiTuList, model);
            }
            var prediction1 = model.Predict(TestTrips.Trip1);

            Console.WriteLine("确认模型后按回车开始");

            // var query = Query.And(Query.Exists("student", true), Query.Exists("teacher", true), Query.Exists("classCount", false));

            var allJiaMiTuList = dataop.FindByQuery(tableNameEgg, Query.And(Query.Exists("pIds", true), Query.NE("isPredic", 1), Query.NE("isPass", 1))).ToList();
            var ExecNum        = Guid.NewGuid().ToString();
            var index          = 1;

            foreach (var JiaMiTu in allJiaMiTuList)
            {
                /// 比如没有班级字段通过模型的学生和老师个数来预测班级数
                var id        = JiaMiTu.Text("id");
                var pIds      = JiaMiTu["pIds"] as BsonArray;
                var fatherDoc = dataop.FindOne(tableName, Query.EQ("id", pIds[0].ToString()));
                var motherDoc = dataop.FindOne(tableName, Query.EQ("id", pIds[1].ToString()));
                if (fatherDoc == null || motherDoc == null)
                {
                    continue;
                }
                var doc = new BsonDocument();
                doc.Set("ExecNum", ExecNum);
                //父亲
                var fatherMiTu = InitialJiaMiTu(fatherDoc);
                //母亲
                var motherMiTu = InitialJiaMiTu(motherDoc);
                //当前加密兔
                var Trip1 = InitialJiaMiTu(JiaMiTu);                        //赋值字段
                Trip1 = InitialJiaMiTuPoint(Trip1, fatherMiTu, motherMiTu); //计算得分
                if (motherMiTu.RareDegree >= (int)RareDegree.rare && fatherMiTu.RareDegree <= (int)RareDegree.rare || fatherMiTu.RareDegree >= (int)RareDegree.rare && motherMiTu.RareDegree <= (int)RareDegree.rare)
                {
                    var prediction = model.Predict(Trip1);

                    if (prediction.RareDegree != 0)
                    {
                        string txt = EnumDescription.GetFieldText((RareDegree)prediction.RareDegree);
                        doc.Add($"{labelColumn}Predic", prediction.RareDegree);
                        doc.Add($"{labelColumn}PredicTxt", txt);//总得分
                        if (txt != doc.Text("rareDegree"))
                        {
                        }
                        #region 操作日志字段
                        doc.Add("isPredic", 1);             //是否预测字段
                        doc.Add("point", Trip1.TotalPoint); //总得分


                        DBChangeQueue.Instance.EnQueue(new StorageData()
                        {
                            Name = tableNameEgg, Document = doc, Query = Query.EQ("_id", ObjectId.Parse(JiaMiTu.Text("_id"))), Type = StorageType.Update
                        });
                        #endregion
                    }
                    Console.WriteLine($"fatherRareDegree:{fatherMiTu.RareDegree}motherRareDegree{motherMiTu.RareDegree} predic:{prediction.RareDegree} id:{id}");
                }
                else
                {
                    doc.Add("isPass", 1);//是否预测字段
                    DBChangeQueue.Instance.EnQueue(new StorageData()
                    {
                        Name = tableNameEgg, Document = doc, Query = Query.EQ("_id", ObjectId.Parse(JiaMiTu.Text("_id"))), Type = StorageType.Update
                    });
                }
                index++;
                if (index % 100 == 0)
                {
                    Console.WriteLine("剩余处理{0}{1}", allJiaMiTuList.Count - index, ExecNum);
                }
            }
            StartDBChangeProcessQuick(dataop);
            Console.WriteLine("操作结束" + ExecNum);
        }