机器学习之KNN算法

来源:互联网 发布:淘宝要交保证金吗2017 编辑:程序博客网 时间:2024/04/29 09:32

在几位志同道合的小伙伴的带领下,开始了机器学习的路程,然而一切并不是想象的那么简单,因此本文记录了自己的学习路程,希望还能坚持做好这件事。
KNN算法是机器学习中属于比较简单的算法,容易理解和阅读。

1.KNN的应用
客户流失预测、欺诈侦测等(更适合于稀有事件的分类问题)

2.优缺点
- 优点:这是一个简单有效的算法,易于理解,易于实现;
- 缺点:必须保存全部数据集,如果训练集过大,消耗大量的存储空间,对每个数据计算距离值,实际使用很耗时。

3.距离计算方式
-欧式距离
-夹角余弦(适合文本分析)
-曼哈顿距离
-切比雪夫距离

4.算法实现
对未知类别属性的数据集中的每个点依次执行以下操作:
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的走个点;
(4)确定前灸个点所在类别的出现频率;
(5)返回前女个点出现频率最高的类别作为当前点的预测分类。


一个简单的例子,用Python语言实现KNN算法,数据与后面将要写的其他算法使用一样的数据。

训练数据

Tid House   Marriage    Income  Borrower1   Yes Single  125K    No2   No  Married 100K    No3   No  Single  70K No4   Yes Married 120K    No5   No  Divorced    95K Yes6   No  Married 60K No7   Yes Divorced    220K    No8   No  Single  85K Yes9   No  Married 75K No10  No  Single  90K Yes

测试数据

Tid House   Marriage    IncomeTest    No  Married 120K

准备数据

def loadDataSet_train(path_read):    df = pd.read_csv(path_read, sep='\t', header=0, dtype=str, na_filter=False)    group = np.array(np.matrix(df[['House','Marriage','Income']]))    label = np.array(np.matrix(df["Borrower"]))    y = np.zeros(group.shape)    y[group=='Yes']=1    y[group=='Married']=1    y[group=='Divorced']=2    for i in group[:,2]:        y[group==i]=i[0:-1]        #print(i[0:-1])    labels=['No', 'No', 'No', 'No', 'Yes', 'No', 'No', 'Yes', 'No', 'Yes']    return y,labelsdef loadDataSet_test(path):    df = pd.read_csv(path, sep='\t', header=0, dtype=str, na_filter=False)    group = np.array(np.matrix(df[['House','Marriage','Income']]))    return group

数据分类,参考机器学习代码

def classify(inx,dataSet,label,k):    dataSetSize = dataSet.shape[0]    diffMat = np.tile(inx, (dataSetSize,1)) - dataSet    sqDiffMat = diffMat ** 2    sqDistance = sqDiffMat.sum(axis=1)    distance = sqDistance ** 0.5    sortedDistIndicies = distance.argsort()    classCount={}    for i in range(k):        voteIlabel = label[sortedDistIndicies[i]]        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)    return sortedClassCount[0][0]

选取不同的k值发现对结果的影响还是很大的,训练数据毕竟很少。这只是方便理解算法,简单的实现,后面还会继续学习机器学习其他的算法,代码尝试着自己写一写,之前没使用过Python语言,也对机器学习了解甚少,只在研究生阶段开始学习,代码以及其他地方不及之处,希望大家多多交流。


1 0
原创粉丝点击