在几位志同道合的小伙伴的带领下,开始了机器学习的路程,然而一切并不是想象的那么简单,因此本文记录了自己的学习路程,希望还能坚持做好这件事。
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语言,也对机器学习了解甚少,只在研究生阶段开始学习,代码以及其他地方不及之处,希望大家多多交流。