knn code is done
This commit is contained in:
parent
4a8006ea0e
commit
b4026d37cf
|
@ -0,0 +1,63 @@
|
|||
import sys
|
||||
|
||||
import numpy as np
|
||||
from pyspark import SparkContext
|
||||
from pyspark.sql import SQLContext
|
||||
from pyspark.mllib.linalg import Vectors
|
||||
import numpy as np
|
||||
from operator import add
|
||||
|
||||
def computeDist(a,b):
|
||||
return np.sqrt(np.sum((a-b)**2))
|
||||
class KNN:
|
||||
'''
|
||||
KNN is used for classification
|
||||
'''
|
||||
def __init__(self,featuresCol="features", labelCol="label",):
|
||||
self.featuresCol,self.labelCol = featuresCol,labelCol
|
||||
|
||||
#:dataSet.map(lambda row:row[1],X[0].toArray() + row[0].toArray())
|
||||
|
||||
|
||||
def classifyX(X):
|
||||
'''
|
||||
classify a unlabeled point
|
||||
param: X: a unlabeled point
|
||||
'''
|
||||
print X[0]
|
||||
return X[0]
|
||||
def classify(self,inXs,dataSet,k=10):
|
||||
'''
|
||||
classify unlabeled points in inXs.
|
||||
:param inXs: points to be classified.
|
||||
:param dataSEt: points that have been labeled.
|
||||
:param k: using k nearest neighbors of some unlabeled point to determine its label, default to be 10 when not set.
|
||||
'''
|
||||
if len(inXs) != len(dataSet.first()[0].values):
|
||||
print "length of features of inXs is not corresponding with dataset's"
|
||||
return
|
||||
dis = dataSet.map(lambda row: (row[1],computeDist(row[0].toArray(),np.array(inXs))))
|
||||
|
||||
def f(x):
|
||||
print x
|
||||
#dis.foreach(f)
|
||||
orderedDis = dis.takeOrdered(k, key=lambda x: x[1])
|
||||
#print orderedDis
|
||||
|
||||
groupLabel = sc.parallelize(orderedDis).map(lambda row:(row[0],1)).reduceByKey(add).takeOrdered(1,key=lambda row:-row[1])[0][0]
|
||||
print groupLabel
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sc = SparkContext(appName="KNN")
|
||||
sqlContext = SQLContext(sc)
|
||||
dataSet = sqlContext.createDataFrame([(Vectors.dense([2,3,4,5]),1),
|
||||
(Vectors.dense([1,2,3,4]),1),
|
||||
|
||||
(Vectors.dense([3,4,5,6]),2)],
|
||||
['features','label'])
|
||||
inXs = [1,2,3,4]
|
||||
knn = KNN()
|
||||
knn.classify(inXs,dataSet,10)
|
|
@ -70,7 +70,7 @@ tabsize=3
|
|||
手写识别(Handwriting recognition)是计算机在纸、照片、触摸屏或其他设备中接收并识别人手写的文字等信息的技术,主要应用于光学字符识别(OCR)。手写识别系统能够用来识别汉字、英语、数字等字符。不过本报告的重点不在手写识别,而在于理解MLlib中的机器学习算法,因此以识别数字为例。识别数字0~9是个十类别问题,分类算法中最常用的场景是二分类,如果要用二分类解决这个问题,要采用one-against-one和one-against-all等做法进行处理,虽然复杂些,但是基本原理是一样的。因此本报告把主要关注点放在对MLlib算法的研究,只利用0和1的样本从而解决二分类问题。
|
||||
|
||||
\subsection{Logistic Regression}
|
||||
在Zaharia提出Spark的论文中,他使用了Logistic Regression来作为一个实例来展示介绍Spark,因此在本报告中我也利用Logistic Regression来解决手写识别问题。其实在本质上Logistic Regression是个线性回归,它只不过是在特征到结果的映射过程中多加了一个二值函数映射:即先把样本的特征线性求和,接着把该连续值映射到0和1上。其大致的思路如下图所示:
|
||||
在Zaharia提出Spark的论文中,他使用了Logistic Regression来作为一个实例来展示介绍Spark,因此在本报告中我也利用Logistic Regression来解决手写识别问题。Logistic Regression是比较常用的机器学习方法,用于估计某种事物的可能性,广告预测、用户行为预测和疾病预测等都经常用到它。它可以用来做回归,也可以用来分类,并且主要是二分类,在分类的时候,Logistic Regression不仅能分别出一个样本属于哪个类,还能计算出这个样本属于某个类类的可能性是多少。其实在本质上Logistic Regression是个线性回归,它只不过是在特征到结果的映射过程中多加了一个二值函数g映射:即先把样本的特征线性求和,接着把该连续值映射到0和1上。其大致的思路如下图所示:
|
||||
\begin{figure}[h!]
|
||||
\centering
|
||||
\includegraphics[width=8cm]{LG_arch.png}
|
||||
|
@ -78,7 +78,7 @@ tabsize=3
|
|||
\label{LG_arch}
|
||||
\end{figure}
|
||||
|
||||
|
||||
这里w是模型参数,也就是回归系数,g是sigmoid函数,这个函数实际上是由对数几率变换的来的。在对Logistic Regression求解的时候,我见过最多的介绍的都是随机梯度下降(SGD)方法,
|
||||
|
||||
\subsection{MLlib算法主要机制}
|
||||
在MLlib中有许多的概念,其中对理解其算法比较重要的有:\emph{DataFrame},\emph{Pipeline},\emph{Transfromer}和\emph{Estimator}。
|
||||
|
@ -325,4 +325,5 @@ if ($(fitIntercept)) {
|
|||
\item Spark对API的支持很棒,虽然Spark使用scala开发的,但是它还提供了几乎一致的针对Java、python和R的接口,这能使更多语言背景的开发者轻松的使用Saprk进行开发。
|
||||
\item 机器学习库工具比较完善,虽然目前Saprk MLlib实现的知识一些常用的算法,但是它却提供了很多的工具类,比如能够方便地对数据进行切分,拆分出训练数据和测试数据,对于训练的模型也提供了能够进行专业评估的工具类。因此 用Spark开发机器学习应用很方便,效率很快。
|
||||
\end{itemize}
|
||||
很感谢谭老师给我们布置这样的作业,让我接触到了Spark,为我以后的研究工作储备了更多的方法。否则我很难有机会主动地去接触这些新鲜的大数据技术,通过对Spark的了解熟悉,我也对软件工程中的软件设计和架构有了进一步的理解。总之,通过本次报告,我受益匪浅。
|
||||
\end{document}
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
\documentclass[a4paper,12pt,UTF8,titlepage]{ctexart}
|
||||
|
||||
%页边距
|
||||
\usepackage{geometry}
|
||||
\geometry{left=2.0cm,right=2.0cm,top=2.5cm,bottom=2.5cm}
|
||||
|
||||
%页眉
|
||||
\usepackage{fancyhdr}
|
||||
\pagestyle{fancy}
|
||||
\lhead{李志星 15060025 }
|
||||
\chead{KNN在Spark上的实现}
|
||||
\rhead{\leftmark}
|
||||
|
||||
%文档信息/同时也用于生成报告封面
|
||||
\author{李志星\\ 15060025}
|
||||
\title{\Huge KNN在Spark上的实现}
|
||||
|
||||
|
||||
\usepackage{graphicx}
|
||||
\usepackage{subfigure}
|
||||
\DeclareGraphicsExtensions{.eps,.ps,.jpg,.bmp,.gif,.png}
|
||||
|
||||
\usepackage{pythonhighlight}
|
||||
|
||||
|
||||
\begin{document}
|
||||
\maketitle
|
||||
|
||||
\section{实验内容}
|
||||
Spark MLlib实现了常用的机器学习算法,包括Logistic回归、决策树、随机森林、K-menas等。和我了解到的机器学习算法相比,分类算法中的KNN算法Saprk MLlib并没有实现,因此本次实验我在Spark平台实现KNN算法。
|
||||
\subsection{KNN}
|
||||
k-近邻(kNN,k-Nearest Neighbors)算法是一种基于实例的分类方法。该方法就是找出与未知样本x距离最近的k个训练样本,看这k个样本中多数属于哪一类,就把x归为那一类。k-近邻方法是一种懒惰学习方法,它存放样本,直到需要分类时才进行分类,如果样本集比较复杂,可能会导致很大的计算开销,因此无法应用到实时性很强的场合。
|
||||
\section{实验过程}
|
||||
|
||||
\section{实验结果}
|
||||
|
||||
\section{实验总结}
|
||||
|
||||
1. api使用不熟悉,比如dataframe,vector的数据类型,得利用输出多次测试,才晓得咋使用。
|
||||
\end{document}
|
Loading…
Reference in New Issue