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

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

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

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

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


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

训练数据

Tid House   Marriage    Income  Borrower
1   Yes Single  125K    No
2   No  Married 100K    No
3   No  Single  70K No
4   Yes Married 120K    No
5   No  Divorced    95K Yes
6   No  Married 60K No
7   Yes Divorced    220K    No
8   No  Single  85K Yes
9   No  Married 75K No
10  No  Single  90K Yes

测试数据

Tid House   Marriage    Income
Test    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,labels

def 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语言,也对机器学习了解甚少,只在研究生阶段开始学习,代码以及其他地方不及之处,希望大家多多交流。