赞
踩
人类一直试图让机器具有智能,也就是人工智能(Artificial Intelligence)。从上世纪50年代,人工智能
的发展经历了“推理期”,通过赋予机器逻辑推理能力使机器获得智能,当时的AI程序能够证明一些著名的
数学定理,但由于机器缺乏知识,远不能实现真正的智能。因此,70年代,人工智能的发展进入“知识
期”,即将人类的知识总结出来教给机器,使机器获得智能。在这一时期,大量的专家系统问世,在很多
领域取得大量成果,但由于人类知识量巨大,故出现“知识工程瓶颈”
\quad无论是“推理期”还是“知识期”,机器都是按照人类设定的规则和总结的知识运作,永远无法超越其
创造者,其次人力成本太高。于是,一些学者就想到,如果机器能够自我学习问题不就迎刃而解了吗!
机器学习(Machine Learning)方法应运而生,人工智能进入“机器学习时期”。“机器学习时期”也分为
三个阶段,80年代,连接主义较为流行,代表工作有感知机(Perceptron)和神经网络(Neural
Network)。90年代,统计学习方法开始占据主流舞台,代表性方法有支持向量机(Support Vector
Machine),进入21世纪,深度神经网络被提出,连接主义卷土从来,随着数据量和计算能力的不断提
升,以深度学习(Deep Learning)为基础的诸多AI应用逐渐成熟
机器学习是一类算法的总称,这些算法企图从大量历史数据中挖掘出其中隐含的规律,并用于预测
或者分类,更具体的说,机器学习可以看作是寻找一个函数,输入是样本数据,输出是期望的结
果,只是这个函数过于复杂,以至于不太方便形式化表达。需要注意的是,机器学习的目标是使学
到的函数很好地适用于“新样本”,而不仅仅是在训练样本上表现很好。学到的函数适用于新样本的
能力,称为泛化(Generalization)能力
通常机器学习,目的是,找到一个函数,针对任何输入:语音,图片,文字,都能够自动输出正确
的结果
按照任务类型分
从方法的角度来分类
按照学习理论分,机器学习模型可以分为有监督学习,半监督学习,无监督学习,迁移学习和强化学习
回归的目的是通过几个已知的数据来预测另一个数值型数据的目标值,假设特征和结果满足线性关系,
即满足一个计算公式h(x),这个公式自变量就是已知的数据x,函数h(x)就是要预测的目标值,这一算法公式被称为回归方程式,得到这个方程就成为回归
大多数现实世界的分析不止一个自变量,大多数情况下,很有可能使用多元线性回归
LinearRegression
<1> setMaxIter():设置最大迭代次数
<2> setRegParam(): 设置正则项的参数,控制损失函数与惩罚项的比例,防止整个训练过程过拟合
<3>
setElasticNetParam():使用L1范数还是L2范数
setElasticNetParam=0.0 为L2正则化;
setElasticNetParam=1.0 为L1正则化;
setElasticNetParam=(0.0,1.0) 为L1,L2组合<4> setFeaturesCol():指定特征列的列名,传入Array类型
<5>setLabelCol():指定标签列的列名,传入String类型
<6>setPredictionCol():指定预测列的列名
<7>setFitIntercept(value:Boolean):是否需要偏置,默认为true(即是否需要y=wx+b中的b)
<8>setStandardization(value:Boolean):模型训练时,是否对各特征值进行标准化处理,默认为true
<9>setSolver(value:String):设置用于优化求解器。线性回归支持的有l-bfgs(有限内存拟牛顿法),normal(加权最小二乘法)和auto(自动选择)。
<10>setTol(value:Double):设置迭代的收敛公差。值越小准确性越高但是迭代成本增加。默认值为1E-6。(即损失函数)
<11>setWeightCol(value:String):设置某特征列的权重值,如果不设置或者为空,默认所有实例的权重为1。
<12>setAggregationDepth:建议深度大于或等于2,默认为2。如果特征维度较大或者数据的分区量大的时候,可以调大该值。
<13>fit:基于训练街训练出模型
<14>transform:基于训练出的模型对测试集进行预测
LinearRegressionModel
4 1:1 2:1 3:1 7 1:2 2:2 3:2 11 1:3 2:3 3:3 14 1:4 2:4 3:4 16 1:5 2:5 3:5 19 1:6 2:6 3:6 22 1:7 2:7 3:7 26 1:8 2:8 3:8 29 1:9 2:9 3:9 31 1:10 2:10 3:10 34 1:11 2:11 3:11 37 1:12 2:12 3:12 41 1:13 2:13 3:13 44 1:14 2:14 3:14 46 1:15 2:15 3:15 49 1:16 2:16 3:16 53 1:17 2:17 3:17 55 1:18 2:18 3:18 59 1:19 2:19 3:19 62 1:20 2:20 3:20 64 1:21 2:21 3:21 68 1:22 2:22 3:22 71 1:23 2:23 3:23 73 1:24 2:24 3:24 76 1:25 2:25 3:25 79 1:26 2:26 3:26 83 1:27 2:27 3:27 85 1:28 2:28 3:28 89 1:29 2:29 3:29 92 1:30 2:30 3:30 95 1:31 2:31 3:31 98 1:32 2:32 3:32 101 1:33 2:33 3:33 104 1:34 2:34 3:34 107 1:35 2:35 3:35 110 1:36 2:36 3:36 112 1:37 2:37 3:37 115 1:38 2:38 3:38 119 1:39 2:39 3:39 122 1:40 2:40 3:40 124 1:41 2:41 3:41 127 1:42 2:42 3:42 131 1:43 2:43 3:43 134 1:44 2:44 3:44 136 1:45 2:45 3:45 140 1:46 2:46 3:46 142 1:47 2:47 3:47 146 1:48 2:48 3:48 148 1:49 2:49 3:49 151 1:50 2:50 3:50 155 1:51 2:51 3:51 157 1:52 2:52 3:52 160 1:53 2:53 3:53 164 1:54 2:54 3:54 167 1:55 2:55 3:55 169 1:56 2:56 3:56 172 1:57 2:57 3:57 176 1:58 2:58 3:58 178 1:59 2:59 3:59 182 1:60 2:60 3:60 185 1:61 2:61 3:61 187 1:62 2:62 3:62 191 1:63 2:63 3:63 193 1:64 2:64 3:64 196 1:65 2:65 3:65 200 1:66 2:66 3:66 202 1:67 2:67 3:67 205 1:68 2:68 3:68 208 1:69 2:69 3:69 211 1:70 2:70 3:70 215 1:71 2:71 3:71 218 1:72 2:72 3:72 221 1:73 2:73 3:73 223 1:74 2:74 3:74 226 1:75 2:75 3:75 230 1:76 2:76 3:76 232 1:77 2:77 3:77 235 1:78 2:78 3:78 238 1:79 2:79 3:79 242 1:80 2:80 3:80 244 1:81 2:81 3:81 247 1:82 2:82 3:82 250 1:83 2:83 3:83 254 1:84 2:84 3:84 257 1:85 2:85 3:85 260 1:86 2:86 3:86 263 1:87 2:87 3:87 265 1:88 2:88 3:88 269 1:89 2:89 3:89 272 1:90 2:90 3:90 274 1:91 2:91 3:91 278 1:92 2:92 3:92 280 1:93 2:93 3:93 284 1:94 2:94 3:94 286 1:95 2:95 3:95 289 1:96 2:96 3:96 292 1:97 2:97 3:97 295 1:98 2:98 3:98 299 1:99 2:99 3:99 301 1:100 2:100 3:100
object Hello05Number { def main(args: Array[String]): Unit = { //创建SparkSession val sparkSession = SparkSession.builder().master("local").appName("Hello05Number").getOrCreate() //开始读取数据,format("libsvm")默认读取数据格式 val dataFrame = sparkSession.read.format("libsvm").load("src/main/data/sample_number.txt") //将数据分为训练数据和测试数据 val Array(trainingData, testData) = dataFrame.randomSplit(Array(0.7, 0.3)) //创建线性回归 val linearRegression = new LinearRegression() .setMaxIter(10) .setRegParam(0.3) .setElasticNetParam(0.8) .setFitIntercept(true) //开始适配模型 val model = linearRegression.fit(trainingData) println("线性回归系数:" + model.coefficients) println("线性回归截断值:" + model.intercept) //获取模型的综合评估信息 val summary = model.summary println("根据训练用例" + summary.rootMeanSquaredError) //预估值,调用方式进行对数据预测 println("计算向量(2,2,2)的预估值" + model.predict(Vectors.dense(2, 2, 2))) println("计算向量(3,3,3)的预估值" + model.predict(Vectors.dense(3, 3, 3))) //根据测试数据获取模型的评估值 val regressionSummary = model.evaluate(testData) println("根据测试用例获取:" + regressionSummary.rootMeanSquaredError) //保存模型 model.save("models/number_" + UUID.randomUUID()) } }
贝叶斯是机器学习的核心方法之一
托马斯·贝叶斯(Thomas Bayes)
贝叶斯方法源于他生前为解决一个“逆概”问题写的一篇文章,而这篇文章是在他死后才由他的一位
朋友发表出来的。
在贝叶斯写这篇文章之前,人们已经能够计算“正向概率”,如“假设袋子里面有N个白球,M个黑
球,你伸手进去摸一把,摸出黑球的概率是多大”。
而一个自然而然的问题是反过来:“如果我们事先并不知道袋子里面黑白球的比例,而是闭着眼睛
摸出一个(或好几个)球,观察这些取出来的球的颜色之后,那么我们可以就此对袋子里面的黑白
球的比例作出什么样的推测”。
这个问题,就是所谓的逆概问题
我们进行了n次独立试验,其中有r次成功。其余的试验(n-r)失败。
三种方法:相对频率,拉普拉斯平滑定理和M-估计
yes,亚瑟 廉颇 牛魔 太乙真人 程咬金 廉颇 葫芦娃 no,张飞 程咬金 牛魔 张飞 吕布 程咬金 yes,吕布 东皇太一 程咬金 钟无艳 吕布 吕布 yes,东皇太一 芈月 牛魔 亚瑟 东皇太一 廉颇 no,吕布 钟无艳 芈月 太乙真人 庄周 廉颇 no,亚瑟 牛魔 牛魔 廉颇 钟无艳 亚瑟 no,吕布 程咬金 东皇太一 庄周 亚瑟 钟无艳 no,芈月 吕布 庄周 吕布 吕布 廉颇 yes,亚瑟 张飞 廉颇 张飞 东皇太一 程咬金 yes,亚瑟 牛魔 太乙真人 太乙真人 亚瑟 东皇太一 no,庄周 吕布 钟无艳 东皇太一 牛魔 牛魔 蛇精 yes,吕布 太乙真人 钟无艳 芈月 芈月 钟无艳 yes,东皇太一 张飞 程咬金 张飞 廉颇 程咬金 yes,亚瑟 廉颇 廉颇 芈月 钟无艳 东皇太一 yes,牛魔 张飞 庄周 芈月 吕布 廉颇 yes,芈月 庄周 钟无艳 芈月 东皇太一 牛魔 yes,太乙真人 芈月 芈月 牛魔 牛魔 程咬金 no,太乙真人 钟无艳 亚瑟 芈月 亚瑟 东皇太一 蛇精 no,张飞 庄周 张飞 程咬金 芈月 程咬金 yes,东皇太一 钟无艳 亚瑟 牛魔 吕布 牛魔 yes,张飞 庄周 吕布 廉颇 牛魔 钟无艳 no,太乙真人 牛魔 芈月 钟无艳 太乙真人 吕布 yes,东皇太一 东皇太一 庄周 张飞 牛魔 牛魔 no,廉颇 程咬金 廉颇 庄周 廉颇 钟无艳 yes,钟无艳 程咬金 程咬金 程咬金 太乙真人 芈月 yes,程咬金 东皇太一 钟无艳 张飞 庄周 吕布 葫芦娃 yes,廉颇 牛魔 芈月 程咬金 庄周 庄周 yes,东皇太一 牛魔 东皇太一 牛魔 程咬金 廉颇 yes,钟无艳 吕布 太乙真人 芈月 东皇太一 庄周 yes,程咬金 廉颇 廉颇 庄周 东皇太一 亚瑟 yes,廉颇 程咬金 钟无艳 张飞 亚瑟 庄周 yes,牛魔 张飞 廉颇 太乙真人 东皇太一 芈月 no,钟无艳 牛魔 庄周 程咬金 吕布 庄周 yes,芈月 亚瑟 庄周 张飞 程咬金 芈月 no,张飞 钟无艳 庄周 牛魔 东皇太一 太乙真人 yes,牛魔 廉颇 牛魔 太乙真人 程咬金 吕布 yes,吕布 东皇太一 亚瑟 太乙真人 程咬金 庄周 no,亚瑟 程咬金 太乙真人 庄周 芈月 东皇太一 蛇精 no,钟无艳 东皇太一 太乙真人 芈月 张飞 太乙真人 no,钟无艳 庄周 牛魔 张飞 芈月 芈月 yes,程咬金 亚瑟 亚瑟 东皇太一 牛魔 东皇太一 yes,芈月 太乙真人 亚瑟 钟无艳 吕布 钟无艳 yes,吕布 太乙真人 廉颇 太乙真人 张飞 东皇太一 yes,牛魔 钟无艳 程咬金 庄周 牛魔 张飞 no,张飞 芈月 吕布 张飞 廉颇 牛魔 yes,钟无艳 程咬金 程咬金 芈月 芈月 庄周 no,芈月 亚瑟 亚瑟 牛魔 钟无艳 廉颇 蛇精 no,亚瑟 钟无艳 廉颇 程咬金 廉颇 张飞 yes,钟无艳 吕布 吕布 吕布 程咬金 亚瑟 yes,吕布 庄周 太乙真人 亚瑟 庄周 程咬金 yes,芈月 程咬金 钟无艳 亚瑟 吕布 吕布 no,吕布 张飞 吕布 庄周 吕布 廉颇 yes,太乙真人 芈月 廉颇 庄周 廉颇 东皇太一 no,太乙真人 芈月 芈月 亚瑟 程咬金 亚瑟 yes,东皇太一 太乙真人 钟无艳 东皇太一 程咬金 牛魔 yes,亚瑟 钟无艳 程咬金 张飞 太乙真人 廉颇 yes,钟无艳 程咬金 东皇太一 廉颇 廉颇 牛魔 yes,张飞 廉颇 吕布 芈月 廉颇 东皇太一 yes,钟无艳 吕布 亚瑟 芈月 庄周 吕布 no,亚瑟 牛魔 张飞 牛魔 庄周 太乙真人 yes,吕布 亚瑟 程咬金 亚瑟 钟无艳 太乙真人 no,东皇太一 东皇太一 张飞 亚瑟 亚瑟 廉颇 yes,牛魔 牛魔 廉颇 亚瑟 程咬金 牛魔 葫芦娃 no,亚瑟 程咬金 吕布 太乙真人 东皇太一 亚瑟 蛇精 yes,亚瑟 东皇太一 牛魔 庄周 吕布 张飞 no,程咬金 牛魔 程咬金 牛魔 钟无艳 牛魔 no,芈月 张飞 芈月 张飞 太乙真人 牛魔 yes,廉颇 东皇太一 庄周 吕布 庄周 吕布 yes,牛魔 钟无艳 钟无艳 牛魔 庄周 庄周 yes,钟无艳 牛魔 亚瑟 东皇太一 东皇太一 太乙真人 葫芦娃 yes,钟无艳 程咬金 东皇太一 程咬金 程咬金 钟无艳 no,钟无艳 吕布 芈月 亚瑟 张飞 庄周 no,牛魔 庄周 廉颇 东皇太一 程咬金 吕布 蛇精 yes,吕布 牛魔 程咬金 庄周 牛魔 张飞 yes,程咬金 亚瑟 吕布 吕布 牛魔 亚瑟 no,庄周 廉颇 太乙真人 太乙真人 庄周 东皇太一 no,廉颇 庄周 庄周 吕布 张飞 程咬金 no,吕布 东皇太一 钟无艳 张飞 东皇太一 钟无艳 yes,庄周 张飞 牛魔 张飞 芈月 东皇太一 yes,钟无艳 吕布 程咬金 芈月 吕布 吕布 no,庄周 吕布 庄周 廉颇 廉颇 牛魔 no,庄周 牛魔 廉颇 东皇太一 太乙真人 亚瑟 no,牛魔 太乙真人 芈月 东皇太一 廉颇 程咬金 no,吕布 张飞 东皇太一 东皇太一 廉颇 程咬金 yes,廉颇 钟无艳 庄周 廉颇 牛魔 亚瑟 no,庄周 东皇太一 吕布 张飞 牛魔 芈月 no,太乙真人 张飞 张飞 芈月 钟无艳 程咬金 no,吕布 芈月 庄周 钟无艳 亚瑟 吕布 yes,东皇太一 庄周 牛魔 亚瑟 钟无艳 牛魔 no,程咬金 亚瑟 东皇太一 钟无艳 吕布 廉颇 no,太乙真人 庄周 东皇太一 亚瑟 庄周 牛魔 no,吕布 东皇太一 庄周 牛魔 吕布 张飞 蛇精 yes,廉颇 张飞 芈月 吕布 东皇太一 吕布 yes,廉颇 张飞 吕布 亚瑟 吕布 芈月 no,廉颇 张飞 吕布 芈月 太乙真人 太乙真人 no,太乙真人 钟无艳 钟无艳 钟无艳 庄周 吕布 no,钟无艳 东皇太一 牛魔 廉颇 吕布 东皇太一 yes,芈月 太乙真人 芈月 张飞 廉颇 庄周 yes,蛇精,葫芦娃
/** * 1:创建环境 * 2:读取数据 * 3:转换为dataFrame */ object Hello06NaiveBayes { def main(args: Array[String]): Unit = { //创建环境 val sparkSession = SparkSession.builder().master("local").appName("Hello06NaiveBayes").getOrCreate() import sparkSession.implicits._ //读取数据 val lineRDD = sparkSession.read.textFile("src/main/data/sample_string.txt").rdd //转成LabeledPoint val dataRDD = lineRDD.map(line => { var label = 0; if ("yes".equals(line.split(",")(0))) { label = 1; } var words = line.split(",")(1).split("\t").filter(_.length > 0) Row(label, words) }) //构建类型,将dataSet转换为dataFrame val schema = StructType(List( StructField("label", IntegerType, nullable = false), StructField("words", ArrayType(StringType, true), nullable = false), )) //转成DataFrame val lineFrame = sparkSession.createDataFrame(dataRDD, schema) //转换 将array<String>转成 array<double> val countVectorizer = new CountVectorizer() countVectorizer.setInputCol("words").setOutputCol("features") val vectorizerModel = countVectorizer.fit(lineFrame) val dataFrame = vectorizerModel.transform(lineFrame) // dataFrame.foreach(w=>println(w)) // dataFrame.printSchema() //拆分数据 val Array(trainingData, testData) = dataFrame.randomSplit(Array(1.0, 0.1)) //开始进行计算 val model = new NaiveBayes().fit(trainingData) //转换数据 val predictions = model.transform(testData) predictions.foreach(w => println(w)) //对算法的准确性进行判定 val evaluator = new MulticlassClassificationEvaluator() .setLabelCol("label") .setPredictionCol("prediction") .setMetricName("accuracy") val accuracy = evaluator.evaluate(predictions) println(s"Test set accuracy = $accuracy") sparkSession.stop(); } }
给事物打标签,寻找同一组内的个体之间的一些潜在的相似模式。力图找到数据的自然分组kmeans。
聚类是一种无监督的机器学习任务,它可以自动将数据划分成类cluster。因此聚类分组不需要提前被告知所划分的组应该是什么样的。因为我们甚至可能都不知道我们在寻找什么,所以聚类是用于知识发现而不是预测
聚类原则是一个组内的记录彼此必须非常相似,而与该组之外的记录截然不同。所有聚类做的就是
遍历所有数据然后找到这些相似性
市场购物篮分析的结果是一组指定商品之间关系模式的关联规则
一个典型的规则可以表述为: {花生酱,果酱} –> {面包}
这个关联规则用通俗易懂的语言来表达就是:如果购买了花生酱和果酱,
那么也很有可能会购买面包。
更加典型的还有一个 啤酒—尿布 的例子
一个项集或者规则度量法的支持度是指在数据中出现的频率
置信度是指改规则的预测能力或者准确度的度量
决策树和随机森林都是一种非线性有监督分类模型,非线性不存在不可分问题
决策树的生成,数据不断分裂的递归过程,每一次分裂,尽可能让类别一样的数据在树的一边,当树的叶子节点的数据都是一类的时候,则停止分类。(类比if else语句。)
对于决策树的预判准确性,通过混淆矩阵来进行计算可用性
针对二分类问题来看,要么预测正确要么预测失败。
从结果正确存在两种可能:原本对的预测为对,原本错的预测为错;
结果错误也存在两种可能:原本对的预测为错,原本错的预测为对
ROC(Receiver Operating Characteristic)曲线和AUC(Area Under the Curve)值常被用来评价一个二值分类器(binary classifier)的优劣
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9P11Mnjg-1655256599504)(C:\Users\wangyuan\AppData\Roaming\Typora\typora-user-images\1655256377531.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P824Ak2u-1655256599506)(C:\Users\wangyuan\AppData\Roaming\Typora\typora-user-images\1655256383544.png)]
AUC计算公式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VMD7Vf1x-1655256599506)(C:\Users\wangyuan\AppData\Roaming\Typora\typora-user-images\1655256473943.png)]
AUC值介于0到1之间,关于AUC值的判断说明如下:
AUC<0.5:不符合实际情况, 预测诊断比随机性猜测还差,实际情况中不应该出现;
AUC=0.5:说明完全无预测诊断价值,预测准确率和猜测效果一样;
0.5< AUC <0.7:预测诊断价值很低,此种情况相对较常见;
0.7<=AUC<0.9:预测诊断价值高,此种情况较常见;
AUC>=0.9:说明预测诊断价值高,此种情况较好;
原本为对的当中,预测为对的比例(越大越好,1为理想状态)
ROC(Receiver Operating Characteristic)曲线和AUC(Area Under the Curve)值常被用来评价一个二值分类器(binary classifier)的优劣
AUC值介于0到1之间,关于AUC值的判断说明如下:
AUC<0.5:不符合实际情况, 预测诊断比随机性猜测还差,实际情况中不应该出现;
AUC=0.5:说明完全无预测诊断价值,预测准确率和猜测效果一样;
0.5< AUC <0.7:预测诊断价值很低,此种情况相对较常见;
0.7<=AUC<0.9:预测诊断价值高,此种情况较常见;
AUC>=0.9:说明预测诊断价值高,此种情况较好;
AUC = 1,是完美预测没有瑕疵,绝大多数情况下,不存在完美的预测诊断(过拟合情况)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。