knn code is done

This commit is contained in:
StarLee 2016-06-22 13:27:27 +08:00
parent 4a8006ea0e
commit b4026d37cf
3 changed files with 106 additions and 2 deletions

63
KNN.py Normal file
View File

@ -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)

View File

@ -70,7 +70,7 @@ tabsize=3
手写识别Handwriting recognition是计算机在纸、照片、触摸屏或其他设备中接收并识别人手写的文字等信息的技术主要应用于光学字符识别OCR。手写识别系统能够用来识别汉字、英语、数字等字符。不过本报告的重点不在手写识别而在于理解MLlib中的机器学习算法因此以识别数字为例。识别数字09是个十类别问题分类算法中最常用的场景是二分类如果要用二分类解决这个问题要采用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}

View File

@ -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-近邻(kNNk-Nearest Neighbors)算法是一种基于实例的分类方法。该方法就是找出与未知样本x距离最近的k个训练样本看这k个样本中多数属于哪一类就把x归为那一类。k-近邻方法是一种懒惰学习方法,它存放样本,直到需要分类时才进行分类,如果样本集比较复杂,可能会导致很大的计算开销,因此无法应用到实时性很强的场合。
\section{实验过程}
\section{实验结果}
\section{实验总结}
1. api使用不熟悉比如dataframevector的数据类型得利用输出多次测试才晓得咋使用。
\end{document}